Spaces:
Paused
Paused
File size: 1,077 Bytes
ec17af3 | 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 27 28 29 30 31 32 | import json
import logging
import time
from collections.abc import Callable
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.requests import Request
from starlette.responses import Response
logger = logging.getLogger("speech_machine.access")
class StructuredLoggingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next: Callable) -> Response:
start = time.perf_counter()
response = await call_next(request)
duration_ms = round((time.perf_counter() - start) * 1000, 2)
payload = {
"method": request.method,
"path": request.url.path,
"status": response.status_code,
"duration_ms": duration_ms,
"client_ip": request.client.host if request.client else None,
}
if response.status_code >= 500:
logger.error(json.dumps(payload))
elif response.status_code >= 400:
logger.warning(json.dumps(payload))
else:
logger.info(json.dumps(payload))
return response
|