From 908b3876f59673c3ba3e73a4d4378d9138440d7b Mon Sep 17 00:00:00 2001 From: zqc <835569504@qq.com> Date: Tue, 3 Mar 2026 09:55:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AF=8F=E4=B8=AA=E8=BF=9B=E7=A8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=97=A5=E5=BF=97=E6=96=87=E4=BB=B6=EF=BC=8C=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E5=A4=9A=E8=BF=9B=E7=A8=8B=E5=86=99=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=94=81=E6=AD=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/logger.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) 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