4

我如何能够找到哪个模块覆盖了 Python 根记录器?

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

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

4

2 回答 2

4

好吧,解决方案是对 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
于 2012-09-21T14:00:50.150 回答
0

我假设您的意思是import logging导入不同的日志记录模块?在这种情况下,模块/包的许多特殊属性可以提供帮助,例如__path__. 打印logging.__path__应该告诉你 python 从哪里导入它。

于 2012-09-21T02:38:25.540 回答