日志记录模块怪异,日志消息显示错误?
Logging module weirdness, wrong display of log message?
这里有一个小例子,我觉得 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
上设置级别使其有权显示
通过处理程序,但我不太清楚。
有人可以向我解释为什么打印该消息吗?
我应该怎么做才能拥有我想要的记录器层次结构?
记录器和处理程序都有一个 level
设置,处理程序的默认级别是 0
。您需要设置父处理程序的级别 - 在您的情况下 root_logger.handlers[0]
高于 logging.DEBUG
以过滤掉对 foo_logger
:
的 debug()
调用
root_logger.handlers[0].level = logging.WARN
foo_logger.debug("peekaboo") # should not be printed
请注意,logging.basicConfig()
只做一个非常简单的配置 - 它主要是作为开始日志记录的一种方式,对于您想要的任何严肃配置 dictConfig
,它允许您指定处理程序,格式化程序,级别等你认为合适的。另请注意,记录器实际上有一个处理程序列表(不是一个),并且多个记录器可以使用相同的处理程序,因此谁记录什么(和在哪里)取决于记录器和处理程序级别的组合(以及记录器的 propagate
也有选项)。
作为一个实际的例子,在我当前的 (django) 项目中,我们有一个 "console" 处理程序(记录到 stdout,gunicorn 重定向到它自己的日志文件),其级别设置为 INFO和一个级别设置为 WARN 的 "notify" 处理程序(发送电子邮件通知),以便我们的一些记录器(那些用于最敏感部分的记录器)将向 gunicorn 的日志发送 INFO 和以上消息 and 也将 WARN 消息及以上消息作为通知电子邮件发送。
这里有一个小例子,我觉得 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
上设置级别使其有权显示
通过处理程序,但我不太清楚。
有人可以向我解释为什么打印该消息吗? 我应该怎么做才能拥有我想要的记录器层次结构?
记录器和处理程序都有一个 level
设置,处理程序的默认级别是 0
。您需要设置父处理程序的级别 - 在您的情况下 root_logger.handlers[0]
高于 logging.DEBUG
以过滤掉对 foo_logger
:
debug()
调用
root_logger.handlers[0].level = logging.WARN
foo_logger.debug("peekaboo") # should not be printed
请注意,logging.basicConfig()
只做一个非常简单的配置 - 它主要是作为开始日志记录的一种方式,对于您想要的任何严肃配置 dictConfig
,它允许您指定处理程序,格式化程序,级别等你认为合适的。另请注意,记录器实际上有一个处理程序列表(不是一个),并且多个记录器可以使用相同的处理程序,因此谁记录什么(和在哪里)取决于记录器和处理程序级别的组合(以及记录器的 propagate
也有选项)。
作为一个实际的例子,在我当前的 (django) 项目中,我们有一个 "console" 处理程序(记录到 stdout,gunicorn 重定向到它自己的日志文件),其级别设置为 INFO和一个级别设置为 WARN 的 "notify" 处理程序(发送电子邮件通知),以便我们的一些记录器(那些用于最敏感部分的记录器)将向 gunicorn 的日志发送 INFO 和以上消息 and 也将 WARN 消息及以上消息作为通知电子邮件发送。