Python 拦截Django 500错误进行日志记录,而不创建/提供自定义500.html

Python 拦截Django 500错误进行日志记录,而不创建/提供自定义500.html,python,django,http-status-code-500,Python,Django,Http Status Code 500,为了记录触发服务器错误500的“某些依赖项,某个地方很深”错误,由于DEBUG=False,生产实例上的控制台日志中没有堆栈跟踪,我实现了标准的定制500处理程序,许多关于打印500错误堆栈跟踪的Stackoverflow问题建议: import sys import traceback def server_error_500_handler(request): type, value, tb = sys.exc_info() print('\n----intercepted

为了记录触发服务器错误500的“某些依赖项,某个地方很深”错误,由于
DEBUG=False
,生产实例上的控制台日志中没有堆栈跟踪,我实现了标准的定制500处理程序,许多关于打印500错误堆栈跟踪的Stackoverflow问题建议:

import sys
import traceback

def server_error_500_handler(request):
    type, value, tb = sys.exc_info()
    print('\n----intercepted 500 error stack trace----')
    print(value)
    print(type)
    print(traceback.format_exception(type, value, tb))
    print('----\n')

然而,这些也都说以
render(request,'500.html')
结束,而我不想提供定制的500页,而是希望代码“返回”(如果有这样的事情)到只提供Django本身已经做过的任何事情。有什么办法可以做到这一点吗?或者,是否有某种方法可以在不劫持500错误返回代码路径的情况下侦听500事件?

不制作自定义的500处理程序,而是制作一个自己的处理程序,并在其中实现一个
进程异常
方法:

import traceback


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

    def __call__(self, request):
        response = self.get_response(request)
        return response
    
    def process_exception(self, request, exception):
        print('\n----intercepted 500 error stack trace----')
        print(exception)
        print(type(exception))
        tb = exception.__traceback__
        print(traceback.format_exception(type(exception), exception, tb))
        print('----\n')
        return None # Let other middlewares do further processing
然后将其添加到
中间件设置中,一直到最后,因为中间件在响应/异常阶段是以自底向上的顺序运行的,所以如果最后一次运行,它将始终运行(一些中间件可能会决定短路并返回响应,因此在它之后的任何操作都可能阻止它运行)


在中间件列表中放在哪里重要吗?(例如,是否有任何特定的Django中间件需要跟进?@Mike'Pomax'Kamermans将其放在最后,如我在示例中所示(注意缺少尾随
),因为中间件在响应/异常阶段以自下而上的方式运行,所以如果将其放在最后,它将始终运行(一些中间件可能决定短路,否则返回响应)明白了,谢谢!
MIDDLEWARE = [
    ...
    'path.to.Log500ErrorsMiddleware',
]