- Replace black, isort, and flake8 with Ruff (all-in-one linter and formatter) - Add comprehensive pyproject.toml configuration - Simplify Makefile code quality targets - Configure exclusions for venv/.venv in pyproject.toml - Auto-fix 1,359 linting issues across codebase Benefits: - Much faster builds (Ruff is written in Rust) - Single tool replaces multiple tools - More comprehensive rule set (UP, B, C4, SIM, PIE, RET, Q) - All configuration centralized in pyproject.toml - Better import sorting and formatting consistency 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
57 lines
1.5 KiB
Python
57 lines
1.5 KiB
Python
# middleware/logging_middleware.py
|
|
"""Summary description ....
|
|
|
|
This module provides classes and functions for:
|
|
- ....
|
|
- ....
|
|
- ....
|
|
"""
|
|
|
|
import logging
|
|
import time
|
|
from collections.abc 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:
|
|
"""Dispatch."""
|
|
# 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
|