这是一个关于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
上设置了级别赋予了显示权
通过处理程序,但是我不清楚。
有人可以向我解释为什么打印此消息吗? 我应该怎么做才能拥有记录器层次结构?
答案 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消息及以上消息发送为通知电子邮件。