import json import logging import sys from datetime import datetime, timezone class JSONFormatter(logging.Formatter): def format(self, record: logging.LogRecord) -> str: log_entry = { "timestamp": datetime.now(timezone.utc).isoformat(), "level": record.levelname, "logger": record.name, "message": record.getMessage(), "module": record.module, "function": record.funcName, "line": record.lineno, } if record.exc_info and record.exc_info[1]: log_entry["exception"] = self.formatException(record.exc_info) return json.dumps(log_entry, ensure_ascii=False) def setup_logging(json_format: bool = False, level: int = logging.INFO): root = logging.getLogger() root.setLevel(level) for handler in root.handlers[:]: root.removeHandler(handler) handler = logging.StreamHandler(sys.stdout) if json_format: handler.setFormatter(JSONFormatter()) else: handler.setFormatter(logging.Formatter( "%(asctime)s %(levelname)s [%(name)s] %(message)s" )) root.addHandler(handler) logging.getLogger("uvicorn.access").setLevel(logging.WARNING) logging.getLogger("sqlalchemy.engine").setLevel(logging.WARNING)