【发布时间】:2013-12-15 11:01:05
【问题描述】:
使用 Django 1.5.1:
DEBUG = False
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(message)s'
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
},
'loggers': {
# root logger
'': {
'handlers': ['console'],
},
#'django.request': {
# 'handlers': ['console'],
# 'level': 'DEBUG',
# 'propagate': False,
#},
}
}
如果我取消注释注释行并调用具有1/0 的视图,则回溯将打印到控制台:
ERROR 2013-11-29 13:33:23,102 base Internal Server Error: /comment/*******/
Traceback (most recent call last):
...
File "*****/comments/views.py", line 10, in post
1/0
ZeroDivisionError: integer division or modulo by zero
WARNING 2013-11-29 13:33:23,103 csrf Forbidden (CSRF cookie not set.): /comment/******/
[29/Nov/2013 13:33:23] "POST /comment/******/ HTTP/1.0" 500 27
但如果这些行保持注释,则不会将回溯打印到控制台,只是:
[29/Nov/2013 13:33:23] "POST /comment/******/ HTTP/1.0" 500 27
我想如果 django.request 记录器没有配置,它会传播到根记录器,它将所有内容打印到控制台。
我没有找到任何django.request 特殊的信息。
为什么它不起作用?
Here我看了:
在 Django 1.5 之前,LOGGING 设置总是覆盖默认的 Django 日志配置。从 Django 1.5 开始,可以将项目的日志配置与 Django 的默认配置合并,因此您可以决定是否要添加或替换现有配置。
如果 LOGGING dictConfig 中的 disable_existing_loggers 键设置为 True(这是默认设置),则默认配置将被完全覆盖。或者,您可以通过将 disable_existing_loggers 设置为 False 来重新定义部分或全部记录器。
在django/utils/log.py:
# Default logging for Django. This sends an email to the site admins on every
# HTTP 500 error. Depending on DEBUG, all other log records are either sent to
# the console (DEBUG=True) or discarded by mean of the NullHandler (DEBUG=False).
DEFAULT_LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console':{
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'null': {
'class': 'django.utils.log.NullHandler',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': {
'handlers': ['console'],
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
'py.warnings': {
'handlers': ['console'],
},
}
}
所以默认情况下django.request 有propagate = False。但就我而言,我有'disable_existing_loggers': True。
【问题讨论】:
-
感谢您在 stackoverflow 上提出这个问题。我还可以问您,根据默认日志记录配置,键“传播”设置为 false,所以,在您的情况下,它没有传播到根记录器,但它是否随后将有关错误的邮件发送给管理员?跨度>