问题:如何在Django网站上记录服务器错误
因此,在进行开发时,我可以设置settings.DEBUG
为True
,如果发生错误,我可以看到格式正确,具有良好的堆栈跟踪和请求信息。
但是在某种生产站点上,我更愿意使用DEBUG=False
并向访问者展示一些标准错误500页,其中包含我目前正在修复此bug的信息;)
同时,我想以某种方式记录所有这些信息(堆栈跟踪和请求信息)存储到服务器上的文件中-因此我可以将其输出到控制台并观看错误滚动,每小时将日志发送给我或类似的东西。
您会为django站点推荐什么样的日志记录解决方案,这些解决方案可以满足那些简单的要求?我有作为fcgi
服务器运行的应用程序,并且我使用apache Web服务器作为前端(尽管考虑使用lighttpd)。
回答 0
好的,当时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
但是,这不能使您访问异常对象,因此中间件方法更容易使用。
回答 1
如前所述,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
},
},
}
回答 2
另一个答案中提到的django-db-log已替换为:
回答 3
显然,James是正确的,但是如果您想在数据存储区中记录异常,则已经有一些开源解决方案可用:
1)CrashLog是一个不错的选择:http : //code.google.com/p/django-crashlog/
2)Db-Log也是一个不错的选择:http : //code.google.com/p/django-db-log/
两者有什么区别?我几乎看不到任何东西,所以只要一个就足够了。
我都用过,而且它们运作良好。
回答 4
自EMP提交最有用的代码以来,已经过去了一段时间。我刚刚实现了它,并在尝试使用一些manage.py选项进行尝试以查找错误时,我收到了弃用警告,以表明在当前版本的Django(1.5。?)中,现在需要require_debug_false过滤器mail_admins处理程序所需。
这是修改后的代码:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'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',
'filters': ['require_debug_false'],
# 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': '/home/username/public_html/djangoprojectname/logfilename.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': 'DEBUG', # Or maybe INFO or WARNING
'propagate': False
},
},
}
回答 5
我的fcgi
脚本有一个烦人的问题。它发生在django开始之前。缺少伐木非常痛苦。无论如何,将stderr重定向到文件作为第一件事很有帮助:
#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')