为什么logging.setLevel()在这里对Python无效?

时间:2015-08-09 00:10:53

标签: python python-3.x logging

我试着理解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

但为什么呢?不应该有infodebug吗?为什么不呢?

问题不在于如何解决这个问题。我知道处理程序和类似的东西。我只是试着理解这段代码是如何工作的以及为什么它没有像我期望的那样反应。

1 个答案:

答案 0 :(得分:5)

如果未设置处理程序,则使用lastResort处理程序,默认情况下lastResort级别设置为WARNING

这是由this bit of code实现的:

_defaultLastResort = _StderrHandler(WARNING)
lastResort = _defaultLastResort

    def callHandlers(self, record):
        ...
        found = 0
        ...
        if (found == 0):
            if lastResort:
                if record.levelno >= lastResort.level:
                    lastResort.handle(record)

还要记住both loggers and handlers have levels。记录可以 由记录器过滤的级别太低,也可以过滤 由处理程序提供的级别太低。将记录器级别设置为DEBUG允许后续日志记录调用通过记录器的级别过滤器,但它们can still be filtered由处理程序的级别过滤器(默认设置为lastResort.level,即WARNING,默认情况下