Skip to main content

Log toolkit

Project description

Thinlog

Python 3.12+ PyPI version License Typed

A lightweight, fully-typed Python logging toolkit — a thin wrapper on the standard logging library with extra wheels.

Table of Contents

Features

  • Wildcard logger configuration — define a "*" logger and have it applied to every registered logger.
  • Keyword-friendly logging — pass keyword arguments directly; they become extra fields.
  • Advanced filters — whitelist, blocklist, and conditional attribute assignment via TOML config.
  • Structured JSON output — rich exception context powered by structlog.
  • Remote logging — send logs to an HTTP endpoint or Telegram chat out of the box.
  • Fully typed — strict MyPy compliance with a py.typed PEP 561 marker.

Installation

pip install thinlog

Quick Start

config.toml:

[logging]
root = {level = "DEBUG", handlers = ["queue"]}

[logging.formatters]
json = {"()" = "thinlog.formatters.json.JsonFormatter", show_locals = false}
msg = {"()" = "thinlog.formatters.msg.MsgFormatter"}

[logging.handlers]
stream = {class = "logging.StreamHandler", level = "DEBUG", stream = "ext://sys.stderr", formatter = "msg"}
queue = {class = "logging.handlers.QueueHandler", handlers = ["stream"], formatter = "json", respect_handler_level = true}

app.py:

import tomllib
from pathlib import Path
from thinlog import configure_logging

config = tomllib.loads(Path("config.toml").read_text())
logger = configure_logging("myapp", config["logging"])

logger.info("Hello from Thinlog!")
logger.warning("Something happened", user_id=42, ip="10.0.0.1")

From any other location/library or file if you need a specific logger you can simply do:

from thinlog import get_logger

logger = get_logger("my_other_specific_logger", dict(more="data", we="can pass"))

# Rest of the file...

A recommendation: Context(ctx) is good, use context everywhere, your app can have its own context, every request can have its own ctx so you can easily access your resources(e.g myapp logger) from ctx.

Concepts

configure_logging

configure_logging is a plain function that returns a ready-to-use logger. It registers an atexit handler that automatically stops QueueHandler listeners and flushes handlers on interpreter exit.

Wildcard Loggers

Define a "*" logger in your config and it will be applied to all registered loggers. Use "merge": true on a specific logger to extend rather than replace the wildcard config.

[logging.loggers]
"*" = {level = "INFO", handlers = ["queue"]}

[logging.loggers.trace_log]
merge = true
handlers = ["trace_handler"]

Filters

  • WhitelistFilter — allow records matching name, message, or attribute patterns.
  • BlocklistFilter — block matching records (inverse of whitelist).
  • AssignerFilter — conditionally assign attributes to matching records without blocking any.
[logging.filters]
skip_noisy = {"()" = "thinlog.filters.blocklist.BlocklistFilter", by_name = ["urllib3", "httpx"]}

Handlers

  • JsonHTTPHandler — send JSON logs via HTTP POST with per-record URL/header overrides.
  • TelegramHandler — send logs to Telegram; auto-splits long messages into document attachments.
  • CtxPrintHandler — print record context as JSON to stdout for development.

Formatters

  • JsonFormatter — full record as JSON with structured exception tracebacks.
  • MsgFormatter — plain message string only.
  • TelegramFormatter — HTML-formatted output with length-aware splitting.

Documentation

Full documentation is available at minfrastructure.github.io/thinlog.

This module is fully typed and compatible with MyPy out of the box. Please open an issue for any suggestions or bugs.

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

thinlog-26.2.2.tar.gz (15.1 kB view details)

Uploaded Source

Built Distribution

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

thinlog-26.2.2-py3-none-any.whl (20.8 kB view details)

Uploaded Python 3

File details

Details for the file thinlog-26.2.2.tar.gz.

File metadata

  • Download URL: thinlog-26.2.2.tar.gz
  • Upload date:
  • Size: 15.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for thinlog-26.2.2.tar.gz
Algorithm Hash digest
SHA256 9f78fe80fcf3c52c3a8e71a617a96391b6d5a04e54cfa7d41961df449d5df8c3
MD5 28f16744409c99bc0da7aeec171030cc
BLAKE2b-256 b9b0850fe6b69e770397f37aa5255b3d35caf72c15ecc371618eca5816d37919

See more details on using hashes here.

Provenance

The following attestation bundles were made for thinlog-26.2.2.tar.gz:

Publisher: publish.yml on minfrastructure/thinlog

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file thinlog-26.2.2-py3-none-any.whl.

File metadata

  • Download URL: thinlog-26.2.2-py3-none-any.whl
  • Upload date:
  • Size: 20.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for thinlog-26.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 8448294208a60a84bfcf106d3c1573da7cb67195e1e3ef2d92d6bd4c3535d8af
MD5 d82eb5fcc79ca276f533f46c74207b45
BLAKE2b-256 9cdc3ddd980f629dd67453c8c6c78f62c3428588ef31cb5f185d5785ee009bf2

See more details on using hashes here.

Provenance

The following attestation bundles were made for thinlog-26.2.2-py3-none-any.whl:

Publisher: publish.yml on minfrastructure/thinlog

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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