from __future__ import annotations import logging import time from starlette.middleware.base import BaseHTTPMiddleware from starlette.requests import Request from starlette.responses import Response logger = logging.getLogger("api.access") class RequestLoggingMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next) -> Response: start = time.time() response = await call_next(request) duration = (time.time() - start) * 1000 logger.info( f"{request.method} {request.url.path} " f"status={response.status_code} " f"duration={duration:.1f}ms" ) return response