找出哪个模块正在设置根记录器

Igo*_*rko 5 python logging

我如何才能找到哪个模块正在覆盖 Python 根记录器?

我的 Django 项目从相当多的外部包中导入,并且我尝试搜索logging.basicConfig和logging.root设置的所有实例,但是它们中的大多数都在测试中,除非特别调用,否则不应覆盖它。

Django 的日志记录配置未指定根记录器。

Igo*_*rko 5

解决方案是对 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)