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

Python多线程Logging日志串写问题解决方案咨询

日志串写问题解决方案

问题原因

Python logging 模块的Logger采用单实例模式:多次调用logging.getLogger(name)传入相同名称时,会返回同一个Logger对象。你的config_logger函数每次调用都会给该Logger新增一个FileHandler,导致后续所有日志会输出到所有已添加的Handler对应的文件,这就是串写的根源。

解决方案

1. 配置Logger前清空已有Handler

修改config_logger函数,获取Logger后先清除所有已存在的Handler,避免重复添加:

def config_logger(name, mainlog):
    logger = logging.getLogger(name)
    # 清除已有Handler,防止同一Logger绑定多个文件输出
    if logger.hasHandlers():
        logger.handlers.clear()
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s : %(funcName)s : %(levelname)s --> %(message)s', datefmt='%m/%d/%Y %I:%M:%S%p')
    file_handler = logging.FileHandler(mainlog, 'w')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    return logger

2. 给不同功能的Logger分配唯一名称

在validations和dbstop函数中调用config_logger时,传入不同的名称前缀,确保两个功能的Logger实例完全隔离:

  • 在validations函数内:
    logger = config_logger(f"validation_{db}", 你的验证日志路径)
    
  • 在dbstop函数内:
    logger = config_logger(f"dbstop_{db}", 你的停止日志路径)
    

3. 可选:使用独立Logger实例(进阶)

如果需要更彻底的隔离,可以直接创建logging.Logger的实例而非通过getLogger获取:

def config_logger(name, mainlog):
    # 创建全新的Logger实例,不共享全局单例
    logger = logging.Logger(name)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s : %(funcName)s : %(levelname)s --> %(message)s', datefmt='%m/%d/%Y %I:%M:%S%p')
    file_handler = logging.FileHandler(mainlog, 'w')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    return logger

这种方式完全避免了单例共享的问题,每个调用都会生成独立的Logger,彻底杜绝串写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:45:17