记录setLevel,它是如何工作的

时间:2011-07-07 16:43:34

标签: python logging

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)

3 个答案:

答案 0 :(得分:37)

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

Logger也是第一个根据级别过滤消息的人 - 如果您将记录器设置为INFO,并且所有处理程序都设置为DEBUG,您仍然不会在处理程序上收到DEBUG消息 - 它们将被记录器拒绝本身。如果您将logger设置为DEBUG,但所有处理程序都设置为INFO,则您也不会收到任何DEBUG消息 - 因为当记录器显示“ok,process this”时,处理程序拒绝它(DEBUG< INFO)。

答案 1 :(得分:3)

为什么我要将级别设置为logging.DEBUG两次,对于logger和streamhandler。我理解ch.setLevel(logging.DEBUG)将设置流处理程序的调试级别。但是将记录器的水平设置为什么效果呢?反映这个水平的地方?

这在文档中指出:

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

检查处理程序:http://docs.python.org/2.7/howto/logging.html#logging-advanced-tutorial

答案 2 :(得分:2)

我认为有必要考虑这些主要的三点来理解日志记录的工作原理:

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

  • Logger的有效级别仅用于确定是否开始将消息直接发送到该记录器。

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

要回答您的问题,您不需要在该示例中将其设置两次。仅在Logger中将其设置为DEBUG就足以启用直接发送到Logger实例的日志消息进入控制台(因为默认情况下新的StreamHandler中的默认级别为NOTSET,因此它会让所有内容都通过)。