logging.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import logging
  2. import json
  3. import sys
  4. from contextvars import ContextVar
  5. from datetime import datetime, timezone
  6. request_id_var: ContextVar[str] = ContextVar("request_id", default="-")
  7. class JSONFormatter(logging.Formatter):
  8. def format(self, record: logging.LogRecord) -> str:
  9. log_data = {
  10. "timestamp": datetime.now(timezone.utc).isoformat(),
  11. "level": record.levelname,
  12. "module": record.module,
  13. "function": record.funcName,
  14. "line": record.lineno,
  15. "message": record.getMessage(),
  16. "request_id": request_id_var.get("-"),
  17. }
  18. if record.exc_info and record.exc_info[0] is not None:
  19. log_data["exception"] = self.formatException(record.exc_info)
  20. if hasattr(record, "extra_data"):
  21. log_data["extra"] = record.extra_data
  22. return json.dumps(log_data, ensure_ascii=False)
  23. def get_logger(name: str) -> logging.Logger:
  24. from core.config import settings
  25. logger = logging.getLogger(name)
  26. if not logger.handlers:
  27. handler = logging.StreamHandler(sys.stdout)
  28. handler.setFormatter(JSONFormatter())
  29. logger.addHandler(handler)
  30. logger.setLevel(getattr(logging, settings.log_level, logging.INFO))
  31. logger.propagate = False
  32. return logger