Skip to content

Commit 4d1adb8

Browse files
committed
fix: logging
1 parent 92b5b8c commit 4d1adb8

2 files changed

Lines changed: 16 additions & 0 deletions

File tree

backend/api/middleware/logging.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,15 @@
1212
class StructuredLoggingMiddleware(BaseHTTPMiddleware):
1313
"""Middleware that logs each request with a unique request ID and timing."""
1414

15+
EXCLUDED_PATHS = {"/api/v1/health", "/api/v1/ready", "/metrics"}
16+
1517
async def dispatch(
1618
self, request: Request, call_next: Callable[[Request], Awaitable[Response]]
1719
) -> Response:
1820
"""Process the request, inject a request ID, and log duration and status."""
21+
if request.url.path in self.EXCLUDED_PATHS:
22+
return await call_next(request)
23+
1924
request_id = request.headers.get("X-Request-ID", str(uuid.uuid4()))
2025

2126
# Bind request_id to the logger context for this specific request

backend/utils/logging.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33

44
import structlog
55

6+
_EXCLUDED_ACCESS_PATHS = {"/api/v1/health", "/api/v1/ready", "/metrics"}
7+
8+
9+
class _UvicornAccessFilter(logging.Filter):
10+
def filter(self, record: logging.LogRecord) -> bool:
11+
msg = record.getMessage()
12+
return not any(path in msg for path in _EXCLUDED_ACCESS_PATHS)
13+
614

715
def setup_logging() -> None:
816
"""Configure structlog for JSON output compatible with Loki/Grafana.
@@ -24,3 +32,6 @@ def setup_logging() -> None:
2432
)
2533
# Route standard library loggers (uvicorn, sqlalchemy, etc.) through structlog
2634
logging.basicConfig(format="%(message)s", stream=sys.stdout, level=logging.INFO)
35+
36+
# Suppress noisy access log lines for health/metrics endpoints
37+
logging.getLogger("uvicorn.access").addFilter(_UvicornAccessFilter())

0 commit comments

Comments
 (0)