Tutorials and Community Snippets
These examples are safe to adapt for blog posts, Stack Overflow answers, internal runbooks, and video tutorials. They avoid direct identities and real secrets.
Log All DRF API Requests Safely
Use this setup when the team wants DRF request/response logs in Django admin:
INSTALLED_APPS = [
# ...
"drf_api_logger",
]
MIDDLEWARE = [
# ...
"drf_api_logger.middleware.api_logger_middleware.APILoggerMiddleware",
]
DRF_API_LOGGER_DATABASE = True
DRF_API_LOGGER_EXCLUDE_KEYS = [
"password",
"token",
"access",
"refresh",
"secret",
"api_key",
"client_secret",
]
DRF_API_LOGGER_MAX_REQUEST_BODY_SIZE = 32768
DRF_API_LOGGER_MAX_RESPONSE_BODY_SIZE = 65536
python manage.py migrate
Find Slow APIs
Start by flagging slow API calls:
DRF_API_LOGGER_SLOW_API_ABOVE = 200
For a deeper diagnosis, enable sampled profiling:
DRF_API_LOGGER_ENABLE_PROFILING = True
DRF_API_LOGGER_PROFILING_SQL_TRACKING = True
DRF_API_LOGGER_PROFILING_SAMPLE_RATE = 0.1
Review SQL time and query count in the admin detail page. High query count with high SQL time usually points to an N+1 pattern. Few queries with high SQL time usually points to indexes, query plans, or database pressure.
Mask Secrets
Default masking covers common credential-bearing keys and headers. Add application-specific keys:
DRF_API_LOGGER_EXCLUDE_KEYS = [
"password",
"token",
"access",
"refresh",
"secret",
"api_key",
"client_secret",
"account_identifier",
"billing_reference",
]
Example masked payload:
{
"username": "example_user",
"api_key": "***FILTERED***",
"billing_reference": "***FILTERED***",
}
Schedule Retention
Run a dry run first:
python manage.py prune_api_logs --days 30 --dry-run
Then schedule batched deletion through cron, Kubernetes CronJob, Celery beat, or the deployment platform scheduler:
python manage.py prune_api_logs --days 30 --batch-size 1000
Debug with Trace IDs
Generate trace IDs automatically:
DRF_API_LOGGER_ENABLE_TRACING = True
Or use an upstream request ID:
DRF_API_LOGGER_ENABLE_TRACING = True
DRF_API_LOGGER_TRACING_ID_HEADER_NAME = "X-Request-ID"
Log the same ID in application code:
import logging
logger = logging.getLogger(__name__)
def example_view(request):
tracing_id = getattr(request, "tracing_id", "missing")
logger.info("example_view started", extra={"tracing_id": tracing_id})
Correlate Logs Without Persisting IDs
Use request correlation when application logs, gateway IDs, and metrics need to line up, but the log table should keep its existing schema.
DRF_API_LOGGER_SIGNAL = True
DRF_API_LOGGER_ENABLE_CORRELATION = True
DRF_API_LOGGER_ENABLE_LOGGING_CONTEXT = True
DRF_API_LOGGER_CORRELATION_REQUEST_ID_HEADERS = ["X-Request-ID", "X-Correlation-ID"]
DRF_API_LOGGER_CORRELATION_TRACE_ID_HEADERS = ["traceparent", "X-Trace-ID"]
from drf_api_logger import API_LOGGER_SIGNAL
def send_metrics(**kwargs):
labels = kwargs.get("low_cardinality", {})
metrics.count(
"drf_api_logger.request",
tags={
"route": labels.get("route"),
"status_class": labels.get("status_class"),
},
)
API_LOGGER_SIGNAL.listen += send_metrics
Correlation adds correlation and low_cardinality to signal payloads and
sets request attributes such as request.api_logger_request_id. It does not
add model fields, migrations, admin columns, database indexes, or extra queued
database payload fields.
Community Snippets
Stack Overflow answer shape:
Install drf-api-logger, add drf_api_logger to INSTALLED_APPS, add APILoggerMiddleware to MIDDLEWARE, set DRF_API_LOGGER_DATABASE = True, configure DRF_API_LOGGER_EXCLUDE_KEYS and body limits, then run python manage.py migrate.
Blog outline:
1. Why custom DRF logging middleware leaks secrets and adds request latency.
2. Install drf-api-logger.
3. Enable database logging with masking and body limits.
4. Use admin filters to find failed or slow APIs.
5. Enable sampled profiling for SQL diagnosis.
6. Schedule prune_api_logs for retention.
Video script outline:
Show a DRF endpoint, enable drf-api-logger, make a request with example payload data, inspect the masked log row in Django admin, enable slow API threshold, then finish with retention and tracing settings.