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

为何logger.error日志重复输出?与logger.debug输出差异解析

问题原因解析

先看你的代码和对应输出:

代码片段:

import logging

# Create a logger
logger = logging.getLogger("lxy_logger")
logger.setLevel(logging.DEBUG)

console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

logger.addHandler(console_handler)

# Log messages
logger.debug('This is a debug message')
logging.warning('This is a warning message') 
logger.error('This is another debug message')

输出结果:

This is a debug message
WARNING:root:This is a warning message
This is another debug message
ERROR:lxy_logger:This is another debug message

核心原因:日志传播机制与根日志器的自动初始化

  • 日志传播默认开启:Python日志器采用层级结构,自定义日志器(如lxy_logger)的父级是根日志器(root)。默认情况下,子日志器的消息会自动传播到所有父级日志器的处理器(handler)。
  • 根日志器延迟初始化:
    • 第一次调用logger.debug()时,根日志器尚未初始化(没有绑定任何处理器),所以即使消息传播到根日志器,也没有输出渠道,仅lxy_logger自己的处理器输出了一次内容。
    • 调用logging.warning()时,该函数直接操作根日志器,触发根日志器的自动初始化:系统会为它添加一个默认的StreamHandler,并使用包含级别、日志器名称的默认格式。
  • error消息重复输出的触发:
    调用logger.error()时,首先lxy_logger自身的处理器输出无格式的消息;接着由于传播机制开启,这条消息会传递给已初始化的根日志器,根日志器用默认格式再输出一次,最终导致重复内容。

解决方法(可选)

如果不想让自定义日志器的消息传播到根日志器,只需关闭传播开关:

logger.propagate = False

添加该行代码后,logger.error()只会输出一次,根日志器不会再处理这条消息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:43:13