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 config —
get_logger()and go - 📝 Structured JSON — every log is a JSON object
- 🎯 Auto-context — function name, file, line number captured automatically
- 🔍 Function tracing —
@log.tracedecorator adds timing - 🏷️ Request context —
with log.context(user_id=...)adds fields to all logs - 👁️ Human-readable mode — for development
- 🔌 Stdlib integration — bridges to Python's
loggingmodule - 🧵 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
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)
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 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8772fc2d69d8e0c9df88fc62fa2c03d146db0beed9324b6389f2cb3c47560fa3
|
|
| MD5 |
0fd7909e81acf7ab1cd3b3292c7e20c5
|
|
| BLAKE2b-256 |
f9061d29a4626aa285c594343293394f8a599cf00743a491cb5c8b9300818b30
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9ba094c71e369fbdbeb7f610f8d97f280a28685d36445921b09300c69fd443a
|
|
| MD5 |
454c896795ed684fa9a2228880cae23a
|
|
| BLAKE2b-256 |
bb761aad1c585e4d0e9a92eb4318a06294a6507372cfd2b5dd7d66615d1e4086
|