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

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 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