logging.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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 ReadableFormatter(logging.Formatter):
  8. def format(self, record: logging.LogRecord) -> str:
  9. # 将时间格式化为本地时间
  10. local_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  11. request_id = request_id_var.get("-")
  12. message = record.getMessage()
  13. # 构建基础日志信息
  14. if record.levelname == "INFO":
  15. # INFO级别: [INFO] timestamp message (request_id)
  16. log_msg = f"[{record.levelname}] {local_time} {message}"
  17. if request_id != "-":
  18. log_msg += f" ({request_id})"
  19. else:
  20. # 非INFO级别: [LEVEL] timestamp message module function line (request_id)
  21. log_msg = f"[{record.levelname}] {local_time} {message} {record.module} {record.funcName} {record.lineno}"
  22. if request_id != "-":
  23. log_msg += f" ({request_id})"
  24. # 如果有异常信息,追加到日志后面
  25. if record.exc_info and record.exc_info[0] is not None:
  26. log_msg += "\n" + self.formatException(record.exc_info)
  27. return log_msg
  28. def get_logger(name: str) -> logging.Logger:
  29. from core.config import settings
  30. logger = logging.getLogger(name)
  31. if not logger.handlers:
  32. handler = logging.StreamHandler(sys.stdout)
  33. handler.setFormatter(ReadableFormatter())
  34. logger.addHandler(handler)
  35. logger.setLevel(getattr(logging, settings.log_level, logging.INFO))
  36. logger.propagate = False
  37. return logger