记录器的“setLevel”与连接到记录器

时间:2018-02-07 15:51:02

标签: python python-3.x logging

我正在尝试理解logger.setLevel的影响与handler.setLevel的影响之间的差异,loggerhandler的创建方式如下:

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 docsetLevel所说的内容:

  

将此记录器的阈值设置为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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

相关问题