gpt4 book ai didi

python - 记录器的 'setLevel' 和连接到记录器的处理程序的 'setLevel' 之间的区别

转载 作者:太空宇宙 更新时间:2023-11-03 14:08:52 27 4
gpt4 key购买 nike

我试图了解 logger.setLevel 的影响和 handler.setLevel 的影响之间的区别,其中 logger处理程序创建如下:

import logging

def getLogger(name, loggerLevel, handlerLevel):
formatter = logging.Formatter('%(message)s')

handler = logging.StreamHandler()
handler.setLevel(handlerLevel)
handler.setFormatter(formatter)

logger = logging.getLogger(name)
logger.setLevel(loggerLevel)
logger.addHandler(handler)

return logger

请注意,处理程序已连接到记录器

这是 official doc 的内容关于setLevel说:

Sets the threshold for this logger to level. Logging messages which are less severe than level will be ignored; logging messages which have severity level or higher will be emitted by whichever handler or handlers service this logger, unless a handler’s level has been set to a higher severity level than level.

我不太完全理解这一点,因此我实现了以下脚本来测试所有可能的组合:

for loggerLevel in ['DEBUG', 'INFO', 'WARNING', 'ERROR']:
for handlerLevel in ['DEBUG', 'INFO', 'WARNING', 'ERROR']:
name = loggerLevel + '_' + handlerLevel
print('{}:'.format(name))
logger = getLogger(name,eval('logging.'+loggerLevel),eval('logging.'+handlerLevel))
logger.debug (' debug ')
logger.info (' info ')
logger.warning(' warning')
logger.error (' error ')

输出(见下文)证明了一件事 - 两者中较高的级别是确定行动方案的级别,无论哪个实体被设置为该级别。

所以我的问题是 - 为什么我们一开始就需要多个级别?

DEBUG_DEBUG:
debug
info
warning
error
DEBUG_INFO:
info
warning
error
DEBUG_WARNING:
warning
error
DEBUG_ERROR:
error
INFO_DEBUG:
info
warning
error
INFO_INFO:
info
warning
error
INFO_WARNING:
warning
error
INFO_ERROR:
error
WARNING_DEBUG:
warning
error
WARNING_INFO:
warning
error
WARNING_WARNING:
warning
error
WARNING_ERROR:
error
ERROR_DEBUG:
error
ERROR_INFO:
error
ERROR_WARNING:
error
ERROR_ERROR:
error

最佳答案

您可以将多个处理程序附加到一个记录器,并且在层次结构中传播消息时,记录器级别很重要。

使用多个处理程序可以将不同的严重级别定向到不同的输出。您可以输入WARNING发送到控制台的消息,INFO最好查看系统日志,然后 DEBUG消息转到特定于应用程序的日志文件。这就是在处理程序上设置日志级别的目的,以配置每个处理程序将独立处理哪些消息。

记录器级别在层次结构中很重要;所有记录器都是根记录器的子记录器,您可以使用 . 创建更多级别名字中的点。然后,您可以挑选哪些记录器产生什么级别的输出;设置更严格的日志级别意味着记录器将不会处理消息(包括不将其传递给父记录器)。

例如,许多第三方库会产生不同级别的日志输出。因此,对于特定的应用程序,查看 ERROR 可能会非常有帮助。 urllib3 产生的级别消息库,但对于 SQLAlchemy 你只想看到 WARNING消息。您只需使用 getLogger(name_of_library) 配置这些库记录器的级别即可。调用以阻止它们将较低级别的消息传播到根记录器,处理程序通常驻留在根记录器中。

关于python - 记录器的 'setLevel' 和连接到记录器的处理程序的 'setLevel' 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48667950/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com