Lightweight Python logger with log levels, rotation, colorization, async support, and working-directory-scoped file utilities
Project description
ntnlog
Lightweight Python logger with timestamped file output, caller stack tracing, and working-directory-scoped file utilities. Next-To-Nothing setup — just import and log.
Features
- Log levels:
TRACE,DEBUG,INFO,WARNING,ERROR,CRITICAL— everything is always written to file; level controls console output only - Caller stack tracing: Automatically records where in your code a log came from
- Timestamped file output: Logs written to daily files with no configuration required
- Log rotation: Size-based rotation configured globally via
GLOBAL_MAX_BYTESandGLOBAL_BACKUP_COUNT - Console colorization: ANSI color output per log level, customizable per instance
- Exception capturing:
exception()attaches the active traceback automatically - Async support:
alog()andaexception()for async/await code - File utilities: Safe, working-directory-scoped file operations with error handling
- Thread-safe: File writes are protected by a per-instance lock
- PEP 561 typed: Full type annotation support — Pylance and mypy enforce valid log levels at edit time
Installation
pip install ntnlog
Quick Start
from ntnlog import Logger, Level
app_log = Logger()
app_log("Application started")
app_log("Important message", console_message="") # prints full log entry to stdout
app_log("Something suspicious", Level.WARNING) # always written to file, no console
# Exception capturing — attaches the active traceback automatically
try:
do_something()
except Exception:
app_log.exception("Something went wrong")
# Async logging
await app_log.alog("Async message")
await app_log.aexception("Async error")
# Enable detailed call-stack tracing
app_log.enable_log_tracing(True)
app_log("Traced message")
# Named loggers — useful when multiple instances log to the same file
app_logger = Logger(name="app")
worker_logger = Logger(name="worker")
# Output: [2026-05-13 15:46:34][INFO][app][main.py:12] message
# [2026-05-13 15:46:34][INFO][worker][worker.py:8] message
# Level filtering — controls console output only, everything still written to file
app_log = Logger(level=Level.WARNING)
app_log = Logger(level="WARN")
# Console colorization
app_log = Logger(colorize=True)
# Custom log directory
app_log = Logger(log_dir="my_logs")
# Project-aware frame filtering
app_log = Logger(project_dir="/path/to/project")
Configuration
from ntnlog.ntn_config import (
GLOBAL_LOGGING_ENABLED,
GLOBAL_LOG_TRACING_ENABLED,
GLOBAL_LOG_LEVEL,
GLOBAL_MAX_BYTES,
GLOBAL_BACKUP_COUNT,
GLOBAL_LOG_COLORS,
)
| Global | Default | Description |
|---|---|---|
GLOBAL_LOGGING_ENABLED |
True |
Master on/off switch for all loggers |
GLOBAL_LOG_TRACING_ENABLED |
True |
Master tracing switch |
GLOBAL_LOG_LEVEL |
Level.INFO |
Default minimum level when instance level is None |
GLOBAL_MAX_BYTES |
10_000_000 |
Default rotation threshold (10 MB) |
GLOBAL_BACKUP_COUNT |
1 |
Default number of backup files kept on rotation |
GLOBAL_LOG_COLORS |
see config | ANSI color code per level |
Per-instance controls:
app_log.enable_logging(False) # disable this logger
app_log.enable_log_tracing(True) # enable tracing for this logger
Modules
Logger (ntn_logging.py)
Main logging class. Writes timestamped, level-tagged entries to ./logs/<date>_logging.txt and optionally traces the full call stack to show exactly which file and line triggered the log.
File Utilities (ntn_file_utils.py)
Path and file verification scoped to the working directory:
file_verify_path(base, directory)— confirms a directory exists within the working dirfile_verify_file(base, filename, operator)— validates a file for read/write/execute
Utils (ntn_utils.py)
Working-directory-scoped path helpers with a clean exception-based API:
ntnlog.utils.get_working_dir()— returns the current working directoryntnlog.utils.resolve_path(path, must_exist=False)— resolves a path within the working directory, raisesValueErrorif it escapes
Configuration (ntn_config.py)
Global flags and defaults controlling logging behaviour across all logger instances.
Development
pip install -e ".[dev]"
pytest
pytest -v
pytest tests/test_ntn_logging.py
License
MIT
Author
Nathan T Nguyen
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 ntnlog-0.6.0.tar.gz.
File metadata
- Download URL: ntnlog-0.6.0.tar.gz
- Upload date:
- Size: 22.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6aaf09372e2b94f249386de5c28f241b287588605480da90fa673e21f9e170a5
|
|
| MD5 |
8856fb7542161238f5af513167352ac7
|
|
| BLAKE2b-256 |
bf3669d8573028a9630fbc60a94e230f1559049b4d6366a1dcfe178b469ac673
|
Provenance
The following attestation bundles were made for ntnlog-0.6.0.tar.gz:
Publisher:
publish.yml on NhatNguyen5/ntnlog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ntnlog-0.6.0.tar.gz -
Subject digest:
6aaf09372e2b94f249386de5c28f241b287588605480da90fa673e21f9e170a5 - Sigstore transparency entry: 1590354010
- Sigstore integration time:
-
Permalink:
NhatNguyen5/ntnlog@f7df14e2c9f31046903a555366e5d7795fd8bfbf -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/NhatNguyen5
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f7df14e2c9f31046903a555366e5d7795fd8bfbf -
Trigger Event:
release
-
Statement type:
File details
Details for the file ntnlog-0.6.0-py3-none-any.whl.
File metadata
- Download URL: ntnlog-0.6.0-py3-none-any.whl
- Upload date:
- Size: 13.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34f2394bef579526700a34228bb09b4b0e1228c6913e4dad1f37f4f4be461a60
|
|
| MD5 |
4f2dae53830e2715577b65fdb40324c3
|
|
| BLAKE2b-256 |
e5ffceba544f2a663f577b4b8e0a98bc7eec866bb51a4106c93b3661e9e2f2b8
|
Provenance
The following attestation bundles were made for ntnlog-0.6.0-py3-none-any.whl:
Publisher:
publish.yml on NhatNguyen5/ntnlog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ntnlog-0.6.0-py3-none-any.whl -
Subject digest:
34f2394bef579526700a34228bb09b4b0e1228c6913e4dad1f37f4f4be461a60 - Sigstore transparency entry: 1590354017
- Sigstore integration time:
-
Permalink:
NhatNguyen5/ntnlog@f7df14e2c9f31046903a555366e5d7795fd8bfbf -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/NhatNguyen5
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f7df14e2c9f31046903a555366e5d7795fd8bfbf -
Trigger Event:
release
-
Statement type: