2015-08-09 20 views
3

我试图了解logging模块是如何工作的。下面的代码不会像我预期的那样反应。为什么logging.setLevel()在Python中没有效果?

#!/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?为什么不?

问题不在于如何解决这个问题。我知道处理者和那样的事情。我只是想了解这些代码是如何工作的,以及为什么它没有像我期望的那样反应。

回答

4

当未设置处理程序时,将使用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

相关问题