A reusable Django app for asynchronous, thread-safe logging with rich metadata, admin interface, and API support.
Project description
Django Async Logger
A reusable Django app that provides asynchronous logging functionality using a separate thread to avoid blocking the main application.
Features
- Asynchronous Logging: All log operations run in a separate thread
- Thread-Safe: Uses a queue system for thread-safe logging
- Rich Metadata: Captures module, function, line number, user ID, request ID, and extra data
- Admin Interface: Beautiful Django admin interface for viewing and managing logs
- API Endpoints: REST API for external logging
- Middleware: Automatic request logging with unique request IDs
- Decorators: Utility decorators for function logging and performance monitoring
- Context Managers: Easy-to-use context managers for operation logging
- Configurable: Customizable queue size, flush intervals, and cleanup policies
Installation
- Add the app to your Django project:
INSTALLED_APPS = [
# ...
'logq',
]
- Add the middleware to your settings:
MIDDLEWARE = [
# ...
'logq.middleware.AsyncLoggingMiddleware',
]
- Run migrations:
python manage.py makemigrations logq
python manage.py migrate
- (Optional) Configure logging settings:
ASYNC_LOGGING_CONFIG = {
'MAX_QUEUE_SIZE': 1000,
'FLUSH_INTERVAL': 1.0, # seconds
'AUTO_CLEANUP_DAYS': 30,
'ENABLE_REQUEST_LOGGING': True,
'IGNORE_PATHS': ['/admin/'], # paths to ignore for request logging
}
Usage
Basic Logging
from logq.async_logger import get_async_logger
logger = get_async_logger()
# Different log levels
logger.debug("Debug message")
logger.info("Info message")
logger.warning("Warning message")
logger.error("Error message")
logger.critical("Critical message")
# With extra data
logger.info("User action", extra_data={'action': 'login', 'ip': '192.168.1.1'})
# Log exceptions
try:
# some code that might fail
pass
except Exception as e:
logger.exception("An error occurred", exc_info=str(e))
Function Decorators
from logq.utils import log_function_call, log_performance
@log_function_call
def my_function():
return "result"
@log_function_call(level='DEBUG')
def debug_function():
return "debug result"
@log_performance(threshold_seconds=0.5)
def slow_function():
time.sleep(1)
return "slow result"
Context Managers
from logq.utils import LogContext
with LogContext("Processing data", level='INFO'):
# do some work
time.sleep(0.1)
# automatically logs start and completion with timing
API Logging
import requests
import json
# Log via API
data = {
'level': 'INFO',
'message': 'External log message',
'extra_data': {'source': 'external_service'}
}
response = requests.post(
'http://your-domain/logq/api/log/',
data=json.dumps(data),
headers={'Content-Type': 'application/json'}
)
# Retrieve logs via API
response = requests.get('http://your-domain/logq/api/logs/?limit=10')
logs = response.json()['logs']
Admin Interface
Access the admin interface at /admin/ to view and manage logs. Features include:
- Filter by level, module, timestamp, user ID
- Search by message, module, function, request ID
- View extra data in formatted JSON
- Delete old logs
- Export functionality
Management Commands
Clean old logs:
# Delete logs older than 30 days
python manage.py clean_logs
# Delete logs older than 7 days
python manage.py clean_logs --days 7
# Delete only DEBUG and INFO logs older than 30 days
python manage.py clean_logs --level INFO
# Dry run to see what would be deleted
python manage.py clean_logs --dry-run
Configuration Options
| Setting | Default | Description |
|---|---|---|
MAX_QUEUE_SIZE |
1000 | Maximum number of log entries in the queue |
FLUSH_INTERVAL |
1.0 | How often to flush logs to database (seconds) |
AUTO_CLEANUP_DAYS |
30 | Days to keep logs before auto-cleanup |
ENABLE_REQUEST_LOGGING |
True | Whether to log all HTTP requests |
Model Fields
The LogEntry model includes:
timestamp: When the log was createdlevel: Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)message: The log messagemodule: Python module where the log originatedfunction: Function name where the log originatedline_number: Line number where the log originateduser_id: ID of the user (if authenticated)request_id: Unique request identifierextra_data: Additional JSON datacreated_at: When the entry was saved to database
Performance Considerations
- The logger runs in a separate thread and won't block your main application
- Log entries are batched and written to the database periodically
- If the queue is full, new entries are dropped (with console fallback)
- Consider setting up database indexes for better query performance
- Use the cleanup command regularly to prevent database bloat
Thread Safety
The logger is completely thread-safe:
- Uses a thread-safe queue for communication
- Database operations are wrapped in transactions
- Multiple threads can safely call the logger simultaneously
Customization
You can extend the logger by:
- Creating custom log levels
- Adding new fields to the LogEntry model
- Customizing the admin interface
- Adding new API endpoints
- Creating custom middleware
Troubleshooting
Logs not appearing
- Check that the async logger thread is running
- Verify database migrations are applied
- Check for any database connection issues
Performance issues
- Reduce
FLUSH_INTERVALfor more frequent writes - Increase
MAX_QUEUE_SIZEfor higher throughput - Add database indexes for frequently queried fields
Memory usage
- Reduce
MAX_QUEUE_SIZEif memory is a concern - Run cleanup commands more frequently
- Monitor database size and clean old logs
License
This project is open source and available under the MIT License.
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 djlogq-1.0.0.tar.gz.
File metadata
- Download URL: djlogq-1.0.0.tar.gz
- Upload date:
- Size: 12.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb19abfb57b6b73546f831e874ff6a17a298f25338bc6bcb176d0ce4e35f0bcb
|
|
| MD5 |
bbf723f5ad6a142b47260041c4e6b7de
|
|
| BLAKE2b-256 |
7de5aabaa58c56fdf10fd49227711f806021174c5a3e421959ca71c80cf25c0b
|
File details
Details for the file djlogq-1.0.0-py3-none-any.whl.
File metadata
- Download URL: djlogq-1.0.0-py3-none-any.whl
- Upload date:
- Size: 15.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8156ec294e7e1ac6920b291dc063fc43bd2f15df57c161fc6f4fb6e024627482
|
|
| MD5 |
f69cb9b10133e3dbb5c7c08ec14d339f
|
|
| BLAKE2b-256 |
d11edf94e3c0949618e8965d9c35a9e3df319b99377c4989fea56721e5b616b7
|