【问题标题】:The difference between 'setLevel' of a logger and 'setLevel' of a handler connected to the logger记录器的“setLevel”和连接到记录器的处理程序的“setLevel”之间的区别
【发布时间】:2023-03-13 06:20:01
【问题描述】:

我试图掌握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  ')

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

所以我的问题是 - 为什么我们需要不止一个级别?

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

【问题讨论】:

    标签: python python-3.x logging


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好的,但是在这种情况下,设置记录器本身的日志记录级别有什么意义呢?设置每个处理程序的日志级别还不够吗?
    • @goodvibration:当然,除非你有不同的记录器集合。就像第三方库或您自己的大型应用程序中的那些一样。
    • @goodvibration:在一个小脚本或应用程序中,当然,没有什么意义。但该库可以处理更复杂的用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    相关资源
    最近更新 更多