0

这是一个我觉得这个logging模块很奇怪的小例子:

import logging
logging.basicConfig()

#
# making a hierarchy like this:
#     root
#       |- session
#             |-session.foo
#
root_logger = logging.getLogger()
session_logger = logging.getLogger("session")
foo_logger = logging.getLogger("session.foo")
#
# root_logger and session_logger effective log levels
# are set to 30 (= WARNING)
#
foo_logger.debug("WA") #nothing is printed, so far so good
#
# and now enters the problem...
#
foo_logger.setLevel(logging.DEBUG)
foo_logger.debug("HELLO") #HELLO log message is printed!!!

我不明白为什么要打印'HELLO'日志消息,据我了解,因为没有附加到记录器foo_logger的处理程序,日志消息应该冒泡,并被更高级别的记录器(session)有效地停止,因为它的级别设置为WARNING(默认)。

似乎将级别设置为foo_logger赋予它通过处理程序显示的权利,但我不清楚。

有人可以向我解释为什么要打印该消息吗?我应该怎么做才能拥有我想要的记录器层次结构?

4

1 回答 1

1

记录器和处理程序都有一个level设置,处理程序的默认级别是0. 您需要设置父处理程序的级别 - 在root_logger.handlers[0]上面的情况下logging.DEBUG过滤掉debug()调用foo_logger

root_logger.handlers[0].level = logging.WARN
foo_logger.debug("peekaboo") # should not be printed

请注意,logging.basicConfig()只做一个非常简单的配置 - 它主要是作为一种开始记录的方式,对于您想要的任何严肃的配置dictConfig,它允许您指定您认为合适的处理程序、格式化程序、级别等。还要注意,一个记录器实际上有一个处理程序列表(不是一个),并且多个记录器可以使用同一个处理程序,所以谁记录什么(和在哪里)取决于记录器和处理程序级别的组合(以及记录器的propagate选项也)。

作为一个实际的例子,在我当前的(django)项目中,我们(除其他外)有一个“控制台”处理程序(记录到标准输出,gunicorn 重定向到它自己的日志文件),其级别设置为 INFO 和一个“通知”处理程序(发送电子邮件通知),级别设置为 WARN,以便我们的一些记录器(那些用于最敏感部分的记录器)将 INFO 及以上消息发送到 gunicorn 的日志并将 WARN 消息及以上消息也作为通知电子邮件发送。

于 2019-05-28T15:10:38.780 回答