2015-02-24 54 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是至高無上的,並在任何情況下工作,當你卡住了。