记录setLevel,它是如何工作的

joa*_*uin 34 python logging

日志记录文档中有以下示例:

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)
Run Code Online (Sandbox Code Playgroud)

为什么我应该将级别设置为logging.DEBUG两次,for Logger和for StreamHandler

据我所知,ch.setLevel(logging.DEBUG)将设置流处理程序的调试级别.但是将记录器设置为水平的效果是什么?这个水平反映在哪里?

我得到同样的控制台输出,如果我改变等级,例如,INFO无论对Logger或到StreamHandler.

那是:

...........
logger.setLevel(logging.INFO)
............
ch.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

在控制台中提供相同的输出

...........
logger.setLevel(logging.DEBUG)
............
ch.setLevel(logging.INFO)
Run Code Online (Sandbox Code Playgroud)

Cat*_*lus 39

它可用于微调(你可以有多个处理程序,每个都可以设置不同的级别) - 你可以安全地不在处理程序上设置级别,这将导致它处理所有消息(也就是NOTSET级别),并保留级别过滤到记录器.

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


Ank*_*wal 5

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

这在文档中指出:

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

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