Spaces:
Running
Running
File size: 2,042 Bytes
bbe01fe | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import json
import logging
from datetime import datetime
from typing import Any
from app.core.config import get_settings
class JsonFormatter(logging.Formatter):
def format(self, record: logging.LogRecord) -> str:
log_entry: dict[str, Any] = {
"timestamp": datetime.fromtimestamp(record.created).isoformat() + "Z",
"level": record.levelname,
"module": record.module,
"message": record.getMessage(),
}
# Add extra fields if they exist, ignoring some standard ones
extra: dict[str, Any] = {}
for key, value in record.__dict__.items():
if key not in [
"args",
"asctime",
"created",
"exc_info",
"exc_text",
"filename",
"funcName",
"id",
"levelname",
"levelno",
"lineno",
"module",
"msecs",
"message",
"msg",
"name",
"pathname",
"process",
"processName",
"relativeCreated",
"stack_info",
"thread",
"threadName",
]:
extra[key] = value
if extra:
log_entry["extra"] = extra
if record.exc_info:
log_entry["exc_info"] = self.formatException(record.exc_info)
return json.dumps(log_entry)
def get_logger(name: str) -> logging.Logger:
settings = get_settings()
logger = logging.getLogger(name)
# Avoid adding duplicate handlers
if not logger.handlers:
logger.setLevel(settings.LOG_LEVEL.upper())
handler = logging.StreamHandler()
handler.setFormatter(JsonFormatter())
logger.addHandler(handler)
# Don't propagate to the root logger to avoid duplicate log lines
logger.propagate = False
return logger
|