我尝试了解
logging
模块的真正工作原理。以下代码的反应并不像我预期的那样。
#!/usr/bin/env python3
import logging
l = logging.getLogger()
l.setLevel(logging.DEBUG)
print('enabled for DEBUG: {}'.format(l.isEnabledFor(logging.DEBUG)))
l.debug('debug')
l.info('info')
l.warning('warning')
l.error('error')
l.critical('critical')
它只是将其打印到控制台。
warning
error
critical
但是为什么呢?不是应该还有
info
和debug
吗?为什么不呢?
问题不在于如何解决这个问题。我了解处理程序和类似的事情。我只是试图理解这段代码是如何工作的以及为什么它没有像我预期的那样反应。
未设置处理程序时,将使用
lastResort
处理程序,默认情况下,lastResort
级别设置为 WARNING
。
这是通过这段代码实现的:
_defaultLastResort = _StderrHandler(WARNING)
lastResort = _defaultLastResort
def callHandlers(self, record):
...
found = 0
...
if (found == 0):
if lastResort:
if record.levelno >= lastResort.level:
lastResort.handle(record)
还请记住,记录器和处理程序都有级别。一条记录可以是 因级别太低而被记录器过滤,也可以过滤 因级别太低而被处理程序处理。将记录器级别设置为 DEBUG 允许后续日志记录调用通过记录器的级别过滤器,但它们仍然可以通过处理程序的级别过滤器进行过滤,默认情况下设置为
lastResort.level
,即 WARNING
。
如果您也来这里寻找解决方案 - 这不是原始问题的范围: 在撰写本文时,最简单的解决方法是将
l.setLevel()
替换为 logging.basicConfig()
。据我所知,这也是 HOWTO 所建议的。这个例子看起来像这样:
import logging
logger = logging.getLogger()
logging.basicConfig(level=logging.DEBUG)