调用时重复日志 logging.basicConfig

Duplicate logs when calling logging.basicConfig

问题:除了配置我自己的记录器之外,当我调用 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 记录器存在于层次结构中。有一个根记录器(可通过 root = logging.getLogger() 访问),它始终位于层次结构的 root/top,并在调用 basicConfig 时配置。每个其他记录器都将它们的日志传播到层次结构中,因此每个日志最终都会到达根记录器(更准确地说:根记录器处理程序)。

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

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