Python默认记录器已禁用

ora*_*nge 5 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)
Run Code Online (Sandbox Code Playgroud)

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

有什么办法可以调试吗?也许可以改变Logger类,以便disabled在写入时调用某些函数...

Mar*_*ers 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)
Run Code Online (Sandbox Code Playgroud)

交互式口译员的演示:

>>> import logging
>>> logging.getLogger('foo.bar').disabled = True
<stdin>:1 disabled the foo.bar logger
Run Code Online (Sandbox Code Playgroud)


fro*_*cr4 6

在使用配置架构时,通常会发现此问题,默认情况下disable_existing_loggersTrue,因此将禁用该架构中未包括的所有记录器。

顺便说一句,马丁·彼得斯(Martin Pieters)的回答是至高无上的,并且在您遇到任何困难时都可以使用。