from __future__ import annotations import time import structlog from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint from starlette.requests import Request from starlette.responses import Response logger = structlog.get_logger("request") class RequestLoggingMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response: start = time.perf_counter() response = await call_next(request) elapsed_ms = round((time.perf_counter() - start) * 1000, 2) logger.info( "request", method=request.method, path=request.url.path, status=response.status_code, elapsed_ms=elapsed_ms, ) return response