Django记录器 - 回溯不传播

时间:2013-12-15 21:37:29

标签: python django logging

我在django设置中的日志配置中用全能记录器替换了所有记录器,例如:

'loggers': {
    '': {
        'handlers': ['console'],
        'level': 'DEBUG'
    }
}

所以我猜测结果与具有相同设置的'django'记录器完全相同。但是我没有看到引发的错误的堆栈跟踪(特别是在requets上),具有上述“全能”配置。

如果我添加:

,它再打印好
'django': {
    'handlers': ['null'],
    'propagate': True
},

似乎'django'记录器以某种方式完成了将回溯添加到日志中的工作?

但无论如何,事情的表现是什么原因?添加第二个代码片段后,为什么会发生变化?在我看来,我不知道这部分故事。

(django 1.5)

2 个答案:

答案 0 :(得分:1)

我发现这种情况的唯一原因是默认情况下propagation和/或False记录器上的django属性设置为django.requests,您的明确指定它会覆盖它。在Django 1.5中,与早期版本相比,settings.py中指定的配置可以与Django的默认值合并,如here所述。

除非有特定原因覆盖True的默认值,否则通常最好不要单独传播。 Django自己的配置有时在配置中明确指定True,除了记录将要发生的事情之外,IMO没有任何其他目的。

您需要显示您正在使用的特定1.5版Django的完整配置,以确定您所看到的行为的确切原因。

答案 1 :(得分:0)

settings.py中尝试设置全能记录器:

LOGGING = {
    'version': 1,
    'root': {'level': 'DEBUG'}
}

如果没有看到完整的LOGGING设置,就无法确定,但这是我对正在发生的事情的猜测。我不相信空字符串命名的''记录器实际上用作根记录器;它可能什么都不做。此外,由于您的设置未与Django合并,因此不会定义“控制台”处理程序。 如果使用了该记录器,我希望它会抛出类似AttributeError: 'str' object has no attribute 'level'的错误。与'null'处理程序相同。

但是,当您添加'django'记录器时, 与Django实际使用的记录器相对应,propagate设置生效到冒充本机根记录器,默认情况下打印到sys.stderr。根据定义,虽然根记录器捕获了所有内容,但您不必专门命名“django”记录器。您的完整LOGGING设置中的某些内容可能会发生冲突。