Python 拦截Django 500错误进行日志记录,而不创建/提供自定义500.html
为了记录触发服务器错误500的“某些依赖项,某个地方很深”错误,由于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
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',
]