Python/Django:自动记录异常,包括请求信息

7
我已经创建了一个函数log_error(request, traceback),并在我的异常中调用它。这将错误信息写入数据库。现在,在我打开每个视图并添加异常处理程序之前,是否有一种自动将所有异常引发到一个函数的方法,然后调用此函数的方法?
我看到了这个Python error logging,它说要编写自己的sys.excepthook版本。当出现异常时,会自动调用此函数。我尝试过这样做,但即使我将解决方案复制粘贴到views.py中并引发错误,也没有调用my_excepthook。无论如何,它也无法获取我需要的所有信息。我还需要请求,以便记录有关用户、URL等的信息。
也许这要求太多了?
(我正在使用Django,但这似乎不是Django特定的东西)编辑:是的,它是。

sys.excepthook 仅在未处理的异常或由其处理程序重新引发的异常中调用,这可能是您尝试时似乎无法正常工作的原因。它所拥有的大部分信息只是作为参数传递的内容。您可以将其他信息存储在某个地方,并让您的版本在那里查找它。 - martineau
Django可以配置为报告所有未处理的异常。 - jfs
@J.F. Sebastian。错误的方法可行。我写了一个解决方案。谢谢。 - user984003
1个回答

6

J.F. Sebastian的建议奏效了。这是一个Django解决方案。

在settings.py的MIDDLEWARE_CLASSES中:

(我将其添加为最后一个,不确定这是否正确或会在以后引起错误。目前可以正常使用。)

'myapp.middleware.ExceptionMiddleware',

在我的应用程序中间件.py文件中:

import traceback
class ExceptionMiddleware(object):
    def process_exception(self, request, exception):
        log_error(traceback, request)

就是这样。log_error函数是我的函数,它可以将错误信息写入数据库。根据文档https://docs.djangoproject.com/en/dev/howto/error-reporting/,我还能获取本地变量和请求属性。


请问您能分享一下 log_error 函数是如何实现的吗?您是否将 request.META 和 traceback 都记录为两个 TextField(models.TextField)?谢谢。 - SpiXel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接