This project has been archived by its maintainers, and is no longer receiving any updates.
commonlog (Python)
A unified logging and alerting library for Python, supporting Slack and Lark integrations via WebClient and Webhook. Features configurable providers, alert levels, and file attachment support.
Installation
Install via pip:
pip install commonlog
Or copy the python/ directory to your project.
Usage
from python import commonlog, Config, SendMethod, AlertLevel, Attachment, LarkToken
# Configure logger
config = Config(
provider="lark", # or "slack"
send_method=SendMethod.WEBCLIENT,
token="app_id++app_secret", # for Lark, use "app_id++app_secret" format
slack_token="xoxb-your-slack-token", # dedicated Slack token
lark_token=LarkToken(app_id="your-app-id", app_secret="your-app-secret"), # dedicated Lark token
channel="your_lark_channel_id",
redis_host="localhost", # required for Lark
redis_port="6379", # required for Lark
)
logger = commonlog(config)
# Send error with attachment
try:
logger.send(AlertLevel.ERROR, "System error occurred", Attachment(url="https://example.com/log.txt"))
except Exception as e:
print(f"Failed to send alert: {e}")
# Send info (logs only)
logger.send(AlertLevel.INFO, "Info message")
# Send to a specific channel
try:
logger.send_to_channel(AlertLevel.ERROR, "Send to another channel", channel="another-channel-id")
except Exception as e:
print(f"Failed to send alert: {e}")
# Send to a different provider dynamically
try:
logger.custom_send("slack", AlertLevel.ERROR, "Message via Slack", channel="slack-channel")
except Exception as e:
print(f"Failed to send alert: {e}")
Send Methods
commonlog supports two send methods: WebClient (API-based) and Webhook (simple HTTP POST).
WebClient Usage
WebClient uses the full API with authentication tokens:
config = Config(
provider="lark",
send_method=SendMethod.WEBCLIENT,
token="app_id++app_secret", # for Lark
slack_token="xoxb-your-slack-token", # for Slack
lark_token=LarkToken(app_id="your-app-id", app_secret="your-app-secret"),
channel="your_channel",
redis_host="localhost", # required for Lark
redis_port="6379",
)
Webhook Usage
Webhook is simpler and requires only a webhook URL:
config = Config(
provider="slack",
send_method=SendMethod.WEBHOOK,
token="https://hooks.slack.com/services/YOUR/WEBHOOK/URL",
channel="optional-channel-override", # optional
)
Lark Token Caching
When using Lark, the tenant_access_token is cached in Redis. The expiry is set dynamically from the API response minus 10 minutes. You must set redis_host and redis_port in your config.
Channel Mapping
You can configure different channels for different alert levels using a channel resolver:
from commonlog import commonlog, Config, SendMethod, AlertLevel, DefaultChannelResolver
# Create a channel resolver
resolver = DefaultChannelResolver(
channel_map={
AlertLevel.INFO: "#general",
AlertLevel.WARN: "#warnings",
AlertLevel.ERROR: "#alerts",
},
default_channel="#general"
)
# Create config with channel resolver
config = Config(
provider="slack",
send_method=SendMethod.WEBCLIENT,
token="xoxb-your-slack-bot-token",
channel_resolver=resolver,
service_name="user-service",
environment="production"
)
logger = commonlog(config)
# These will go to different channels based on level
logger.send(AlertLevel.INFO, "Info message") # goes to #general
logger.send(AlertLevel.WARN, "Warning message") # goes to #warnings
logger.send(AlertLevel.ERROR, "Error message") # goes to #alerts
Custom Channel Resolver
You can implement custom channel resolution logic:
class CustomResolver(ChannelResolver):
def resolve_channel(self, level):
if level == AlertLevel.ERROR:
return "#critical-alerts"
elif level == AlertLevel.WARN:
return "#monitoring"
else:
return "#general"
Configuration Options
Common Settings
- provider:
"slack"or"lark" - send_method:
"webclient"(token-based authentication) - channel: Target channel or chat ID (used if no resolver)
- channel_resolver: Optional resolver for dynamic channel mapping
- service_name: Name of the service sending alerts
- environment: Environment (dev, staging, production)
- debug:
Trueto enable detailed debug logging of all internal processes
Provider-Specific
- token: API token for WebClient authentication (required)
Alert Levels
- INFO: Logs locally only
- WARN: Logs + sends alert
- ERROR: Always sends alert
File Attachments
Provide a public URL. The library appends it to the message for simplicity.
attachment = Attachment(url="https://example.com/log.txt")
logger.send(AlertLevel.ERROR, "Error with log", attachment)
Trace Log Section
When include_trace is set to True, you can pass trace information as the fourth parameter to send():
trace = """Traceback (most recent call last):
File "app.py", line 10, in main
raise ValueError("Something went wrong")
ValueError: Something went wrong"""
logger.send(AlertLevel.ERROR, "System error occurred", None, trace)
This will format the trace as a code block in the alert message.
Testing
cd python
PYTHONPATH=.. python -m unittest test_commonlog.py
API Reference
Classes
Config: Configuration classAttachment: File attachment classProvider: Abstract base class for alert providerscommonlog: Main logger class
Constants
SendMethod.WEBCLIENT: Send method (token-based authentication)AlertLevel.INFO,AlertLevel.WARN,AlertLevel.ERROR: Alert levels
Methods
commonlog(config): Create a new loggercommonlog.send(level, message, attachment=None, trace=""): Send alert with optional trace
Metadata
Release files for commonlog 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| commonlog-0.2.0.tar.gz | 6.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| commonlog-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 14.4 kB
Release files / commonlog-0.2.0.tar.gz
| Download URL | commonlog-0.2.0.tar.gz |
|---|---|
| Size | 6.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
261237d5cc24aa4232a2b901088a39e3c8649d31ee492bf34d8545b73927f79d
|
|
BLAKE2b-256 checksum How to use checksums |
8c0b7dc71e45d7b4a46578ddb7c97e46fa1cd1fea01b4a17ebcafa248d997210
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / commonlog-0.2.0-py3-none-any.whl
| Download URL | commonlog-0.2.0-py3-none-any.whl |
|---|---|
| Size | 7.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3dec0389b02bb7075eb3c54d8a93bedce6101bdd9f205a4dc5eb6746b9a3c3ae
|
|
BLAKE2b-256 checksum How to use checksums |
518ab75c64964180f93b9edd2a438edff32471f4b7ecef7a3736c8a9187a67a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|