代码之家  ›  专栏  ›  技术社区  ›  orange

Python默认记录器已禁用

  •  11
  • orange  · 技术社区  · 11 年前

    由于某种原因,在我试图修改的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.disabled True 。在应用程序中,没有任何地方设置此值,我认为任何包都不会更改它。记录器照常实例化 logger = logging.getLogger(__name__) 。当我设置 logger.disabled = False 在实际记录任何内容之前(在调用之前 logger.info() ),记录器将打印预期的日志文本。但如果我不这样做,它会回来 handle() 不记录任何内容。

    有什么方法可以调试它吗?也许可以改变 Logger 类,以便在任何时候调用某个函数 disabled 被写入。。。

    2 回复  |  直到 11 年前
        1
  •  18
  •   Martijn Pieters    4 年前

    如果需要跟踪可能设置的代码 handler.disabled 设置为True(默认情况下为0,因此为false),可以将属性替换为属性:

    import logging
    import sys
    
    @property
    def disabled(self):
        try:
            return self._disabled
        except AttributeError:
            return False
    
    @disabled.setter
    def disabled(self, disabled):
        if disabled:
            frame = sys._getframe(1)
            print(
                f"{frame.f_code.co_filename}:{frame.f_lineno} "
                f"disabled the {self.name} logger"
            )
        self._disabled = disabled
    
    logging.Logger.disabled = disabled
    

    交互式解释器演示:

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

    如果要查看完整堆栈,请添加 from traceback import print_stack ,以及内部 if disabled: print_stack(frame) .

        2
  •  18
  •   frost-nzcr4    5 年前

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

    BTW马丁·彼得斯 answer 是至高无上的,在任何情况下都能发挥作用。