【问题标题】:How can I catch all 500 and above errors in DRF and log them?如何在 DRF 中捕获所有 500 及以上的错误并记录它们?
【发布时间】:2021-03-26 01:26:39
【问题描述】:

我已经查看了很多关于实现此功能的 SO 响应,但我似乎找不到不推荐使用的东西或真正适用于我的用例的东西。

基本上,我有一些返回自己的状态代码的 API 方法。但是,如果出于任何原因出现 500 服务器错误或任何高于 500 的值表明发生了一些奇怪的事情(例如,假设数据库连接超时),我希望将其记录到文件中或通过电子邮件发送给管理员。

我尝试使用自定义异常处理程序,但并非所有 500 个错误都是异常。

所以我求助于编写自定义中间件,看起来像这样

class CustomApiLoggingMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        if response.path.startswith('/api/'):
            ...do stuff here

然而,问题是似乎没有status_code。坦率地说,我真的不知道我实际上得到了哪种回应。由于 API 方法,我的 API 故意返回了 500 响应,如果不满足某种条件(假设他们发送了没有正确标头的请求),则 Django 在后端生成了 500 响应/p>

我试图通过在一些基本的 /500 路由中返回 Response(status=status.HTTP_500) 来故意生成 500 响应/错误。即使这触发了中间件,我也没有可以用来检查响应是否为 500 的 status_code

我什至不确定我这样做是否正确,但希望你能理解我的意图。我基本上想全面捕获由于我的 API 调用而可能发生的所有未捕获的异常,并将它们记录下来或发送给管理员。大多数返回大约 40X 或任何值的调用都以我想要的方式处理。

【问题讨论】:

  • 在这种情况下,我会查看sentry.io,您将获得更好的错误日志,并且它很容易与所有内容集成。不是先令,但已经使用了 5 年或更长时间,没有它就活不下去。我们所有的 dajngo 项目、webapps,甚至一些命令行工具都使用它。轻松值得 30/月。

标签: django exception logging django-rest-framework middleware


【解决方案1】:

我对@9​​87654323@ 并不完全熟悉,但docs 中描述的可调用类的直接实现似乎可行:

class ResponseStatusMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        print(f"Response has status {response.status_code}")

        return response

当视图使用标准 Django HttpResponse 执行 return HttpResponse(status=500) 时,这可以正常工作。但是,当视图引发异常时,由于 Django Rest Framework 的异常处理,可能会绕过中间件。如果get_response 引发异常,您可以通过在中间件中实现process_exception 挂钩来处理它:

class ResponseStatusMiddleware:
    ...
    def process_exception(self, request, exception):
        ...log your exception...

您还可以使用自定义处理程序将未捕获的异常转换为响应对象,或者如果可能,将它们转换为 DRF 的 APIException,这是自动处理的。

另外,status.HTTP_500 可能应该是status.HTTP_500_INTERNAL_SERVER_ERROR(参见the DRF documentation)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2011-07-16
    • 2010-10-21
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多