Python默认记录器已禁用

时间:2015-02-24 11:25:10

标签: python logging

出于某种原因,在我试图修改的Python应用程序中,记录器没有记录任何内容。我将错误追溯到logging/__init__.py

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写入时调用某些函数...

2 个答案:

答案 0 :(得分:10)

如果需要跟踪哪些代码可能将handler.disabled设置为True(默认为0,默认为false),则可以将其替换为属性:

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

答案 1 :(得分:6)

在使用configuration schema时经常发现此问题,默认情况下 disable_existing_loggers True ,因此将禁用未包含在该架构中的所有记录器。

BTW Martin Pieters&#39; answer是至高无上的,当你遇到困难时,它可以适用于任何情况。