Skip to main content

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 .env and .chronilog.toml for 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 chronilog to your requirements.txt or pyproject.toml for 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:

  1. Environment variables (CHRONILOG_*)
  2. .chronilog.toml file (if present)
  3. 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:

  1. .env โ€” for quick dev overrides
  2. .chronilog.toml โ€” for structured project configs
  3. 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

  1. Install Chronilog
  2. Create .env or .chronilog.toml in your project root
  3. Add from chronilog import ChroniLog
  4. Use log = ChroniLog(__name__)
  5. 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

  1. Install the SDK:
pip install sentry-sdk
  1. 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
  1. 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:

  1. .env overrides
  2. .chronilog.toml
  3. Hardcoded defaults

Any of these can be bypassed using keyword args in ChroniLog(...).


๐Ÿงฏ Troubleshooting

โœ… Nothing appears in logs?

  • Check log_level
  • Check that log_path is 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=value
  • chronilog config delete key
  • chronilog diagnostics โ€” full environment + logger audit
  • chronilog 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

chronilog-0.1.5.tar.gz (20.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

chronilog-0.1.5-py3-none-any.whl (17.2 kB view details)

Uploaded Python 3

File details

Details for the file chronilog-0.1.5.tar.gz.

File metadata

  • Download URL: chronilog-0.1.5.tar.gz
  • Upload date:
  • Size: 20.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for chronilog-0.1.5.tar.gz
Algorithm Hash digest
SHA256 8f93ebced3d100b9e0e841d5efb913cc57fd98cc154e74e8dfedd93c555562a9
MD5 aec93279b0d4ec63aec5eeb178591cd3
BLAKE2b-256 27cf604fc44da387b4623d6cda788dec431442ce33da02b2dc610e09a97c7617

See more details on using hashes here.

File details

Details for the file chronilog-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: chronilog-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 17.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for chronilog-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 f5352cf0b5e740dbde5d47fb3f3f0988563a11f9684c58e1da64ea3cc2bd3715
MD5 009b9f59812444f78a90806d31d372c5
BLAKE2b-256 908aa0376901c18485d4d24cede2b14794643aeffc1f537a2292acc5d1420e17

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page