Files
orion/middleware/logging_middleware.py
2025-09-13 21:58:54 +02:00

48 lines
1.4 KiB
Python

# middleware/logging_middleware.py
import logging
import time
from typing import Callable
from fastapi import Request, Response
from starlette.middleware.base import BaseHTTPMiddleware
logger = logging.getLogger(__name__)
class LoggingMiddleware(BaseHTTPMiddleware):
"""Middleware for request/response logging and performance monitoring"""
async def dispatch(self, request: Request, call_next: Callable) -> Response:
# Start timing
start_time = time.time()
# Log request
client_ip = request.client.host if request.client else "unknown"
logger.info(f"Request: {request.method} {request.url.path} from {client_ip}")
# Process request
try:
response = await call_next(request)
# Calculate duration
duration = time.time() - start_time
# Log response
logger.info(
f"Response: {response.status_code} for {request.method} {request.url.path} "
f"({duration:.3f}s)"
)
# Add performance headers
response.headers["X-Process-Time"] = str(duration)
return response
except Exception as e:
duration = time.time() - start_time
logger.error(
f"Error: {str(e)} for {request.method} {request.url.path} "
f"({duration:.3f}s)"
)
raise