你如何在Django网站上logging服务器错误
所以,当玩这个开发时,我可以将settings.DEBUG
为True
,如果发生错误,我可以很好地看到它格式化,具有良好的堆栈跟踪和请求信息。
但在生产网站上,我宁愿使用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为:
詹姆斯显然是正确的,但是如果你想在数据存储中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')