middlewares/logging.py
¶
Item | Value |
---|---|
Layer | Middleware |
Responsibility | Implements FastAPI middleware for HTTP request/response logging with unique request IDs and timing, using loguru for all logging. |
Status | 🟢 Done |
1. Purpose¶
Adds a unique request ID to each HTTP request, logs request and response details (including timing), and attaches the request ID to logs and response headers for traceability.
2. Public API¶
Symbol | Type | Description |
---|---|---|
RequestLoggingMiddleware | class | FastAPI middleware for logging requests/responses |
get_request_id | function | Returns the current request ID for the active request |
Note: As of May 2025, all logging is handled via loguru. The previous
RequestIdFilter
is deprecated and no longer used. Structured logging is supported via loguru'sbind()
method.
3. Behaviour & Edge-Cases¶
- Each request gets a unique ID (or uses
X-Request-ID
header if provided). - Request ID is stored in a context variable for access throughout the request lifecycle.
- Middleware logs incoming requests, outgoing responses, and errors with timing and request context using loguru structured logging.
- Excludes certain paths (e.g.,
/health
,/metrics
) from logging by default. - Attaches request ID to response headers for client correlation.
- Handles context variable reset to avoid leaks between requests.
4. Dependencies¶
- Internal: None
- External:
loguru
(third-party)fastapi
,starlette
(for middleware and request/response handling)uuid
,contextvars
,time
(standard library)
5. Tests¶
Test file | Scenario |
---|---|
backend/tests/middlewares/test_logging.py | Tests request ID generation, logging, error handling, and propagation |
6. Security Considerations¶
- Middleware filters sensitive fields (e.g., password, token, access_token, refresh_token) from query parameters in logs.
- No sensitive data is ever logged in request/response logs.
- Tests verify that secrets are not leaked in logs.
7. Migration Notes¶
- All middleware logging is now handled by loguru. Use
from loguru import logger
andlogger.bind()
for structured context. - Example usage:
from loguru import logger
logger.bind(request_id="...").info("message")
- When adding new middleware or logging, always filter sensitive fields and add/extend tests as needed.
Update this page whenever the implementation changes.