繁体   English   中英

Python日志记录级别的行为不一致

[英]Python logging levels are behaving inconsistently

我不明白为什么即使有效级别合适(输出仅为10 ),以下代码也不产生调试消息

import logging

l = logging.getLogger()
l.setLevel(logging.DEBUG)
l.debug("Debug Mess!")
l.error(l.getEffectiveLevel())

当我在导入后添加此行时: logging.debug("Start...")

import logging

logging.debug("Start...")
l = logging.getLogger()
l.setLevel(logging.DEBUG)
l.debug("Debug Mess!")
l.error(l.getEffectiveLevel())

它产生以下输出:

DEBUG:root:Debug Mess!
ERROR:root:10

因此,即使未显示“开始...”,它也会开始记录。 为什么?

它在Python 3.5上。 谢谢

如果尚未在根记录器上配置任何处理程序,则顶层logging.debug(..)调用将为您调用logging.basicConfig()函数

因为使用对logging.getLogger().debug()调用不会触发该调用,所以您看不到任何输出,因为没有处理程序可以显示该输出。

Python 3版本的logger确实具有logging.lastResort处理函数 ,用于不存在任何日志配置的情况,但是此处理函数配置为仅显示WARNING级别及更高级别的消息,这就是为什么您看到ERROR级别消息( 10 )的原因到STDERR,但没有DEBUG级别的消息。 在Python 2中,您将得到消息:找不到为记录器“ root”打印的处理程序 ,第一次尝试记录任何内容仅一次。 但是,我不依赖lastResort处理程序。 而是使用适合您自己需要的体面处理程序来正确配置日志记录层次结构。

您可以自己调用logging.basicConfig() ,也可以在根记录器上手动添加处理程序:

l = logging.getLogger()
l.addHandler(logging.StreamHandler())

上面的操作基本上与没有其他参数的logging.basicConfig()调用相同。 以这种方式创建的StreamHandler()记录到STDERR,并且不再在消息级别进行过滤。 请注意, logging.basicConfig()调用也可以为您设置日志记录级别。

根记录器(默认记录器,顶级)和所有其他记录器的默认日志级别在所有5个日志级别中均为warning (顺序3): debug < info < warning < error < fatal

因此,在您的第一个logging.debug('starting...') ,您尚未按照以下代码设置要debug的根日志级别,因此无法获得starting...输出。

import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug('starting...')

有关详细信息,请参见python日志操作指南

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM