import json from fastapi import Request from starlette.middleware.base import BaseHTTPMiddleware from app.log.logger import get_request_logger logger = get_request_logger() # 添加中间件类 class RequestLoggingMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next): # 记录请求路径 logger.info(f"Request path: {request.url.path}") # 获取并记录请求体 try: body = await request.body() if body: body_str = body.decode() # 尝试格式化JSON try: formatted_body = json.loads(body_str) logger.info( f"Formatted request body:\n{json.dumps(formatted_body, indent=2, ensure_ascii=False)}" ) except json.JSONDecodeError: logger.error("Request body is not valid JSON.") except Exception as e: logger.error(f"Error reading request body: {str(e)}") # 重置请求的接收器,以便后续处理器可以继续读取请求体 async def receive(): return {"type": "http.request", "body": body, "more_body": False} request._receive = receive response = await call_next(request) return response