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

Posted

技术标签:

【中文标题】你如何在 django 网站上记录服务器错误【英文标题】:How do you log server errors on django sites 【发布时间】:2010-09-19 06:43:41 【问题描述】:

因此,在进行开发时,我可以将 settings.DEBUG 设置为 True,如果发生错误,我可以看到它的格式很好,并且具有良好的堆栈跟踪和请求信息。

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

您会为 django 站点推荐哪些日志记录解决方案,以满足这些简单的要求?我的应用程序以fcgi 服务器运行,并且我使用 apache Web 服务器作为前端(尽管考虑使用 lighttpd)。

【问题讨论】:

战场上的东西:dlo.me/what-to-do-when-your-site-goes-viral 哨兵查看日志:readthedocs.org/docs/sentry/en/latest/index.html Cherian 分享的链接现已失效。如果您尝试搜索 Sentry,您可能会找到他们付费的官方实例的材料,但这里是设置自托管实例的链接:docs.sentry.io/server 另外,这是当前维护的 repo:github.com/getsentry/sentry跨度> 【参考方案1】:

好吧,当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

这确实让您可以访问异常对象,但是,中间件方法更容易使用。

【讨论】:

请注意,使用logging.exception('Some message') 和python 的标准日志记录模块在got_request_exception 的信号处理程序中工作得很好,如果您只想注销堆栈跟踪。也就是说,回溯在got_request_exception 中仍然可用。 传递给 process_exception 的异常似乎没有堆栈跟踪,有没有办法得到它?【参考方案2】:

如前所述,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
        ,
    ,

【讨论】:

我同意,我爱哨兵!我想拥有它的 .Net 端口(最近一直在从事 .Net 项目)。 'include_html': True 不仅仅是让电子邮件“更好”!它包括完整的回溯,包括设置和局部变量的值。根据文档,这是一个安全问题:docs.djangoproject.com/en/1.8/topics/logging/… 我很好奇 mail_admins 处理程序(和 django.request 记录器)是否是必要的,因为您有 'disable_existing_loggers': False 并且只是使用此处理程序(和记录器)复制默认的 django 日志记录。等我测试完再更新。 请更新此答案。从 django1.9 更改日志:Django 的默认日志配置不再定义“django.request”和“django.security”记录器。【参考方案3】:

另一个答案中提到的 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 选项来尝试解决错误时,我收到了一个弃用警告,大意是使用我当前版本的 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
        ,
    ,

【讨论】:

我很好奇 mail_admins 处理程序(和 django.request 记录器)是否是必要的,因为您有 'disable_existing_loggers': False 并且只是使用此处理程序(和记录器)复制默认的 django 日志记录。测试完我会更新的。【参考方案6】:

我的fcgi 脚本出现了一个烦人的问题。它发生在 django 甚至开始之前。缺乏日志记录太痛苦了。无论如何,首先将 stderr 重定向到文件有很大帮助:

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

【讨论】:

【参考方案7】:

您可以在 Python 中使用日志库,无需 pip install 任何东西。

将任何print() 替换为logging.debug() 但是,

Django Sentry 是个好方法

正如 EMP 所说。

【讨论】:

以上是关于你如何在 django 网站上记录服务器错误的主要内容,如果未能解决你的问题,请参考以下文章

django debug关闭之后网页错误

Django值Cookie基础

如何在 Amazon EC2 主机上设置 Django 网站?

如何在 Django 上组织前端?

如何获取发生错误的行号,而不是从 Django 中记录错误的行号

如何使用xampp mysql配置django?