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

Liu*_*Sha 16 python logging

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

资源

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')
Run Code Online (Sandbox Code Playgroud)

产量

debug True
info True
warning True
error True
warning
error
DEBUG:root:debug
INFO:root:info
WARNING:root:warning
ERROR:root:error
Run Code Online (Sandbox Code Playgroud)

特别

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

  2. 既然如此,那logger.isEnabledFor(logging.DEBUG)就是True虽然logger.debug('debug')没有显示任何东西

  3. 怎么logger.info没有输出logging.info却有

Are*_* Ou 8

一些要澄清的事情:

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

    >>> import logging
    >>> logging.root.handlers
    []
    
    Run Code Online (Sandbox Code Playgroud)

好的,但您发现了问题:当记录级别设置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
Run Code Online (Sandbox Code Playgroud)

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

对于你的问题:

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

    Logger.isEnabledFor(LVL)

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

  3. 调用logging模块中的任何日志记录函数将初始化根记录器,basicConfig()并使用该记录器添加默认处理程序,以便后续调用logger也可以.

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