【问题标题】:Duplicate logs when calling logging.basicConfig调用 logging.basicConfig 时重复日志
【发布时间】:2021-09-03 11:38:47
【问题描述】:

问题:当我调用 logging.basicConfig 除了配置我自己的记录器,我得到重复的日志

  • 我正在运行 python 3.6.8
  • 简单的解决方法是不调用 logging.basicConfig - 但是,我正在导入调用它的模块
  • 我不明白为什么要复制日志。我检查了记录器上的处理程序数量,只有一个处理程序

重现问题的代码

import logging
import sys

# create a logger, add a handler and a formatter
log = logging.getLogger(__name__)
log.setLevel(logging.INFO)
handler = logging.StreamHandler(stream=sys.stdout)
handler.setFormatter(logging.Formatter("%(levelname)s:%(name)s:%(message)s"))
log.addHandler(handler)

# call basicConfig
logging.basicConfig(level=logging.INFO) # logs not duplicated if this line is removed

# create a log message
log.info("hello world")

# verify the number of handlers on the logger
print(f" num_handlers = {len(log.handlers)}")

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#INFO:__main__:hello world
#INFO:__main__:hello world
#num_handlers = 1

【问题讨论】:

    标签: python-3.6 python-logging


    【解决方案1】:

    Python 记录器存在于层次结构中。有一个根记录器(可通过root = logging.getLogger() 访问),它始终位于层次结构的根/顶部,并在调用basicConfig 时进行配置。每个其他记录器都将其日志向上传播,因此每个日志最终都会到达根记录器(更准确地说:根记录器处理程序)。

    一种可能的解决方案是停止记录器的传播:

    log = logging.getLogger(__name__)
    log.propagate = False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-28
      • 2020-08-08
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多