我如何能够找到哪个模块覆盖了 Python 根记录器?
我的 Django 项目从很多外部包中导入,并且我尝试搜索所有 logging.basicConfig 和 logging.root 设置实例,但是它们中的大多数都在测试中,除非特别调用,否则不应覆盖它。
Django 的日志记录配置没有指定根记录器。
好吧,解决方案是对 Python 日志记录模块进行一些猴子修补。我只是在打印堆栈的 logging.root.addHandler 函数周围包裹了一个装饰器,瞧,我找到了调用 logging.getLogger() 的罪魁祸首。如果您不带任何参数调用 getLogger,您将获得根记录器。
import logging
import sys
import traceback
def tracer(func):
def new_func(*args, **kwargs):
try:
traceback.print_stack(sys.stderr)
except:
traceback.print_exc(sys.stderr)
return func(*args, **kwargs)
return new_func
old_addHandler = logging.root.addHandler
logging.root.addHandler = tracer(old_addHandler)
# run your code
我假设您的意思是import logging
导入不同的日志记录模块?在这种情况下,模块/包的许多特殊属性可以提供帮助,例如__path__
. 打印logging.__path__
应该告诉你 python 从哪里导入它。