Skip to main content

Zero-config structured logging for Python — JSON output, auto-context, function tracing

Project description

snaplog

Zero-config structured logging for Python. One import, structured JSON output everywhere.

Zero dependencies. Auto-context. Function tracing. JSON by default.

Install

pip install snaplog

Quick Start

from snaplog import get_logger

log = get_logger()

log.info("Order processed", order_id="abc", total=49.99)
# → {"ts":"2026-03-24T21:08:00.123Z","level":"info","msg":"Order processed","order_id":"abc","total":49.99,"logger":"root"}

That's it. No config files. No handlers. No formatters. Just log.

Features

  • 🚀 Zero configget_logger() and go
  • 📝 Structured JSON — every log is a JSON object
  • 🎯 Auto-context — function name, file, line number captured automatically
  • 🔍 Function tracing@log.trace decorator adds timing
  • 🏷️ Request contextwith log.context(user_id=...) adds fields to all logs
  • 👁️ Human-readable mode — for development
  • 🔌 Stdlib integration — bridges to Python's logging module
  • 🧵 Thread-safe — context propagates correctly
  • 📦 Zero dependencies — pure Python

API

Basic Logging

from snaplog import get_logger

log = get_logger()
log.debug("Verbose details", step=1)
log.info("Something happened", user_id="u1")
log.warning("Careful!", retries=3)
log.error("Failed to connect", host="db1", error_code=503)
log.critical("System down", component="database")

Auto-Context

# Automatically includes function name, file, and line
def process_order(order_id):
    log.info("Processing", order_id=order_id)
    # → {..., "func":"process_order", "file":"orders.py", "line":42}

Function Tracing

@log.trace_fn
def fetch_user(user_id):
    return db.get(user_id)
# → {"level":"trace","msg":"enter: fetch_user","func":"fetch_user","args":{"user_id":"u1"}}
# → {"level":"trace","msg":"exit: fetch_user","func":"fetch_user","elapsed_ms":12.3,"result":"ok"}

Request Context

with log.context(request_id="r1", user_id="u42"):
    log.info("Processing request")  # includes request_id + user_id
    call_service()
    log.info("Done")  # still includes them
# Context automatically removed after `with` block

Human-Readable Output

from snaplog import get_logger, HumanFormatter

log = get_logger(formatter=HumanFormatter())
log.info("Hello", name="world")
# → 2026-03-24 21:08:00 [INFO] Hello  name=world

Min Level

log = get_logger(min_level="warning")  # debug, info suppressed

Stdlib Integration

import logging
from snaplog import SnaplogHandler

handler = SnaplogHandler()
logging.root.addHandler(handler)
logging.info("This goes through snaplog too")

Custom Output

# Write to a file
import sys
log = get_logger(output=open("app.log", "a"))

# Custom output function
def my_output(record_dict):
    requests.post("https://logs.example.com", json=record_dict)

log = get_logger(output=my_output)

Output Format

{
  "ts": "2026-03-24T21:08:00.123Z",
  "level": "info",
  "msg": "Order processed",
  "logger": "root",
  "func": "process_order",
  "file": "orders.py",
  "line": 42,
  "order_id": "abc",
  "total": 49.99
}

License

MIT

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

snaplog-0.5.0.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

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

snaplog-0.5.0-py3-none-any.whl (8.5 kB view details)

Uploaded Python 3

File details

Details for the file snaplog-0.5.0.tar.gz.

File metadata

  • Download URL: snaplog-0.5.0.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.5

File hashes

Hashes for snaplog-0.5.0.tar.gz
Algorithm Hash digest
SHA256 8772fc2d69d8e0c9df88fc62fa2c03d146db0beed9324b6389f2cb3c47560fa3
MD5 0fd7909e81acf7ab1cd3b3292c7e20c5
BLAKE2b-256 f9061d29a4626aa285c594343293394f8a599cf00743a491cb5c8b9300818b30

See more details on using hashes here.

File details

Details for the file snaplog-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: snaplog-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 8.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.5

File hashes

Hashes for snaplog-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e9ba094c71e369fbdbeb7f610f8d97f280a28685d36445921b09300c69fd443a
MD5 454c896795ed684fa9a2228880cae23a
BLAKE2b-256 bb761aad1c585e4d0e9a92eb4318a06294a6507372cfd2b5dd7d66615d1e4086

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