A clean, customizable logging package with rich formatting, diagnostics, and rotating file output.
Project description
๐ชต Chronilog
Chronilog is a professional-grade logging package for Python. It brings structured logging, rotating files, Rich-powered console output, environment-aware configuration, and optional Sentry integration to your projects โ with zero hassle.
Designed for developers who want reliable logs, clean setup, and real-world flexibility.
๐ Features
- โ
ChroniLog(name)โ get a configured logger in one line - ๐จ Rich terminal output (emoji-safe, dark-theme friendly)
- ๐ Rotating file logs (path, size, backups all configurable)
- ๐ง Supports
.envand.chronilog.tomlfor layered config - ๐งช Diagnostic tools for troubleshooting setup issues
- ๐ Optional JSON logging support
- ๐ก๏ธ Optional Sentry integration for exception tracking
- ๐งฐ Developer-first: testable, extensible, production-ready
๐ฆ Installation
# Clone and install in editable mode (during development)
git clone https://github.com/yourname/chronilog
cd chronilog
pip install -e .
Add
chronilogto yourrequirements.txtorpyproject.tomlfor production use.
๐ What Is Chronilog?
Chronilog is a structured, reliable logging system built for real-world Python apps.
It eliminates guesswork around log setup, integrates rotating file logs, rich console formatting,
and includes optional diagnostics and error tracking โ all with sane defaults.
Use it in everything from CLI tools to production services.
๐ง Basic Usage
from chronilog import ChroniLog
log = ChroniLog("my_app")
log.info("๐ App started")
log.warning("โ ๏ธ Something might be wrong...")
log.error("โ An error occurred!")
Chronilog auto-configures sane defaults, file logging, and console formatting.
๐งฉ How It Works
Chronilog reads layered config in this order:
- Environment variables (
CHRONILOG_*) .chronilog.tomlfile (if present)- Internal fallback values
Then it builds:
- A rotating file handler (with custom path, size, backups)
- A rich console handler (with optional emoji fallback)
- An optional JSON or plain formatter
- A logger with the given name (e.g.
ChroniLog("my_app"))
๐ Understanding Log Levels
Chronilog uses Pythonโs standard logging levels:
| Level | Description |
|---|---|
| DEBUG | Verbose info for debugging |
| INFO | General status updates |
| WARNING | Recoverable issues or early warnings |
| ERROR | Errors that need attention |
| CRITICAL | Serious failure or crash |
You can set the level globally via:
.env:CHRONILOG_LOG_LEVEL=WARNING.toml:log_level = "ERROR"
โ๏ธ Configuration System
Chronilog supports layered configuration from:
.envโ for quick dev overrides.chronilog.tomlโ for structured project configs- Internal safe defaults โ as fallback
๐ง Example .env
CHRONILOG_LOG_PATH=logs/my_app.log
CHRONILOG_LOG_LEVEL=DEBUG
CHRONILOG_LOG_MAX_MB=5
CHRONILOG_LOG_BACKUP_COUNT=3
CHRONILOG_JSON=0
๐ง Example .chronilog.toml
log_path = "logs/chronilog.log"
log_level = "DEBUG"
max_log_file_size = 5
backup_count = 3
enable_console = true
emoji_fallback = true
enable_sentry = false
sentry_dsn = ""
sentry_level = "ERROR"
sentry_traces_sample_rate = 0.0
๐งฐ Advanced Usage
from chronilog import ChroniLog
from chronilog.core.formatter import PlainFormatter
log = ChroniLog(
name="myapp",
level=logging.INFO,
file_formatter=PlainFormatter(),
use_cache=False
)
๐ Parameters
| Argument | Type | Description |
|---|---|---|
name |
str |
Logger name (typically __name__) |
level |
int (opt) |
Custom log level (logging.DEBUG, etc) |
console_formatter |
Formatter |
Override console formatting |
file_formatter |
Formatter |
Override file formatting |
use_cache |
bool |
Whether to reuse logger instances by name |
๐ Log Path Defaults
Chronilog automatically chooses the most appropriate log path:
| OS | Path Location |
|---|---|
| Windows | %LOCALAPPDATA%\chronilog\logs\ |
| macOS | ~/Library/Logs/chronilog/ |
| Linux | ~/.local/share/chronilog/logs/ |
๐ ๏ธ How to Integrate Chronilog in Your Project
- Install Chronilog
- Create
.envor.chronilog.tomlin your project root - Add
from chronilog import ChroniLog - Use
log = ChroniLog(__name__) - Start logging with
log.info(...), etc.
That's it โ file and console logs will be active instantly.
๐ Environment Variables Reference
| Variable Name | Description |
|---|---|
| CHRONILOG_LOG_PATH | File log location |
| CHRONILOG_LOG_LEVEL | Log level (e.g., INFO, DEBUG) |
| CHRONILOG_LOG_MAX_MB | Max file size in MB before rotating |
| CHRONILOG_LOG_BACKUP_COUNT | Number of rotated logs to keep |
| CHRONILOG_JSON | Use JSON formatter (1 or 0) |
| CHRONILOG_DISABLE_CONSOLE | If true, disables console output |
| CHRONILOG_EMOJI_FALLBACK | Replaces emojis on incompatible systems |
| CHRONILOG_ENABLE_SENTRY | Enables Sentry integration |
| CHRONILOG_SENTRY_DSN | Your Sentry DSN string |
| CHRONILOG_SENTRY_LEVEL | Min level to send to Sentry |
| CHRONILOG_SENTRY_SAMPLE_RATE | Tracing sample rate (0.0 to 1.0) |
โจ Sentry Integration (Optional)
Chronilog includes first-class support for Sentry, a powerful error tracking system.
โ Enabling Sentry
- Install the SDK:
pip install sentry-sdk
- Add to
.chronilog.toml:
enable_sentry = true
sentry_dsn = "https://your_dsn_here@sentry.io/project_id"
sentry_level = "ERROR"
sentry_traces_sample_rate = 0.0
- You can also trigger Sentry manually:
from chronilog.integrations.sentry import init_sentry
init_sentry()
๐ก Manually Capture Exceptions
from chronilog.integrations.sentry import capture_exception
try:
raise ValueError("Something went wrong")
except Exception as e:
capture_exception(e)
โ Sentry not installed?
Chronilog gracefully disables Sentry if sentry-sdk is missing.
All related tests will automatically be skipped.
๐งช Diagnostics
Need to verify your setup?
from chronilog.diagnostics import print_diagnostics
print_diagnostics()
You'll get a Rich-powered terminal table showing:
- Logger name
- Log level
- Handlers active
- File path
- Config source
๐งช Testing With Chronilog
Run tests:
pytest tests/
Built-in usage example:
python examples/usage.py
โ Testing tips:
Use caplog to capture output:
def test_warning(caplog):
log = ChroniLog("test")
log.warning("uh oh!")
assert "uh oh!" in caplog.text
Patch config:
monkeypatch.setattr("chronilog.integrations.sentry._get_config", lambda key: {
"enable_sentry": "true",
"sentry_dsn": "invalid"
}.get(key))
๐๏ธ Configuration Precedence
Chronilog uses the following priority for resolving config:
.envoverrides.chronilog.toml- Hardcoded defaults
Any of these can be bypassed using keyword args in ChroniLog(...).
๐งฏ Troubleshooting
โ Nothing appears in logs?
- Check
log_level - Check that
log_pathis writeable
โ Unicode errors on Windows?
- Set
emoji_fallback = true
๐งช Use print_diagnostics() for verification
๐ Example: Flask Integration
from flask import Flask
from chronilog import ChroniLog
app = Flask(__name__)
log = ChroniLog("flask_app")
@app.route("/")
def home():
log.info("Homepage accessed")
return "Hello from Chronilog!"
๐ Example Project Structure
myapp/
โโโ main.py
โโโ .env
โโโ .chronilog.toml
โโโ logs/
โ โโโ chronilog.log # or myapp.log
โโโ requirements.txt
โโโ tests/
๐งโ๐ป Chronilog CLI
Chronilog includes a powerful CLI to help manage configuration and setup.
๐ ๏ธ chronilog init
Interactive setup wizard to generate a .chronilog.toml file:
chronilog init
It prompts for:
- Log path (e.g.,
logs/chronilog.log) - Log level (
DEBUG,INFO, etc.) - Max log size (in MB)
- Backup count
- Console output toggle
- Emoji fallback toggle
- Sentry enable + DSN + level + trace sample rate
It creates .chronilog.toml in your working directory or a custom path.
โ๏ธ CLI Flags
| Flag | Description |
|---|---|
--dry-run |
Preview the config it would generate, without writing a file |
--config PATH |
Specify an alternate config file location |
โ Example
chronilog init --dry-run
Shows the generated config as TOML without saving.
chronilog init --config .config/chronilog.toml
Saves to a custom path.
๐ Safe Defaults
If a .chronilog.toml already exists, Chronilog will:
- Prompt you to overwrite, skip, or cancel
- Validate the structure before writing
- Include comments in the output
๐ง Coming Soon: CLI Toolkit
Chronilog's CLI is expanding soon with:
chronilog config set key=valuechronilog config delete keychronilog diagnosticsโ full environment + logger auditchronilog viewโ visual JSON log viewer with filters- Profile-based config switching
๐ License
MIT License โ open-source, free for commercial and personal use.
๐ Credits
Built with โค๏ธ by Brandon McKinney
Feedback welcome โ open an issue or contribute anytime!
Project details
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 chronilog-0.1.4.tar.gz.
File metadata
- Download URL: chronilog-0.1.4.tar.gz
- Upload date:
- Size: 20.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51115afcf3db3da35e335fc0728bf000db4e44d3886db5541405a68b82ebc015
|
|
| MD5 |
026a24ea690f467eafecb4b8ee4c07b4
|
|
| BLAKE2b-256 |
a2d575a76d79ab543d763a8e067def55858cceb959167c826bd684bf69ab3dc2
|
File details
Details for the file chronilog-0.1.4-py3-none-any.whl.
File metadata
- Download URL: chronilog-0.1.4-py3-none-any.whl
- Upload date:
- Size: 17.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
89d4a54af4d3aa372f9943bc0a6c535bdc7b6a41d1078e433e691ef1ef4c1dbe
|
|
| MD5 |
2371298a649af60b1ccab5f2af1f543a
|
|
| BLAKE2b-256 |
0646668c4c2541c08dc37a700ed8e5d5a10a7da6f6f13d6934cc1a39e28aa904
|