Django 1.3日志记录:未记录500个错误
我正在努力使“django.request”记录器能够像广告中那样工作——500个错误似乎不会传播到附加到它的处理程序 在每个新项目的默认日志记录配置中,注释说“此配置执行的日志记录是在每个HTTP 500错误时向站点管理员发送电子邮件”。显然,只有在正确设置管理员的情况下才会发送电子邮件,但我甚至没有看到在视图引发异常时调用处理程序 我从一个空项目开始构建了一个测试用例,并将自己的处理程序添加到“django.request”记录器中:Django 1.3日志记录:未记录500个错误,django,logging,django-1.3,Django,Logging,Django 1.3,我正在努力使“django.request”记录器能够像广告中那样工作——500个错误似乎不会传播到附加到它的处理程序 在每个新项目的默认日志记录配置中,注释说“此配置执行的日志记录是在每个HTTP 500错误时向站点管理员发送电子邮件”。显然,只有在正确设置管理员的情况下才会发送电子邮件,但我甚至没有看到在视图引发异常时调用处理程序 我从一个空项目开始构建了一个测试用例,并将自己的处理程序添加到“django.request”记录器中: LOGGING = { 'version': 1
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时,两个处理程序都不会被调用。My views.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
的情况下尝试。启用调试后,将覆盖设置.py中的错误处理程序。仅用于测试:
manage.py runserver --insecure
您是否尝试过将DEBUG
设置为False
?调试时错误处理程序没有被覆盖吗?谢谢Steve!是的,django.core.handers.base.handle_uncaught_exception是最终处理视图异常的方法,如果settings.DEBUG在调用logger.error之前退出。似乎日志文档应该涵盖这一点-除非我不知何故错过了它?我已经添加了一个正确的答案,以便其他人可以找到此信息。我猜这是因为在调试模式下Django会显示时髦的“special”500/404页面——我想我从来没有在他们(通常是超级)的文档中读过它。将debug设置为False的问题是静态文件无法工作(我在开发中使用Django来服务静态文件)。当DEBUG=True时,是否有其他解决方法可以让日志记录500错误正常工作?谢谢。为了详细说明,这将强制提供静态文件,即使DEBUG=False