每个进程一个日志文件,防止多进程写一个文件锁死
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user