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