You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多模块使用含时间戳日志文件导致重复创建问题求助

解决方案

要解决多模块导入时生成多个带时间戳日志文件的问题,核心是确保日志配置只执行一次,且时间戳仅在首次初始化时生成。以下是两种可行的实现方式:

方式一:通过模块级变量复用Logger

利用Python模块的单例特性(模块仅在首次导入时加载),在base_logger.py中维护一个全局Logger实例,时间戳在模块加载时生成:

import logging
from datetime import datetime

# 模块级变量:存储已初始化的Logger和首次初始化时间戳
_global_logger = None
_init_timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")

def get_logger():
    global _global_logger
    # 若Logger已初始化,直接返回
    if _global_logger is not None:
        return _global_logger
    
    # 初始化Logger
    logger = logging.getLogger("app")
    logger.setLevel(logging.INFO)
    
    # 避免重复添加Handler(防止其他地方重复配置同一Logger)
    if logger.handlers:
        _global_logger = logger
        return _global_logger
    
    # 使用首次初始化的时间戳生成日志文件名
    log_filename = f"app-INFO-{_init_timestamp}.log"
    
    # 配置文件Handler和格式
    file_handler = logging.FileHandler(log_filename)
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    file_handler.setFormatter(formatter)
    
    logger.addHandler(file_handler)
    _global_logger = logger
    return logger

方式二:模块加载时直接完成配置

更简洁的写法:在模块加载阶段就完成日志配置,后续所有模块直接复用已配置好的Logger:

import logging
from datetime import datetime

# 模块加载时生成时间戳并配置日志
_init_timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
log_filename = f"app-INFO-{_init_timestamp}.log"

# 创建并配置Logger
logger = logging.getLogger("app")
logger.setLevel(logging.INFO)

# 仅在无Handler时添加(避免重复配置)
if not logger.handlers:
    file_handler = logging.FileHandler(log_filename)
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)

def get_logger():
    return logger

关键说明

  • Python模块是单例的:base_logger.py仅在第一个导入它的模块中执行一次初始化代码,后续导入只会复用已加载的模块内容,因此时间戳只会生成一次。
  • 避免重复Handler:检查logger.handlers可以防止其他地方通过logging.getLogger("app")重复添加Handler,导致日志重复输出。
  • 原全局变量方案失效原因:若你之前将initialised定义在函数内部或未正确使用global关键字,会导致每次调用get_logger时重置状态;而模块级变量不存在这个问题。

内容的提问来源于stack exchange,提问作者AlexP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:10:04