日志记录模块怪异,错误显示日志消息?

时间:2019-05-28 14:46:34

标签: python python-logging

这是一个关于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上设置了级别赋予了显示权 通过处理程序,但是我不清楚。

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

1 个答案:

答案 0 :(得分: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进行任何认真的配置,它可以让您指定处理程序,格式化程序,水平等您认为合适的东西。还要注意,一个记录器实际上有一个处理程序列表(不是一个处理程序),并且多个记录器可以使用相同的处理程序,因此谁记录什么(和哪里)取决于记录器和处理程序级别的组合(以及记录器的{ {1}}选项)。

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