我创建了以下脚本.你们中的任何人都可以向我解释为什么输出如下所示
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)
特别
logger.info和logging.info这里有什么区别
既然如此,那logger.isEnabledFor(logging.DEBUG)就是True虽然logger.debug('debug')没有显示任何东西
怎么logger.info没有输出logging.info却有
一些要澄清的事情:
WARNING如果您不执行任何操作,即未设置任何处理程序或格式化程序,则不会初始化根记录器:
>>> 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.同时,调试消息没有此备份,因此在未设置处理程序时将忽略它们.
对于你的问题:
getLogger()没有接收参数时返回根记录器.Logger.isEnabledFor(LVL)
指示此记录器是否将处理严重性为lvl的消息.此方法首先检查由logging.disable(lvl)设置的模块级别级别,然后检查由getEffectiveLevel()确定的记录器的有效级别.
logging模块中的任何日志记录函数将初始化根记录器,basicConfig()并使用该记录器添加默认处理程序,以便后续调用logger也可以.您应该做的是,使用logging.basicConfig()为根记录器设置默认处理程序,并根据记录器级别和消息级别输出消息.
| 归档时间: |
|
| 查看次数: |
3276 次 |
| 最近记录: |