我正在尝试理解logger.setLevel
的影响与handler.setLevel
的影响之间的差异,logger
和handler
的创建方式如下:
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
请注意,handler
已连接到logger
。
以下是official doc对setLevel
所说的内容:
将此记录器的阈值设置为
level
。记录严重程度低于level
的邮件将被忽略;除非处理程序的level
已设置为高于level
的严重性级别,否则将由此记录程序为任何处理程序或处理程序提供服务器发出严重性为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
答案 0 :(得分:1)
您可以将多个处理程序附加到记录器,并且当在层次结构中传播消息时记录器级别很重要。
使用多个处理程序可以将不同的严重性级别指向不同的输出。您可以将WARNING
消息放入控制台INFO
,最好转到系统日志,DEBUG
消息转到特定于应用程序的日志文件。这是在处理程序上设置日志级别的目的,用于配置每个处理程序将独立处理的消息。
记录器级别在层次结构中很重要;所有记录器都是根记录器的子记录器,您可以使用名称中的.
点创建更多级别。然后,您可以选择记录器生成什么级别的输出;设置更严格的日志级别意味着记录器不会处理消息(包括不将其交给父记录器)。
例如,许多第三方库将生成各种级别的日志输出。因此,对于特定的应用程序,查看ERROR
库生成的urllib3
级别消息可能会非常有用,但对于SQLAlchemy,您只想查看WARNING
消息。您只需通过getLogger(name_of_library)
调用为这些库记录器配置级别,以阻止它们将较低级别的消息传播到处理程序通常存在的根记录器。