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

如何定位并阻止导入模块在控制台重复打印日志?

解决Python日志控制台重复打印问题

问题根源

Python的logging模块在首次输出日志时,会自动为根日志器(logging.getLogger())添加一个默认的StreamHandler,这个handler仅输出日志消息文本,不带格式化信息。而你手动给根日志器又添加了一个自定义的StreamHandler,导致同一条日志被两个handler处理,最终控制台出现重复输出。

解决方案

修改你的get_log()函数,做以下两处调整:

  1. 配置根日志器前清空已有handler,消除默认handler的干扰
  2. 给控制台handler设置格式化器,确保输出统一的格式化日志

修改后的完整代码:

def get_log():
    import logging
    import sys
    from logging.handlers import TimedRotatingFileHandler

    # 获取根日志器
    base_logger = logging.getLogger()
    base_logger.setLevel(logging.DEBUG)
    
    # 清空根日志器所有已有handler,避免默认StreamHandler导致重复
    base_logger.handlers.clear()
    
    # 创建文件handler
    file_handler = TimedRotatingFileHandler(
        'logs/runtime.log', when='midnight', interval=1, backupCount=7, encoding='utf-8'
    )
    file_handler.namer = my_namer
    file_handler.setLevel(logging.DEBUG)
    
    # 创建控制台handler
    console_handler = logging.StreamHandler(stream=sys.stdout)
    console_handler.setLevel(logging.INFO)
    
    # 定义格式化器并绑定到两个handler
    main_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    file_handler.setFormatter(main_format)
    console_handler.setFormatter(main_format)
    
    # 将handler添加到根日志器
    base_logger.addHandler(file_handler)
    base_logger.addHandler(console_handler)

说明

  • 清空根日志器的handlers列表,彻底避免了默认handler和自定义handler重复处理日志的问题
  • 给控制台handler设置格式化器后,控制台只会输出你定义的格式化日志,符合预期
  • 无需设置propagate=False,各模块的日志依然会正常向上传播到根日志器,通过你配置的handler输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:35:30