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

Python配置两个独立日志实例却出现日志重复写入问题如何解决

问题原因
  • 核心问题出在Python logging模块的单例机制:logging.getLogger(name)是按传入的名称全局唯一的,你两个日志类中都传入了相同的名称"Rotating Log",实际拿到的是同一个logger实例。你先后给这个实例绑定了两个对应不同日志文件的handler,所以只要该logger输出日志,两个handler都会触发写操作,自然所有日志会同时写入两个文件。
  • 额外语法问题:你的代码中调用了datetime.today()但没有提前导入datetime模块,运行时会直接抛出导入错误。
修正方案

你只需要给两个日志实例分配不同的唯一名称即可,同时可以简化冗余的重复类定义,优化后的代码如下:

import logging
import datetime
from logging.handlers import TimedRotatingFileHandler

def create_timed_rotating_log(logger_name, log_path):
    # 按不同名称获取独立的logger实例
    logger = logging.getLogger(logger_name)
    # 避免重复导入时重复添加handler,导致单条日志重复写入
    if logger.handlers:
        return logger
    logger.setLevel(logging.INFO)
    handler = TimedRotatingFileHandler(log_path,
                                    when="d",
                                    interval=1,
                                    backupCount=7)
    formatter = logging.Formatter(fmt='%(asctime)s %(levelname)-8s %(message)s',
                              datefmt='%Y-%m-%d %H:%M:%S')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    # 关闭日志向上传递到根logger,避免日志同时输出到控制台或其他根handler
    logger.propagate = False
    return logger

today = datetime.datetime.today()
month = today.strftime("%B")
# 传入不同的logger名称实现隔离
logger = create_timed_rotating_log("op_logger", f'./{month + str(today.year)}Logger.log')
webhook_logger = create_timed_rotating_log("webhook_logger", f'./{month + str(today.year)}WebhookLogger.log')

修改后你原来的entrypoint.py和op_helper.py的引用逻辑不需要改动,日志就会分别写入对应的目标文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:06:06