如何在Django网站上记录服务器错误
在开发的时候,我可以把 settings.DEBUG
设置为 True
,这样如果出现错误,我就能看到格式很好的错误信息,包括详细的错误堆栈和请求信息。
但是在生产环境的网站上,我更愿意把 DEBUG=False
,这样访客看到的就是一个标准的500错误页面,上面写着我正在修复这个bug的信息;)
同时,我希望能有一种方法把所有这些信息(错误堆栈和请求信息)记录到我服务器上的一个文件里,这样我就可以在控制台输出这些信息,实时查看错误,或者每小时把日志通过邮件发给我之类的。
你有什么推荐的日志解决方案适合django网站,能满足这些简单的需求吗?我的应用是以 fcgi
服务器运行的,前端使用的是apache网络服务器(虽然我在考虑换成lighttpd)。
7 个回答
在另一个回答中提到的django-db-log,已经被以下内容替代:
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
},
},
}
当 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
不过,这种方式并不能让你访问到异常对象,所以使用中间件的方法会更简单。