显示堆栈
This commit is contained in:
39
utils/debug_middleware.py
Normal file
39
utils/debug_middleware.py
Normal file
@@ -0,0 +1,39 @@
|
||||
"""
|
||||
调试中间件 — 捕获所有 500 错误并打印完整堆栈到日志
|
||||
仅在测试阶段使用,上线前移除
|
||||
"""
|
||||
import logging
|
||||
import traceback
|
||||
|
||||
logger = logging.getLogger('django')
|
||||
|
||||
|
||||
class DebugExceptionMiddleware:
|
||||
"""捕获所有未处理异常,打印完整堆栈到 gunicorn 日志"""
|
||||
|
||||
def __init__(self, get_response):
|
||||
self.get_response = get_response
|
||||
|
||||
def __call__(self, request):
|
||||
response = self.get_response(request)
|
||||
if response.status_code == 500:
|
||||
logger.error(
|
||||
f"[500] {request.method} {request.path} "
|
||||
f"user={getattr(request.user, 'UserName', 'anon')}"
|
||||
)
|
||||
return response
|
||||
|
||||
def process_exception(self, request, exception):
|
||||
"""未处理异常 — 打印完整堆栈"""
|
||||
tb = traceback.format_exc()
|
||||
user_info = getattr(request.user, 'UserName', 'anon')
|
||||
logger.error(
|
||||
f"\n{'='*60}\n"
|
||||
f"[EXCEPTION] {request.method} {request.path}\n"
|
||||
f"User: {user_info}\n"
|
||||
f"Type: {type(exception).__name__}: {exception}\n"
|
||||
f"{'='*60}\n"
|
||||
f"{tb}\n"
|
||||
f"{'='*60}"
|
||||
)
|
||||
return None # 返回 None 让 Django 继续正常异常处理流程
|
||||
Reference in New Issue
Block a user