| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- import logging
- import json
- import sys
- from contextvars import ContextVar
- from datetime import datetime, timezone
- request_id_var: ContextVar[str] = ContextVar("request_id", default="-")
- class ReadableFormatter(logging.Formatter):
- def format(self, record: logging.LogRecord) -> str:
- # 将时间格式化为本地时间
- local_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
- request_id = request_id_var.get("-")
- message = record.getMessage()
- # 构建基础日志信息
- if record.levelname == "INFO":
- # INFO级别: [INFO] timestamp message (request_id)
- log_msg = f"[{record.levelname}] {local_time} {message}"
- if request_id != "-":
- log_msg += f" ({request_id})"
- else:
- # 非INFO级别: [LEVEL] timestamp message module function line (request_id)
- log_msg = f"[{record.levelname}] {local_time} {message} {record.module} {record.funcName} {record.lineno}"
- if request_id != "-":
- log_msg += f" ({request_id})"
- # 如果有异常信息,追加到日志后面
- if record.exc_info and record.exc_info[0] is not None:
- log_msg += "\n" + self.formatException(record.exc_info)
- return log_msg
- def get_logger(name: str) -> logging.Logger:
- from core.config import settings
- logger = logging.getLogger(name)
- if not logger.handlers:
- handler = logging.StreamHandler(sys.stdout)
- handler.setFormatter(ReadableFormatter())
- logger.addHandler(handler)
- logger.setLevel(getattr(logging, settings.log_level, logging.INFO))
- logger.propagate = False
- return logger
|