A Django application that logs HTTP 500 errors with detailed context
Project description
Django Error Logger
A Django application that logs HTTP 500 errors to the database, capturing detailed context including user information, request details, and POST data.
Features
- Automatic Error Logging: Captures all unhandled exceptions (HTTP 500 errors)
- User Context: Logs the authenticated user when the error occurred
- Request Details: Captures path, method, headers, IP address, and query string
- POST Data Logging: Saves POST/PUT/PATCH payloads with sensitive field redaction
- Large Payload Protection: Filters out POST payloads larger than 100KB
- HTML Traceback: Stores Django's debug error page HTML for detailed debugging
- User Impersonation: Link to impersonate the user and reproduce the error (optional)
- Django Admin Integration: View and manage error logs through Django admin
Installation
From Source (for including in another project)
-
Copy the
error_loggerdirectory to your project -
Add
error_loggerto yourINSTALLED_APPS:
INSTALLED_APPS = [
# ...
'error_logger',
]
- Add the middleware to
MIDDLEWARE(near the end):
MIDDLEWARE = [
# ... other middleware ...
'error_logger.middleware.ErrorLoggingMiddleware',
]
- (Optional) Install
django-sufor user impersonation feature:
pip install django-su
Then add to INSTALLED_APPS:
INSTALLED_APPS = [
# ...
'django_su',
'error_logger',
]
And include django-su URLs:
urlpatterns = [
# ...
path('su/', include('django_su.urls')),
]
- Include the URLs in your main
urls.py:
urlpatterns = [
# ...
path('error-logger/', include('error_logger.urls')),
]
- Run migrations:
python manage.py makemigrations error_logger
python manage.py migrate error_logger
Configuration
Sensitive Fields
The following fields are automatically redacted in POST data logs:
password,password1,password2,old_password,new_passwordtoken,access_token,refresh_token,api_key,secretcredit_card,cvv,ssn,pin
You can customize this list in middleware.py:
SENSITIVE_FIELDS = [
'password', 'token', 'api_key', 'secret',
# Add your custom sensitive fields here
]
POST Data Size Limit
By default, POST payloads larger than 100KB are not logged in full. You can adjust this in middleware.py:
MAX_POST_SIZE = 100 * 1024 # 100KB (default)
# MAX_POST_SIZE = 1024 * 1024 # 1MB
Usage
Django Admin
Access the error logs through Django admin at /admin/error_logger/errorlog/
Features:
- List view with error type, time, user, path, and method
- Filter by error type, time, and method
- Search by error message, path, or username
- Detail view with full traceback and HTML error page
- "Open in Full Page" button to view the HTML traceback
- "Impersonate and visit error page" button (requires
django_su)
Test Endpoints
⚠️ Important: These endpoints should only be accessible in development/testing environments. Remove or restrict access in production.
Access these endpoints at /error-logger/test/:
1. Simple 500 Error
URL: /error-logger/test/500/
Triggers a ZeroDivisionError to test basic error logging.
curl http://localhost:8000/error-logger/test/500/
2. ValueError Test
URL: /error-logger/test/value-error/
Triggers a ValueError with a custom message.
curl http://localhost:8000/error-logger/test/value-error/
3. KeyError Test
URL: /error-logger/test/key-error/
Triggers a KeyError by accessing a non-existent dictionary key.
curl http://localhost:8000/error-logger/test/key-error/
4. POST Error Test
URL: /error-logger/test/post-error/
Tests error logging with POST data including sensitive fields (password, token).
Form Fields:
username: Regular text fieldpassword: Will be redacted in logsemail: Email fieldtoken: Will be redacted in logs
Usage:
- Visit the URL in your browser
- Fill out the form (pre-populated with test data)
- Submit the form to trigger an error
- Check Django admin to see POST data with sensitive fields redacted
cURL Example:
curl -X POST http://localhost:8000/error-logger/test/post-error/ \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=testuser&password=secret123&email=test@example.com&token=abc123"
5. Large POST Error Test
URL: /error-logger/test/large-post-error/
Tests error logging with a large POST payload (150KB) that exceeds the logging limit.
Form Fields:
username: Regular text fieldpassword: Will be redacted in logslarge_field: Pre-filled with 150KB of data
Usage:
- Visit the URL in your browser
- Submit the form (large_field is pre-populated)
- Check Django admin to see that POST data size is logged but content is not
Expected Result:
The error log's additional_info should contain:
{
"post_data": {
"error": "POST payload too large to log",
"size_bytes": 153600,
"size_kb": 150.0,
"size_mb": 0.15
}
}
Model Structure
ErrorLog Model
| Field | Type | Description |
|---|---|---|
user |
ForeignKey | User who encountered the error (null if anonymous) |
error_message |
TextField | Plain text exception message |
error_type |
CharField | Exception class name (e.g., "ValueError") |
traceback |
TextField | Plain text Python traceback |
html_traceback |
TextField | HTML version of Django's debug page |
error_time |
DateTimeField | When the error occurred |
path |
CharField | Request path |
method |
CharField | HTTP method (GET, POST, etc.) |
user_agent |
CharField | User's browser/client |
ip_address |
GenericIPAddressField | Client IP address |
query_string |
TextField | URL query parameters |
additional_info |
JSONField | POST data and request headers |
Security Considerations
- Sensitive Data: Always review the
SENSITIVE_FIELDSlist to ensure all sensitive data in your application is redacted - Access Control: Error logs contain sensitive information. Ensure only authorized users (admin group) can access them
- Test Endpoints: Remove or restrict access to test endpoints in production
- Database Storage: Error logs can accumulate. Implement a cleanup strategy (e.g., delete logs older than 90 days)
- HTML Traceback: Contains full request context. Ensure admin access is properly secured
Cleanup Strategy
Add a management command to clean up old error logs:
python manage.py shell
>>> from error_logger.models import ErrorLog
>>> from django.utils import timezone
>>> from datetime import timedelta
>>> cutoff_date = timezone.now() - timedelta(days=90)
>>> ErrorLog.objects.filter(error_time__lt=cutoff_date).delete()
Requirements
- Django 3.2+
- Python 3.8+
django_su(for user impersonation feature)
License
AGPL-3.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_error_logger-1.0.0.tar.gz.
File metadata
- Download URL: django_error_logger-1.0.0.tar.gz
- Upload date:
- Size: 25.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
950b21ef07759939d697010f39b70cc2eb942c950415d63241a10e5669ed4590
|
|
| MD5 |
10dd594666e9b0d12df35c3351be6783
|
|
| BLAKE2b-256 |
a14c6aa5061396c7a155b940bfd9b37496d16e9ce84aeed2af6a22f7e6b18161
|
File details
Details for the file django_error_logger-1.0.0-py3-none-any.whl.
File metadata
- Download URL: django_error_logger-1.0.0-py3-none-any.whl
- Upload date:
- Size: 28.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6fcdb379355149c416fca591ca16cecc7c16a74560839495cfde44e2dad5e73
|
|
| MD5 |
f46a0361571eeb8d4aa5d149dc603763
|
|
| BLAKE2b-256 |
f91f267d7b6ba2f3393e8747d72751ea2a77bbf584f36d755ef2ac2f778f35ec
|