【问题标题】:Django logger - tracebacks not propagatingDjango 记录器 - 回溯不传播
【发布时间】:2014-01-03 04:56:24
【问题描述】:

我在 django 设置的日志记录配置中将所有记录器替换为一个通用记录器,例如:

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

所以我猜想结果将与具有相同设置的'django' 记录器完全相同。但是我没有看到使用上述“catch-all”配置引发的错误的堆栈跟踪(尤其是在请求上)。

如果我添加它,它会再次打印:

'django': {
    'handlers': ['null'],
    'propagate': True
},

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

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

(django 1.5)

【问题讨论】:

    标签: python django logging


    【解决方案1】:

    尝试在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 设置中的某些内容可能会发生冲突。

    【讨论】:

      【解决方案2】:

      我能看到发生这种情况的唯一原因是 propagation 属性默认设置为 Falsedjango 和/或 django.requests 记录器上,并且您指定它显式地覆盖它。在 Django 1.5 中,与早期版本相比,settings.py 中指定的配置可以与 Django 的默认配置合并,如here 所述。

      除非有特殊原因需要覆盖True 的默认值,否则最好不要进行传播。 Django 自己的配置有时会在配置中明确指定True,IMO 除了记录将要发生的事情之外没有其他用途。

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

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        • 2020-02-15
        • 1970-01-01
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        • 2014-09-12
        相关资源
        最近更新 更多