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

时间:2017-10-12 02:17:35

标签: 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')

输出

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)没有显示任何内容时,True logger.debug('debug')是怎样的

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

2 个答案:

答案 0 :(得分:8)

要澄清一些事项:

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

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

    请记住,我们现在没有任何root logger处理程序。但是看看code,我们确实看到了:

        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上的后续调用也可以正常工作。
    4. 您应该做的是,使用logging.basicConfig()为根记录器设置默认处理程序,并根据记录器级别和消息级别输出消息。

答案 1 :(得分:1)

如果添加了参数name

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