import json import logging import sys from typing import Any, Dict class JsonFormatter(logging.Formatter): """统一 JSON 日志,方便跨服务链路排查""" def format(self, record: logging.LogRecord) -> str: # type: ignore[override] log: Dict[str, Any] = { "ts": self.formatTime(record, datefmt="%Y-%m-%dT%H:%M:%S%z"), "level": record.levelname, "logger": record.name, "message": record.getMessage(), } if record.exc_info: log["exc_info"] = self.formatException(record.exc_info) for key, value in getattr(record, "extra", {}).items(): log[key] = value return json.dumps(log, ensure_ascii=False) def setup_logging(level: str = "INFO") -> None: handler = logging.StreamHandler(sys.stdout) handler.setFormatter(JsonFormatter()) logging.basicConfig(handlers=[handler], level=level, force=True)