diff --git a/utils/logger.py b/utils/logger.py index e8c4bfb..5f86a07 100644 --- a/utils/logger.py +++ b/utils/logger.py @@ -5,7 +5,9 @@ import logging import sys from typing import Optional -from logging.handlers import TimedRotatingFileHandler +from logging.handlers import TimedRotatingFileHandler, RotatingFileHandler +import os +import platform from config import settings @@ -16,7 +18,7 @@ def setup_logger( log_file: Optional[str] = None ) -> logging.Logger: """ - 配置和获取logger + 配置和获取logger(多进程安全版本) Args: name: logger名称 @@ -55,19 +57,35 @@ def setup_logger( # 文件handler(如果配置了日志文件) if log_file or settings.LOG_FILE: file_path = log_file or settings.LOG_FILE + + # 为每个进程生成唯一的日志文件名(避免文件锁定) + process_id = os.getpid() + process_hash = hash(f"{process_id}_{name}") % 10000 # 简单的hash + + # 生成唯一的日志文件名 + base_name, ext = os.path.splitext(file_path) + unique_file_path = f"{base_name}_{process_hash:04d}{ext}" + try: + # 使用进程安全的文件handler file_handler = TimedRotatingFileHandler( - file_path, + unique_file_path, when='midnight', # 每天午夜轮转 interval=1, # 间隔1天 - backupCount=0, # 保留30天的日志 + backupCount=0, # 永久保留 encoding='utf-8' ) file_handler.setLevel(log_level) file_handler.setFormatter(formatter) logger.addHandler(file_handler) + + # 记录使用的日志文件路径 + logger.info(f"Logger initialized with file: {unique_file_path}") + except Exception as e: logger.warning(f"Failed to create log file handler: {e}") + # 回退到控制台日志 + logger.warning("Falling back to console logging only") return logger