[英]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
特别
这里logger.info
和logging.info
什么区别
为什么logger.isEnabledFor(logging.DEBUG)
为True
而logger.isEnabledFor(logging.DEBUG)
logger.debug('debug')
没有显示任何内容
为什么logger.info
没有输出但logging.info
有
一些要澄清的事情:
WARNING
如果您不执行任何操作,即未设置任何处理程序或格式化程序,则不会初始化根记录器:
>>> 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
初始化。 同时,调试消息没有此备份,因此在未设置处理程序时将忽略它们。
对于你的问题:
getLogger()
没有接收到参数时会返回根记录器。 Logger.isEnabledFor(LVL)
指示此记录器是否将处理严重性为lvl的消息。 此方法首先检查由logging.disable(lvl)设置的模块级别级别,然后检查由getEffectiveLevel()确定的记录器的有效级别。
logging
模块中调用任何日志记录函数将使用basicConfig()
初始化根记录器,这将添加一个默认处理程序,以便后续对logger
调用也将起作用。 您应该做的是,使用logging.basicConfig()
为根记录器设置默认处理程序,并根据记录器级别和消息级别输出消息。
如果添加了参数name
, getLogger将创建Logger类的实例。 否则返回root logger。 所以在这种情况下,程序使用通用记录器作为函数logging.debug
, logging.info
, logging.warning
, logging.info
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.