2015-02-24 68 views
1

出于某种原因,在我试图修改的Python应用程序中,记录器没有记录任何内容。我跟踪误差logging/__init__.py禁用Python默认记录器

def handle(self, record): 
    """ 
    Call the handlers for the specified record. 

    This method is used for unpickled records received from a socket, as 
    well as those created locally. Logger-level filtering is applied. 
    """ 
    if (not self.disabled) and self.filter(record): 
     self.callHandlers(record) 

我不知道为什么,但self.disabledTrue。在应用程序中没有任何地方设置这个值,我不认为任何包都在改变它。记录器像往常一样实例化logger = logging.getLogger(__name__)。当我在设置logger.disabled = False之前(在调用logger.info()之前)记录任何内容时,记录器将打印预期的日志文本。但是,如果我不这样做,它将返回handle()而不记录任何内容。

有什么办法可以调试吗?或许可以改变Logger类,所以,每当disabled被写入一些功能被称为...

回答

4

如果您需要跟踪哪些代码可以设置handler.disabled为True(它是0,那么假,默认情况下),你从交互式解释

import logging 
import sys 

def get_disabled(self): 
    return self._disabled 

def set_disabled(self, disabled): 
    frame = sys._getframe(1) 
    if disabled: 
     print('{}:{} disabled the {} logger'.format(
      frame.f_code.co_filename, frame.f_lineno, self.name)) 
    self._disabled = disabled 

logging.Logger._disabled = logging.Logger.disabled 
logging.Logger.disabled = property(get_disabled, set_disabled) 

演示:可以与属性更换属性它

>>> import logging 
>>> logging.getLogger('foo.bar').disabled = True 
<stdin>:1 disabled the foo.bar logger 
+0

真棒 - 作品像魅力。感谢堆! (1) – orange 2015-02-24 12:06:55

2

经常发现当使用configuration schema这个问题,在默认情况下disable_existing_loggersTrue因此,未包含在该模式中的所有记录器都将被禁用。

顺便说一句马丁彼得斯的'answer是至高无上的,并在任何情况下工作,当你卡住了。