问题:logging setLevel,它是如何工作的

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

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)

解答

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

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

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐