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导致的:
- 首次调用
logger.warning("A")时,你手动给自定义logger(__name__对应的子logger)加了一个StreamHandler,但此时根logger还没被初始化,没有任何handler,所以只有你加的handler工作,输出1条消息。 - 当调用
logging.warning("A")时,这个函数本质是调用根logger的warning方法。因为根logger还没被配置,Python会自动给它添加一个默认的StreamHandler,所以这次输出1条消息。 - 此时再调用
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
相关产品推荐
相关产品推荐

