拦截 Django 500 日志记录错误,没有 creating/serving 自定义 500.html
Intercepting a Django 500 error for logging, without creating/serving a custom 500.html
为了记录触发服务器错误 500 的“某些依赖性,某处深层”错误,由于 DEBUG=False
,生产实例的控制台日志中没有堆栈跟踪,我实现了标准的自定义 500 处理程序关于为 500 错误打印堆栈跟踪的大量 Whosebug 问题推荐:
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 错误 return 代码路径的情况下侦听 500 事件?
与其创建自定义 500 处理程序,不如创建一个自己的 custom middleware 并在其中实现一个 process_exception
方法:
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
然后将它添加到 MIDDLEWARE
设置,一直到最后,因为在 response/exception 阶段中间件是 运行 自下而上的顺序,所以如果你把它放在最后它总是会得到 运行(一些中间件可以决定短路,否则 return 一个响应,所以在它后面有任何东西可能会阻止它 运行ning)。
MIDDLEWARE = [
...
'path.to.Log500ErrorsMiddleware',
]
为了记录触发服务器错误 500 的“某些依赖性,某处深层”错误,由于 DEBUG=False
,生产实例的控制台日志中没有堆栈跟踪,我实现了标准的自定义 500 处理程序关于为 500 错误打印堆栈跟踪的大量 Whosebug 问题推荐:
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 错误 return 代码路径的情况下侦听 500 事件?
与其创建自定义 500 处理程序,不如创建一个自己的 custom middleware 并在其中实现一个 process_exception
方法:
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
然后将它添加到 MIDDLEWARE
设置,一直到最后,因为在 response/exception 阶段中间件是 运行 自下而上的顺序,所以如果你把它放在最后它总是会得到 运行(一些中间件可以决定短路,否则 return 一个响应,所以在它后面有任何东西可能会阻止它 运行ning)。
MIDDLEWARE = [
...
'path.to.Log500ErrorsMiddleware',
]