Spaces:
Sleeping
Sleeping
File size: 2,308 Bytes
f171e60 | 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | import time
import uuid
from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware
from app.utils.logger import logger
class RequestLoggingMiddleware(BaseHTTPMiddleware):
"""
Middleware để log mọi request và response
"""
async def dispatch(self, request: Request, call_next):
# Generate request ID
request_id = str(uuid.uuid4())
request.state.request_id = request_id
# Log request
logger.info(
f"Request started: {request.method} {request.url.path}",
extra={
"request_id": request_id,
"method": request.method,
"path": request.url.path,
"client": request.client.host if request.client else None
}
)
# Measure time
start_time = time.time()
# Process request
try:
response = await call_next(request)
process_time = time.time() - start_time
# Log response
logger.info(
f"Request completed: {request.method} {request.url.path} - Status: {response.status_code}",
extra={
"request_id": request_id,
"method": request.method,
"path": request.url.path,
"status_code": response.status_code,
"process_time": f"{process_time:.3f}s"
}
)
# Add request ID to response headers
response.headers["X-Request-ID"] = request_id
response.headers["X-Process-Time"] = f"{process_time:.3f}s"
return response
except Exception as e:
process_time = time.time() - start_time
# Log error
logger.error(
f"Request failed: {request.method} {request.url.path}",
extra={
"request_id": request_id,
"method": request.method,
"path": request.url.path,
"error": str(e),
"process_time": f"{process_time:.3f}s"
},
exc_info=True
)
raise |