""" Logging middleware for gateway """ import logging import time from fastapi import Request from starlette.middleware.base import BaseHTTPMiddleware from starlette.responses import Response import uuid logger = logging.getLogger(__name__) class LoggingMiddleware(BaseHTTPMiddleware): """Logging middleware class""" async def dispatch(self, request: Request, call_next) -> Response: """Process request with logging""" start_time = time.time() # Generate request ID request_id = str(uuid.uuid4()) request.state.request_id = request_id # Log request logger.info( f"Request: {request.method} {request.url.path}", extra={ "method": request.method, "url": request.url.path, "query_params": str(request.query_params), "client_host": request.client.host if request.client else "unknown", "user_agent": request.headers.get("user-agent", ""), "request_id": request_id } ) # Process request response = await call_next(request) # Calculate duration duration = time.time() - start_time # Log response logger.info( f"Response: {response.status_code} in {duration:.3f}s", extra={ "status_code": response.status_code, "duration": duration, "method": request.method, "url": request.url.path, "request_id": request_id } ) return response