import logging import sys from pathlib import Path from logging.handlers import TimedRotatingFileHandler from middleware.trace import get_trace_id # 确保日志目录存在 LOG_DIR = Path(__file__).parent.parent / "logs" LOG_DIR.mkdir(exist_ok=True) # 自定义日志格式类 class TraceFormatter(logging.Formatter): def format(self, record): # 获取当前的 trace_id trace_id = get_trace_id() # 在日志消息中添加 trace_id if trace_id: record.msg = f"[trace_id={trace_id}] {record.msg}" return super().format(record) # 配置日志记录器 logger = logging.getLogger("backend") logger.setLevel(logging.INFO) # 创建按日期分片的文件处理器 # 每天午夜轮换,保留 30 天的日志 file_handler = TimedRotatingFileHandler( LOG_DIR / "backend.log", when="midnight", interval=1, backupCount=30, encoding="utf-8" ) file_handler.setLevel(logging.INFO) file_handler.suffix = "%Y-%m-%d.log" # 创建控制台处理器 console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) # 定义日志格式 formatter = TraceFormatter( '%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(funcName)s:%(lineno)d - %(message)s' ) file_handler.setFormatter(formatter) console_handler.setFormatter(formatter) # 添加处理器到记录器 if not logger.handlers: logger.addHandler(file_handler) logger.addHandler(console_handler) # 导出logger __all__ = ["logger"]