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