import time import logging from starlette.middleware.base import BaseHTTPMiddleware from starlette.requests import Request logger = logging.getLogger("geo.access") class RequestLoggingMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next): start_time = time.time() client_ip = request.client.host if request.client else "unknown" response = await call_next(request) duration = round((time.time() - start_time) * 1000, 2) logger.info( f"{request.method} {request.url.path} " f"status={response.status_code} " f"duration={duration}ms " f"ip={client_ip}" ) return response