184

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

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

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

4

7 回答 7

106

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

但是,这不会您访问异常对象,因此中间件方法更容易使用。

于 2008-10-26T14:53:31.147 回答
81

正如已经提到的,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
        },
    },
}
于 2011-06-18T11:58:01.903 回答
40

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

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

于 2010-11-16T20:34:56.797 回答
30

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

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

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

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

我两个都用过,而且效果很好。

于 2008-10-27T13:33:44.160 回答
16

自 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
        },
    },
}
于 2013-10-09T08:51:51.597 回答
1

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

#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')
于 2016-08-23T16:33:50.447 回答
0

你可以在 Python 中使用日志库,不需要pip install任何东西。

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

Django Sentry 是一个不错的选择

正如EMP所说。

于 2022-01-07T07:28:59.087 回答