【发布时间】:2011-09-12 09:43:01
【问题描述】:
我正在努力让 'django.request' 记录器像宣传的那样工作 - 500 个错误似乎没有传播到附加到它的处理程序。
在每个新项目的默认日志记录配置中,注释说“此配置执行的日志记录是在每个 HTTP 500 错误时向站点管理员发送电子邮件”。显然,只有在您正确设置了 ADMINS 时才会发送电子邮件,但是当视图引发异常时,我什至没有看到处理程序被调用。
我从一个空项目开始构建了一个测试用例,并将我自己的处理程序添加到“django.request”记录器中:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler'
},
'my_error_handler' : {
'level': 'ERROR',
'class': 'log.MyErrorHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins', 'my_error_handler'],
'level': 'ERROR',
'propagate': True,
},
}
}
处理程序本身:
import logging
class MyErrorHandler(logging.Handler):
def emit(self, record):
print "handling error: %s" % record
如果我自己在记录器上调用 .error(),一切都会正常运行。但是当视图生成 500 时,不会调用任何处理程序。我的意见.py:
import logging
def home(request):
#this error will be processed by MyErrorHandler
logging.getLogger('django.request').error("Custom error message")
#this won't
raise Exception('500 error message')
return HttpResponse("Home")
其他都是项目默认的; DEBUG 为 True,中间件配置不变。我需要启用一些隐藏的配置选项才能按照文档中的说明进行这项工作吗?
谢谢, 马特。
【问题讨论】:
-
您是否尝试过将
DEBUG设置为False?调试时不会覆盖错误处理程序吗? -
谢谢史蒂夫!是的,django.core.handers.base.handle_uncaught_exception 是最终处理视图异常的方法,如果 settings.DEBUG 它在调用 logger.error 之前退出。日志文档似乎应该涵盖这一点 - 除非我以某种方式错过了它?
-
我添加了正确的答案,以便其他人可以找到此信息。我猜这是因为当你处于调试模式时 Django 会显示时髦的“特殊”500/404 页面——我想我从来没有在他们的(通常是极好的)文档中读过它。
标签: django logging django-1.3