即使我将级别设置为info,python日志根记录器也不会显示info
我创建了以下脚本。你们谁能解释一下为什么输出是如下所示的 来源 输出 具体地即使我将级别设置为info,python日志根记录器也不会显示info,python,logging,Python,Logging,我创建了以下脚本。你们谁能解释一下为什么输出是如下所示的 来源 输出 具体地 这里的logger.info和logging.info有什么区别 为什么logger.isenablefor(logging.DEBUG)是True而logger.DEBUG('DEBUG')没有显示任何内容 为什么logger.info没有输出,而logging.info有输出 如果添加了参数name,则创建Logger类的实例。否则,它将返回根记录器。因此,在本例中,程序将通用记录器用作函数logging.debu
logger.info
和logging.info
有什么区别logger.isenablefor(logging.DEBUG)
是True
而logger.DEBUG('DEBUG')
没有显示任何内容logger.info
没有输出,而logging.info
有输出如果添加了参数
name
,则创建Logger类的实例。否则,它将返回根记录器。因此,在本例中,程序将通用记录器用作函数logging.debug
,logging.info
,logging.warning
,logging.info
,需要澄清以下几点:
警告
>>> import logging
>>> logging.root.handlers
[]
DEBUG
时,根日志记录器未按预期工作。调试消息被忽略。对于相同的未配置根记录器,警告消息输出正常。为什么呢
请记住,我们现在没有根记录器的任何处理程序。但是,通过调查,我们确实看到:
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
的定义,它是用日志级别警告
初始化的。同时,调试消息没有此备份,因此在未设置处理程序时将忽略这些消息
关于您的问题:
getLogger()
没有收到任何参数时,将返回根记录器logging
模块中调用任何日志函数都将使用basicConfig()
初始化根日志记录器,这将添加一个默认处理程序,以便对logger
的后续调用也将起作用您应该做的是,使用
logging.basicConfig()
为根记录器设置默认处理程序,并根据记录器级别和消息级别输出消息。谢谢@Ares Ou。我明白你关于记录器的行为的观点。您还可以解释一下为什么日志记录.debug
在日志记录.debug
和日志记录.debug
是同一件事的情况下起作用。它们都是根日志记录程序
,但是当您调用日志记录.debug
时,调用了基本配置()
,这会产生不同。如果在上面的代码之后调用logger.debug('debug')
,您将看到输出debug:root:debug
,那么您就会理解。您的意思是,如果根记录器尚未初始化,则对logging.log
的任何调用都将使用basicConfig()
初始化根记录器?否!你可以阅读basicConfig()
仅在root
没有handler
时调用如果我理解正确,记录器实例正在处理信息和调试,但(默认)处理程序不是?也许您可以澄清记录器级别和处理程序级别之间的区别。
>>> import logging
>>> logging.root.handlers
[]
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