【问题标题】:Logging module weirdness, wrong display of log message?日志模块怪异,日志消息显示错误?
【发布时间】:2019-05-28 14:46:34
【问题描述】:

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

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

【问题讨论】:

  • @DaduKhan 抱歉,但它没有帮助,因为您提供的链接与 Python 日志记录无关。我的问题不在于打印,而在于我无法理解记录器的层次结构和规则如何显示或不应用消息
  • foo_logger 已从其父级继承其日志记录级别,然后您覆盖了该级别。
  • @Eqomatic 你能详细说明一下吗? foo_logger 没有处理程序。 .propagate 设置为 True,所以我预计日志消息会冒泡到 session 记录器。并且消息不会显示...
  • foo_logger 也从其父级继承了处理程序,因为 .propogate 设置为 True

标签: python python-logging


【解决方案1】:

记录器和处理程序都有level 设置,处理程序的默认级别是0。您需要设置父处理程序的级别 - 在您的情况下,root_logger.handlers[0] 高于 logging.DEBUG 以过滤掉对 foo_loggerdebug() 调用:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多