如何在Django网站上记录服务器错误

187 投票
7 回答
103587 浏览
提问于 2025-04-11 18:23

在开发的时候,我可以把 settings.DEBUG 设置为 True,这样如果出现错误,我就能看到格式很好的错误信息,包括详细的错误堆栈和请求信息。

但是在生产环境的网站上,我更愿意把 DEBUG=False,这样访客看到的就是一个标准的500错误页面,上面写着我正在修复这个bug的信息;)
同时,我希望能有一种方法把所有这些信息(错误堆栈和请求信息)记录到我服务器上的一个文件里,这样我就可以在控制台输出这些信息,实时查看错误,或者每小时把日志通过邮件发给我之类的。

你有什么推荐的日志解决方案适合django网站,能满足这些简单的需求吗?我的应用是以 fcgi 服务器运行的,前端使用的是apache网络服务器(虽然我在考虑换成lighttpd)。

7 个回答

41

在另一个回答中提到的django-db-log,已经被以下内容替代:

https://github.com/dcramer/django-sentry

83

Django Sentry是个不错的选择,正如之前提到的,但设置起来需要花一些功夫(因为它是一个单独的网站)。如果你只是想把所有信息记录到一个简单的文本文件里,这里有个日志配置,可以放在你的settings.py文件里。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/var/log/django/myapp.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'WARNING', # Or maybe INFO or DEBUG
            'propagate': False
        },
    },
}
110

DEBUG = False 时,Django 会自动把任何错误的详细信息通过邮件发送给在 ADMINS 设置中列出的人,这样你几乎可以免费收到通知。如果你想要更精细的控制,可以写一个中间件类,并在设置中添加它,这个类里需要定义一个叫 process_exception() 的方法,这样你就可以访问到抛出的异常了。

http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception

你的 process_exception() 方法可以执行你想要的任何日志记录,比如写入控制台、写入文件等等。

补充一下:虽然用处稍微少一点,你也可以监听 got_request_exception 信号,这个信号会在请求处理过程中遇到异常时发送:

http://docs.djangoproject.com/en/dev/ref/signals/#got-request-exception

不过,这种方式并不能让你访问到异常对象,所以使用中间件的方法会更简单。

撰写回答