繁体   English   中英

即使我将级别设置为INFO,python日志根记录器也不显示信息

[英]python logging root logger does not show info even if I set the level to INFO

我创建了以下脚本。 你们中的任何人都可以向我解释为什么输出如下所示

资源

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

print('debug', logger.isEnabledFor(logging.DEBUG))
print('info', logger.isEnabledFor(logging.INFO))
print('warning', logger.isEnabledFor(logging.WARNING))
print('error', logger.isEnabledFor(logging.ERROR))

logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')

logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')

产量

debug True
info True
warning True
error True
warning
error
DEBUG:root:debug
INFO:root:info
WARNING:root:warning
ERROR:root:error

特别

  1. 这里logger.infologging.info什么区别

  2. 为什么logger.isEnabledFor(logging.DEBUG)Truelogger.isEnabledFor(logging.DEBUG) logger.debug('debug')没有显示任何内容

  3. 为什么logger.info没有输出但logging.info

一些要澄清的事情:

  1. 根记录器的默认日志级别为WARNING
  2. 如果您不执行任何操作,即未设置任何处理程序或格式化程序,则不会初始化根记录器:

     >>> import logging >>> logging.root.handlers [] 

好的,但是您发现了问题:当日志级别设置为DEBUG ,根记录器未按预期工作。 调试消息被忽略。 使用相同的未配置的根记录器,警告消息正常输出。 这是为什么?

请记住,我们现在没有任何root logger处理程序。 但是看一下代码 ,我们看到:

    if (found == 0):
        if lastResort:
            if record.levelno >= lastResort.level:
                lastResort.handle(record)
        elif raiseExceptions and not self.manager.emittedNoHandlerWarning:
            sys.stderr.write("No handlers could be found for logger"
                             " \"%s\"\n" % self.name)
            self.manager.emittedNoHandlerWarning = True

这意味着,如果没有找到处理程序,我们有一个lastResort用于备份。 您可以参考lastResort的定义,它使用日志级别WARNING初始化。 同时,调试消息没有此备份,因此在未设置处理程序时将忽略它们。

对于你的问题:

  1. 这两个记录器是相同的,因为当getLogger()没有接收到参数时会返回根记录器。
  2. 见下文:

    Logger.isEnabledFor(LVL)

    指示此记录器是否将处理严重性为lvl的消息。 此方法首先检查由logging.disable(lvl)设置的模块级别级别,然后检查由getEffectiveLevel()确定的记录器的有效级别。

  3. logging模块中调用任何日志记录函数将使用basicConfig()初始化根记录器,这将添加一个默认处理程序,以便后续对logger调用也将起作用。

您应该做的是,使用logging.basicConfig()为根记录器设置默认处理程序,并根据记录器级别和消息级别输出消息。

如果添加了参数namegetLogger将创建Logger类的实例。 否则返回root logger。 所以在这种情况下,程序使用通用记录器作为函数logging.debuglogging.infologging.warninglogging.info

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM