# middleware/logging_middleware.py """Summary description .... This module provides classes and functions for: - .... - .... - .... """ import logging import time from collections.abc import Callable from fastapi import Request, Response from starlette.middleware.base import BaseHTTPMiddleware logger = logging.getLogger(__name__) class LoggingMiddleware(BaseHTTPMiddleware): """Middleware for request/response logging and performance monitoring.""" async def dispatch(self, request: Request, call_next: Callable) -> Response: """Dispatch.""" # Start timing start_time = time.time() # Log request client_ip = request.client.host if request.client else "unknown" logger.info(f"Request: {request.method} {request.url.path} from {client_ip}") # Process request try: response = await call_next(request) # Calculate duration duration = time.time() - start_time # Log response logger.info( f"Response: {response.status_code} for {request.method} {request.url.path} " f"({duration:.3f}s)" ) # Add performance headers response.headers["X-Process-Time"] = str(duration) return response except Exception as e: duration = time.time() - start_time logger.error( f"Error: {str(e)} for {request.method} {request.url.path} " f"({duration:.3f}s)" ) raise