每个进程一个日志文件,防止多进程写一个文件锁死

This commit is contained in:
zqc
2026-03-03 09:55:24 +08:00
parent e812d7f3e9
commit 908b3876f5

View File

@@ -5,7 +5,9 @@
import logging import logging
import sys import sys
from typing import Optional from typing import Optional
from logging.handlers import TimedRotatingFileHandler from logging.handlers import TimedRotatingFileHandler, RotatingFileHandler
import os
import platform
from config import settings from config import settings
@@ -16,7 +18,7 @@ def setup_logger(
log_file: Optional[str] = None log_file: Optional[str] = None
) -> logging.Logger: ) -> logging.Logger:
""" """
配置和获取logger 配置和获取logger(多进程安全版本)
Args: Args:
name: logger名称 name: logger名称
@@ -55,19 +57,35 @@ def setup_logger(
# 文件handler如果配置了日志文件 # 文件handler如果配置了日志文件
if log_file or settings.LOG_FILE: if log_file or settings.LOG_FILE:
file_path = 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: try:
# 使用进程安全的文件handler
file_handler = TimedRotatingFileHandler( file_handler = TimedRotatingFileHandler(
file_path, unique_file_path,
when='midnight', # 每天午夜轮转 when='midnight', # 每天午夜轮转
interval=1, # 间隔1天 interval=1, # 间隔1天
backupCount=0, # 保留30天的日志 backupCount=0, # 永久保留
encoding='utf-8' encoding='utf-8'
) )
file_handler.setLevel(log_level) file_handler.setLevel(log_level)
file_handler.setFormatter(formatter) file_handler.setFormatter(formatter)
logger.addHandler(file_handler) logger.addHandler(file_handler)
# 记录使用的日志文件路径
logger.info(f"Logger initialized with file: {unique_file_path}")
except Exception as e: except Exception as e:
logger.warning(f"Failed to create log file handler: {e}") logger.warning(f"Failed to create log file handler: {e}")
# 回退到控制台日志
logger.warning("Falling back to console logging only")
return logger return logger