Django 1.3 日志记录:未记录 500 个错误

Posted

技术标签:

【中文标题】Django 1.3 日志记录:未记录 500 个错误【英文标题】:Django 1.3 logging: 500 errors are not logged 【发布时间】: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 页面——我想我从来没有在他们的(通常是极好的)文档中读过它。 【参考方案1】:

仅用于测试:

manage.py runserver --insecure

【讨论】:

详细说明,这将强制提供静态文件,即使DEBUG = False【参考方案2】:

尝试将DEBUG 设置为False。启用调试后,settings.py 中的错误处理程序将被覆盖。

【讨论】:

将 DEBUG 设置为 False 的问题是静态文件不起作用(我在开发中使用 Django 来服务器静态文件)。在 DEBUG=True 的情况下,是否有任何其他解决方法可以让 500 错误的日志记录正常工作?谢谢。

以上是关于Django 1.3 日志记录:未记录 500 个错误的主要内容,如果未能解决你的问题,请参考以下文章

日志记录和电子邮件不适用于 Django 500

Django 日志记录错误:未创建日志文件

我有一个供应商试图与我的 WCF api 通信,他们收到 http:500 错误,但 IIS 日志记录未显示详细信息

如何使用 Django 1.3 日志字典配置设置 SysLogHandler

Django之logging日志使用

Nginx+Gunicorn+Supervisor+Django 报错