出于某种原因,在我试图修改的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
写入时调用某些函数...
答案 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是至高无上的,当你遇到困难时,它可以适用于任何情况。