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

Python logging疑问:为何logger.warning首次输出1次后续输出2次

Python logging重复打印问题解析

问题重现

代码示例:

import logging

logger = logging.getLogger(__name__)
logger.addHandler(logging.StreamHandler())
logger.warning("A") # 打印1条消息
logging.warning("A") # 打印1条消息
logger.warning("A") # 打印2条消息??

核心原因

这是logging模块的层级传播机制和自动初始化根logger导致的:

  1. 首次调用logger.warning("A")时,你手动给自定义logger(__name__对应的子logger)加了一个StreamHandler,但此时根logger还没被初始化,没有任何handler,所以只有你加的handler工作,输出1条消息。
  2. 当调用logging.warning("A")时,这个函数本质是调用根logger的warning方法。因为根logger还没被配置,Python会自动给它添加一个默认的StreamHandler,所以这次输出1条消息。
  3. 此时再调用logger.warning("A"),子logger的默认行为是将日志消息向上传播给父logger(也就是根logger)。现在子logger自己有一个handler,根logger也有一个handler,两个handler都会处理这条消息,所以就打印了2条。

解决办法

  • 关闭子logger的传播:给自定义logger加上logger.propagate = False,这样消息不会传给根logger的handler,后续调用只会触发子logger自己的handler。
  • 统一配置根logger:提前用logging.basicConfig()配置根logger的handler、格式等,子logger会自动继承这些配置,不用手动给子logger加handler。
  • 避免重复添加handler:如果必须手动给子logger加handler,确保根logger不会被自动初始化(比如提前调用logging.basicConfig(handlers=[])禁用默认handler)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:57:14