我在django设置中的日志配置中用全能记录器替换了所有记录器,例如:
'loggers': {
'': {
'handlers': ['console'],
'level': 'DEBUG'
}
}
所以我猜测结果与具有相同设置的'django'
记录器完全相同。但是我没有看到引发的错误的堆栈跟踪(特别是在requets上),具有上述“全能”配置。
如果我添加:
,它再打印好'django': {
'handlers': ['null'],
'propagate': True
},
似乎'django'
记录器以某种方式完成了将回溯添加到日志中的工作?
但无论如何,事情的表现是什么原因?添加第二个代码片段后,为什么会发生变化?在我看来,我不知道这部分故事。
(django 1.5)
答案 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
设置中的某些内容可能会发生冲突。