import json import logging import sys from datetime import datetime, timezone from app.core.config import get_settings class JsonFormatter(logging.Formatter): def format(self, record: logging.LogRecord) -> str: payload = { "timestamp": datetime.now(timezone.utc).isoformat(), "level": record.levelname, "logger": record.name, "message": record.getMessage(), } if hasattr(record, "request_id"): payload["request_id"] = record.request_id if record.exc_info: payload["exception"] = self.formatException(record.exc_info) return json.dumps(payload, ensure_ascii=False) def configure_logging() -> None: settings = get_settings() handler = logging.StreamHandler(sys.stdout) handler.setFormatter( JsonFormatter() if settings.log_json else logging.Formatter("%(asctime)s | %(levelname)s | %(name)s | %(message)s") ) root = logging.getLogger() root.handlers.clear() root.addHandler(handler) root.setLevel(settings.log_level.upper())