我如何才能找到哪个模块正在覆盖 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
Run Code Online (Sandbox Code Playgroud)