Python 记录setLevel,它是如何工作的

Python 记录setLevel,它是如何工作的,python,logging,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 forma

在示例中,有以下示例:

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
两次,对于
Logger
,对于
StreamHandler

我知道
ch.setLevel(logging.DEBUG)
将为流处理程序设置调试级别。但是,将液位设置为记录器的效果如何?这一水平反映在哪里

如果将级别更改为,例如,
INFO
Logger
StreamHandler
,则会获得相同的控制台输出

即:

...........
logger.setLevel(logging.INFO)
............
ch.setLevel(logging.DEBUG)
在控制台中提供的输出与

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

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


Logger也是第一个根据级别过滤消息的人-如果您将Logger设置为INFO,并将所有处理程序设置为DEBUG,您仍然不会收到处理程序上的调试消息-它们将被Logger本身拒绝。如果你设置了记录器去调试,但是所有的处理程序都是信息,你也不会收到任何调试消息——因为当记录器说“OK,处理这个”时,处理程序就会拒绝它(调试<信息)。
  • 您可以构建记录器对象的层次结构。他们每个人都会 最初没有级别集(级别NOTSET)。有效水平 Logger对象是层次结构中设置的第一级 在到达根记录器的过程中(如果未设置任何级别,则可能未设置 设置)

  • 记录器的有效级别仅用于确定是否在消息直接发送到记录器时启动操作

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

要回答您的问题,您不需要在该示例中设置两次。将其设置为“仅在记录器中调试”将足以使直接发送到记录器实例的日志消息能够进入控制台(因为新StreamHandler中的默认级别不是默认设置的,因此它会让所有内容通过)。

为什么我应该将logging.DEBUG设置两次,对于记录器,对于StreamHandler。我知道ch.setLevel(logging.DEBUG)将为流处理程序设置调试级别。但是将液位设置为logger会产生什么影响呢?。该级别在何处反映

文件中指出了这一点:

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

在处理程序下检查: