File size: 955 Bytes
78013c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import time
from fastapi import Request, Response
from starlette.middleware.base import BaseHTTPMiddleware
from app.core.logging_config import get_logger

logger = get_logger("app.access")


class RequestLoggingMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next) -> Response:
        start_ts = time.perf_counter()
        method = request.method
        path = request.url.path

        try:
            response: Response = await call_next(request)
        except Exception as exc:
            elapsed_ms = int((time.perf_counter() - start_ts) * 1000)
            logger.error("%s %s — %dms | error=%s", method, path, elapsed_ms, exc, exc_info=True)
            raise

        elapsed_ms = int((time.perf_counter() - start_ts) * 1000)
        log = logger.warning if response.status_code >= 400 else logger.info
        log("%s %s %d %dms", method, path, response.status_code, elapsed_ms)
        return response