Python logging handlers for AppSignal with HTTP and NDJSON support
Project description
AppSignal Logging for Python
Python logging handlers for AppSignal with support for both simple HTTP and high-performance NDJSON batch endpoints.
Features
- 🚀 Two handler types: Simple HTTP and batched NDJSON
- 📦 Automatic batching: Efficiently send multiple logs in a single request
- ⚡ High performance: Up to 10x faster than sending individual logs
- 🔄 Async worker thread: Non-blocking log transmission
- 🛡️ Error handling: Graceful failure with stderr logging
- 🏷️ Structured logging: Support for custom attributes
- 📝 Type hints: Full type annotation support
- ✅ Well tested: Comprehensive test suite
Installation
pip install appsignal-logging
Quick Start
Simple HTTP Handler
Best for low-frequency logging (<10 logs/sec):
import logging
from appsignal_logging import AppSignalHTTPHandler
handler = AppSignalHTTPHandler(
api_key="your_api_key",
app_name="my_app",
hostname="web-server-1"
)
logger = logging.getLogger()
logger.addHandler(handler)
logger.setLevel(logging.INFO)
logger.info("User logged in", extra={"user_id": 123, "ip": "192.168.1.1"})
NDJSON Handler (Recommended for Production)
Best for high-frequency logging (>100 logs/sec):
import logging
from appsignal_logging import AppSignalNDJSONHandler
handler = AppSignalNDJSONHandler(
api_key="your_api_key",
app_name="my_app",
hostname="web-server-1",
batch_size=100, # Send every 100 logs
flush_interval=5.0 # Or every 5 seconds
)
logger = logging.getLogger()
logger.addHandler(handler)
logger.setLevel(logging.INFO)
logger.info("User logged in", extra={"user_id": 123, "ip": "192.168.1.1"})
Handler Comparison
| Feature | HTTP Handler | NDJSON Handler |
|---|---|---|
| Requests per 1000 logs | 1000 | 10-20 |
| Latency | ~0.5s | 0-5s |
| Memory usage | Low | Medium |
| Network load | High | Low |
| Performance | Low at >100 logs/sec | High |
| Best for | Dev/Low traffic | Production/High traffic |
Configuration Options
AppSignalHTTPHandler
AppSignalHTTPHandler(
api_key: str, # Required: Your AppSignal API key
app_name: str = None, # Optional: Application name
hostname: str = None, # Optional: Hostname (auto-detected if not provided)
level: int = logging.NOTSET # Optional: Minimum log level
)
AppSignalNDJSONHandler
AppSignalNDJSONHandler(
api_key: str, # Required: Your AppSignal API key
app_name: str = None, # Optional: Application name
hostname: str = None, # Optional: Hostname (auto-detected if not provided)
level: int = logging.NOTSET, # Optional: Minimum log level
batch_size: int = 100, # Optional: Logs per batch (default: 100)
flush_interval: float = 5.0 # Optional: Flush interval in seconds (default: 5.0)
)
Advanced Usage
Custom Attributes
Add custom attributes to your logs using the extra parameter:
logger.info(
"Payment processed",
extra={
"user_id": 123,
"amount": 99.99,
"currency": "USD",
"transaction_id": "txn_123456"
}
)
Multiple Handlers
Use different handlers for different log levels:
# Critical errors go immediately via HTTP
critical_handler = AppSignalHTTPHandler(
api_key="your_api_key",
app_name="my_app"
)
critical_handler.setLevel(logging.ERROR)
# Info logs batched via NDJSON
info_handler = AppSignalNDJSONHandler(
api_key="your_api_key",
app_name="my_app",
batch_size=200
)
info_handler.setLevel(logging.INFO)
logger = logging.getLogger()
logger.addHandler(critical_handler)
logger.addHandler(info_handler)
Django Integration
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'appsignal': {
'class': 'appsignal_logging.AppSignalNDJSONHandler',
'api_key': 'your_api_key',
'app_name': 'myapp',
'level': 'INFO',
'batch_size': 100,
'flush_interval': 5.0,
},
},
'root': {
'handlers': ['appsignal'],
'level': 'INFO',
},
}
Requirements
- Python 3.8+
- httpx >= 0.24.0
Development
# Clone the repository
git clone https://github.com/yourusername/appsignal-logging-python.git
cd appsignal-logging-python
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run tests with coverage
pytest --cov=appsignal_logging --cov-report=html
# Format code
black src tests
# Lint code
ruff check src tests
# Type check
mypy src
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Links
Acknowledgments
- Built for AppSignal
- Inspired by the need for efficient Python logging in production environments
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 appsignal_logging-0.1.1.tar.gz.
File metadata
- Download URL: appsignal_logging-0.1.1.tar.gz
- Upload date:
- Size: 12.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44f3d3153dace232b747781c7c7824396444f06ae8d6bdb44a0840b4e1324cf3
|
|
| MD5 |
8d6eaa590d4805c62ef4fd6780a50e25
|
|
| BLAKE2b-256 |
1da83d846559f513d59e2002d437c1cfd889313080a9744226c305c3919886e3
|
File details
Details for the file appsignal_logging-0.1.1-py3-none-any.whl.
File metadata
- Download URL: appsignal_logging-0.1.1-py3-none-any.whl
- Upload date:
- Size: 7.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
137b1d274558cac02bb9a338115a7ed23f2d3821c90e3d65f3ff3ccc7ed6b88f
|
|
| MD5 |
6319df46380745084ee30db06c0b187e
|
|
| BLAKE2b-256 |
06ad491302b7c105e48bb368c664671c0b89e143255776b83acb70b13c326487
|