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

自定义Python Logger重复输出及日志级别配置异常问题

Python自定义Logger重复输出及级别配置问题解决

问题原因

重复输出

你遇到的重复日志,是因为Python logging的日志传播机制:自定义logger a 处理完日志后,会把日志传递给它的父级logger(也就是默认的root logger)。而root logger默认自带一个StreamHandler,所以同一条日志会被自定义handler和root的handler各输出一次——第一行是你自定义的格式,第二行是root logger的默认格式。

移除logger.setLevel后无输出

logger默认继承父级(root)的日志级别,root logger默认级别是WARNING。哪怕你给handler设置了DEBUG级别,但logger本身会先过滤掉低于WARNING的日志(比如INFO),这些日志根本到不了handler,所以程序完全没输出。

解决方法

1. 关闭日志传播解决重复输出

在添加handler后,关闭自定义logger的传播特性,阻止日志传递给root logger:

logger.addHandler(console_handler)
logger.propagate = False  # 新增这行,关闭传播

2. 保留logger级别配置确保日志能输出

必须保留logger.setLevel(logging.DEBUG),它负责控制logger允许通过的最低日志级别,只有通过logger过滤的日志,才会传到handler再做二次过滤。如果不想用DEBUG,也可以根据需求设为INFO/WARNING等,但必须显式设置,避免继承root的高级别导致低级别日志被过滤。

修改后的完整代码片段

...
args = parser.parse_args()

if args.log:
    # Create custom logger
    logger = logging.getLogger('a')
    logger.setLevel(logging.DEBUG)
    # Create handler
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    # Create formatter and add it to handler
    console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
    console_handler.setFormatter(console_formatter)
    # Add handler to logger
    logger.addHandler(console_handler)
    logger.propagate = False  # 关闭日志传播,解决重复输出

    try:
        ...
    except IndexError as ie:
        logger.info(f'Test')
        ...
    except Exception as ex:
        logger.error(f'Exception: {ex}')

修改后输出就只会有一行自定义格式的日志:

2022-07-11 11:29:59,409 - INFO - Test

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:18:27