当前位置:  开发笔记 > 编程语言 > 正文

如何在django站点上记录服务器错误

如何解决《如何在django站点上记录服务器错误》经验,为你挑选了5个好方法。

因此,在玩开发时我可以设置settings.DEBUGTrue,如果发生错误,我可以看到它格式良好,具有良好的堆栈跟踪和请求信息.

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

您会为django站点推荐哪些日志记录解决方案,以满足这些简单的要求?我有作为fcgi服务器运行的应用程序,我使用apache web服务器作为前端(虽然考虑转到lighttpd).



1> James Bennet..:

好吧,当DEBUG = FalseDjango自动将任何错误的完整追溯邮件发送给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

这并没有给你访问异常对象,然而,这样的中间件的方法是非常容易的工作.


但如果你没有电子邮件设置,这将无法正常工作,对吧?
请注意,使用`logging.exception('some message')`和python的标准日志记录模块在`got_request_exception`的sginal处理程序中工作得很好,如果你要做的就是注销堆栈跟踪.换句话说,回溯在`got_request_exception`中仍然可用.

2> EMP..:

正如前面提到的,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
        },
    },
}


`'include_html':True`不会简单地让电子邮件"更好"!它包括完整的回溯,包括设置和局部变量的值.根据文档,这是一个安全问题:https://docs.djangoproject.com/en/1.8/topics/logging/#django.utils.log.AdminEmailHandler

3> tobych..:

另一个答案中提到的django-db-log已被替换为:

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



4> 小智..:

显然James是正确的,但如果您想在数据存储区中记录异常,那么已经有一些开源解决方案可用:

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

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

两者有什么区别?几乎没有什么我能看到的,所以任何一个都足够了.

我已经使用过它们并且效果很好.



5> 小智..:

自EMP最有用的代码提交以来已经过去了一段时间.我刚刚实现了它,并且在使用一些manage.py选项时,为了试图追查一个bug,我得到了一个弃用警告,结果是我当前版本的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
        },
    },
}

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有