fastcheck/fastcheck_api/app/middleware/request_logging.py
2026-04-16 12:05:29 -04:00

38 lines
1.1 KiB
Python

from __future__ import annotations
import logging
import time
import uuid
from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.responses import Response
logger = logging.getLogger("fastcheck.request")
class RequestLoggingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
request_id = request.headers.get("x-request-id") or str(uuid.uuid4())
request.state.request_id = request_id
start = time.perf_counter()
status_code = None
try:
response: Response = await call_next(request)
status_code = response.status_code
finally:
duration_ms = int((time.perf_counter() - start) * 1000)
logger.info(
"request",
extra={
"request_id": request_id,
"method": request.method,
"path": request.url.path,
"status_code": status_code,
"duration_ms": duration_ms,
},
)
response.headers["x-request-id"] = request_id
return response