Python日志记录级别表现不一致

时间:2016-04-01 06:22:06

标签: python logging

我无法理解为什么以下代码不会产生我的调试消息,即使有效级别合适(输出只是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上。感谢

2 个答案:

答案 0 :(得分:2)

如果根记录器上尚未配置处理程序,则顶级logging.debug(..)调用会为您调用logging.basicConfig() function

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

{3}的Python 3版本确实有logging.lastResort handler,用于没有日志记录配置时,但此处理程序配置为仅显示级别logger及更高级别的消息,这就是为什么您看到WARNING级别的消息(ERROR)打印到STDERR,而不是您的10级消息。在Python 2中,您将收到消息无法找到记录器“root”打印的处理程序,只有一次用于第一次尝试记录任何内容。但是,我不依赖于DEBUG处理程序;相反,可以根据自己的需要配置合适的处理程序来正确配置日志记录层次结构。

自己调用lastResort,或在根记录器上手动添加处理程序:

logging.basicConfig()

以上基本上与l = logging.getLogger() l.addHandler(logging.StreamHandler()) 调用完全相同,没有进一步的参数。以这种方式创建的logging.basicConfig()会记录到STDERR,并且不会在消息级别上进一步过滤。请注意,StreamHandler()调用也可以为您设置日志记录级别。

答案 1 :(得分:0)

在所有5个日志级别中,根记录器(默认记录器,顶级)和所有其他记录器的默认日志级别为 override func viewWillLayoutSubviews() { sampleLabel.sizeToFit() } (订单3):warning< debug< info< warning< error按顺序排列。

因此,在您的第一个fatal,您没有将根日志级别设置为logging.debug('starting...'),如下面的代码,您无法获得debug输出。

starting...

see python logging HOW TO for detail