你如何在Django网站上logging服务器错误

所以,当玩这个开发时,我可以将settings.DEBUGTrue ,如果发生错误,我可以很好地看到它格式化,具有良好的堆栈跟踪和请求信息。

但在生产网站上,我宁愿使用DEBUG=False ,向访问者显示一些标准错误500页的信息,我正在努力修复此错误;)
同时,我想有一些方法将所有这些信息(堆栈跟踪和请求信息)logging到我的服务器上的一个文件 – 所以我可以输出到我的控制台,看滚动错误,通过电子邮件发送日志给我每小时或类似的东西。

你会推荐什么日志logging解决scheme的django网站,这将满足这些简单的要求? 我有应用程序作为fcgi服务器运行,我使用Apache Web服务器作为前端(虽然想到lighttpd)。

那么,当DEBUG = False ,Django会自动邮寄任何错误的完整追溯给ADMINS设置中列出的每个人,这几乎免费得到你的通知。 如果您想要更细致的控制,您可以编写并添加一个中间件类,该类定义了一个名为process_exception()的方法,该方法可以访问引发的exception:

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

然后,您的process_exception()方法可以执行任何types的日志logging:写入控制台,写入文件等等。

编辑:虽然它有点用处不大,但您也可以监听got_request_exception信号,在请求处理过程中遇到exception时将会发送got_request_exception信号。

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

但是,这不会让您访问exception对象,所以中间件方法更容易处理。

正如已经提到的,Django Sentry是一个很好的select,但是在正确设置(作为一个单独的网站)方面还有一些工作要做。 如果你只是想把所有东西都logging到一个简单的文本文件中,那么这里的日志loggingconfiguration就放在你的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 }, }, } 

在另一个答案中提到的django-db-log被replace为:

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

詹姆斯显然是正确的,但是如果你想在数据存储中loggingexception,有几个开源的解决scheme已经可用:

1)CrashLog是一个不错的select: http : //code.google.com/p/django-crashlog/

2)Db-Log也是一个不错的select: http : //code.google.com/p/django-db-log/

两者有什么区别? 我几乎看不到任何东西,所以任何一个都可以。

我已经使用了,他们工作得很好。

自EMP最有用的代码提交以来,已经有一段时间了。 我刚刚实现了它,并且在使用一些manage.py选项的同时,尝试追查一个bug,我得到了一个弃用警告,大意是当前版本的Django(1.5。?)现在需要一个require_debug_falsefiltermail_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 }, }, } 

我只是有一个恼人的问题,我的fcgi脚本。 它发生在django甚至开始之前。 缺乏伐木是非常痛苦的。 无论如何,将stderrredirect到一个文件是非常重要的。

 #!/home/user/env/bin/python sys.stderr = open('/home/user/fcgi_errors', 'a')