我创建了以下脚本。你有没有人向我解释为什么输出就像下面显示的那样
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.debug('debug')
是怎样的
为什么logger.info
没有输出但logging.info
有
答案 0 :(得分:8)
要澄清一些事项:
WARNING
如果您不执行任何操作,即没有设置任何处理程序或格式化程序,则不会初始化根记录器:
>>> import logging
>>> logging.root.handlers
[]
好的,但您发现了问题:当日志级别设置为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
进行初始化。同时,调试消息不具有此备份,因此在未设置处理程序时将忽略它们。
对于你的问题:
getLogger()
没有收到参数时会返回根记录器。Logger.isEnabledFor(LVL)
指示严重性为lvl的消息是否会发生 由此记录器处理。此方法首先检查模块级别 由logging.disable(lvl)设置的级别,然后记录器的有效 由getEffectiveLevel()确定的级别。
logging
模块中的任何日志记录功能将使用basicConfig()
初始化根记录器,这会添加一个默认处理程序,以便logger
上的后续调用也可以正常工作。您应该做的是,使用logging.basicConfig()
为根记录器设置默认处理程序,并根据记录器级别和消息级别输出消息。
答案 1 :(得分:1)
name
, getLogger将创建Logger类的实例。否则返回root logger。所以在这种情况下,程序使用通用记录器作为函数logging.debug
,logging.info
,logging.warning
,logging.info