""" FastAPI middleware that logs method, path, status code, and duration for every request. """ import time import uuid from starlette.middleware.base import BaseHTTPMiddleware from starlette.requests import Request from starlette.responses import Response import logging logger = logging.getLogger("cbpoa.request") class RequestLoggerMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next) -> Response: request_id = str(uuid.uuid4()) request.state.request_id = request_id start = time.perf_counter() response = await call_next(request) duration_ms = round((time.perf_counter() - start) * 1000, 2) logger.info( "%s %s -> %s (%.2fms)", request.method, request.url.path, response.status_code, duration_ms, extra={ "request_id": request_id, "method": request.method, "path": request.url.path, "status_code": response.status_code, "duration_ms": duration_ms, }, ) return response