【问题标题】:logging setLevel, how it works记录 setLevel,它是如何工作的
【发布时间】:2011-09-30 15:23:26
【问题描述】:

logging howto documentation中有这个例子:

import logging

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

为什么我要将级别设置为logging.DEBUG 两次,分别是LoggerStreamHandler

我了解ch.setLevel(logging.DEBUG) 将为流处理程序设置调试级别。但是将级别设置为记录器的效果是什么?这个层次体现在哪里?

如果我将级别更改为INFOLoggerStreamHandler,我会得到相同的控制台输出。

即:

...........
logger.setLevel(logging.INFO)
............
ch.setLevel(logging.DEBUG)

在控制台中提供与

相同的输出
...........
logger.setLevel(logging.DEBUG)
............
ch.setLevel(logging.INFO)

【问题讨论】:

    标签: python logging


    【解决方案1】:

    它用于微调(您可以有多个处理程序,并且每个处理程序可以设置不同的级别) - 您可以安全地不在处理程序上设置级别,这将导致它处理所有消息(也称为 NOTSET 级别),并且将级别过滤留给记录器。

    Logger 也是第一个根据级别过滤消息的工具——如果你将 logger 设置为 INFO,所有处理程序都设置为 DEBUG,你仍然不会在处理程序上收到 DEBUG 消息——它们将被 logger 拒绝本身。如果您将 logger 设置为 DEBUG,但将所有处理程序设置为 INFO,您也不会收到任何 DEBUG 消息 - 因为当 logger 说“好的,处理这个”时,处理程序拒绝它(DEBUG

    【讨论】:

      【解决方案2】:

      为什么我应该将级别设置为 logging.DEBUG 两次,分别用于记录器和流处理程序。我了解 ch.setLevel(logging.DEBUG) 将为流处理程序设置调试级别。但是将级别设置为记录器的效果是什么?这个层次体现在哪里?

      这在文档中有说明:

      “setLevel() 方法,就像在 logger 对象中一样,指定将被分派到适当目的地的最低严重性。为什么有两个 setLevel() 方法?在 logger 中设置的级别决定了哪个严重性它将传递给其处理程序的消息数量。每个处理程序中设置的级别决定了该处理程序将发送哪些消息。"

      在 Handlers 下查看:http://docs.python.org/2.7/howto/logging.html#logging-advanced-tutorial

      【讨论】:

        【解决方案3】:

        我认为考虑以下三点有助于理解日志记录的工作原理:

        • 您可以构建 Logger 对象的层次结构。他们每个人都会 最初没有级别集(级别 NOTSET)。的有效水平 记录器对象是层次结构中设置的第一层 在到达根记录器的路上(可能是 NOTSET,如果没有级别 设置)。

        • Logger 的有效级别,仅用于确定是否开始操作并直接向该记录器发出消息。

        • 该操作首先是将消息传递给 that Logger 的处理程序, 第二个(取决于 propagate 标志的值),将其传递给祖先链的每个处理程序到顶部,而不考虑每个记录器的实际级别链。

        要回答您的问题,您无需在该示例中设置两次。仅在 Logger 中将其设置为 DEBUG 就足以使直接发送到 Logger 实例的日志消息能够到达控制台(因为默认情况下新 StreamHandler 中的默认级别是 NOTSET,所以它会让一切都通过)。

        【讨论】:

          猜你喜欢
          • 2017-08-23
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多