Envlog
Rust RUST_LOG-style environment variable configuration for Python's standard library logging.
Features
- Simple: One environment variable configures all loggers
- Familiar: Uses Rust's RUST_LOG syntax
- Standard: Builds on Python's
logging.config.dictConfig - Zero dependencies: Only uses Python standard library
- Flexible: Works with loggers created anywhere in your codebase
Requirements
- Python 3.8 or higher
Installation
pip install envlog
Quick Start
import logging
import envlog
# Initialize from PTHN_LOG environment variable
envlog.init()
# Now use logging normally
logger = logging.getLogger('myapp')
logger.info('Hello, world!')
# Set log level via environment
export PTHN_LOG=info
python myapp.py
Syntax
The log specification syntax follows Rust's RUST_LOG conventions:
# Set default level
PTHN_LOG=info
# Set module-specific levels
PTHN_LOG=myapp=debug
# Set default + module overrides
PTHN_LOG=warn,myapp=debug,otherlib=error
# Hierarchical modules (use . or :: separator)
PTHN_LOG=myapp.core=debug
PTHN_LOG=myapp::db=trace
# Complex example
PTHN_LOG=warn,myapp=info,myapp.db=debug,requests=error
Log Levels
Supports all standard levels (case-insensitive):
trace→ Python'sDEBUG(Rust's trace is more verbose, maps to Python's lowest)debug→DEBUGinfo→INFOwarn/warning→WARNINGerror→ERRORcritical→CRITICAL
Usage Examples
Basic Usage
import envlog
# Read from PTHN_LOG environment variable
envlog.init()
# Or specify configuration directly
envlog.init(log_spec='warn,myapp=debug')
# Or use custom environment variable name
envlog.init(env_var='MY_LOG')
Module-Specific Configuration
import logging
import envlog
envlog.init(log_spec='warn,myapp.core=debug,myapp.db=trace')
# Different modules get different log levels
core_logger = logging.getLogger('myapp.core')
core_logger.debug('Detailed debugging') # Shows (DEBUG level)
db_logger = logging.getLogger('myapp.db')
db_logger.debug('Database query') # Shows (TRACE->DEBUG level)
other_logger = logging.getLogger('requests')
other_logger.info('HTTP request') # Hidden (WARN level)
Custom Formatting
envlog.init(
log_spec='debug',
log_format='%(levelname)s %(name)s: %(message)s',
date_format='%H:%M:%S'
)
Force Reconfiguration
# First configuration
envlog.init(log_spec='info')
# Later, reconfigure (requires force=True)
envlog.init(log_spec='debug', force=True)
# Or use reset() then init()
envlog.reset()
envlog.init(log_spec='debug')
API Reference
envlog.init()
def init(
log_spec: Optional[str] = None,
env_var: str = 'PTHN_LOG',
log_format: Optional[str] = None,
date_format: Optional[str] = None,
force: bool = False
) -> None
Initialize logging from a RUST_LOG-style specification.
Parameters:
log_spec: Explicit log specification (overrides env_var if provided)env_var: Environment variable name to read (default: 'PTHN_LOG')log_format: Custom log message formatdate_format: Custom date formatforce: Force reconfiguration even if already configured
envlog.reset()
def reset() -> None
Reset the configuration state, allowing init() to be called again without force=True.
envlog.parse_log_spec()
def parse_log_spec(spec: str) -> LogSpec
Parse a RUST_LOG-style specification into a LogSpec object. Useful for testing or advanced usage.
Comparison with RUST_LOG
| Feature | Rust RUST_LOG | envlog |
|---|---|---|
| Default level | RUST_LOG=info |
PTHN_LOG=info |
| Module-specific | RUST_LOG=myapp=debug |
PTHN_LOG=myapp=debug |
| Module separator | :: (e.g., myapp::core) |
. or :: (e.g., myapp.core) |
| Multiple modules | RUST_LOG=warn,app=debug,lib=error |
Same |
| Trace level | Separate from debug | Maps to DEBUG |
How It Works
- Parses RUST_LOG-style specification
- Converts to Python logging level names
- Generates a
logging.config.dictConfigconfiguration - Applies configuration to Python's standard library logging
The logging configuration uses:
- Console handler writing to stderr
- Standard formatter with timestamp, level, logger name, and message
- Non-destructive configuration (doesn't disable existing loggers)
Development
# Clone repository
git clone https://github.com/bassmanitram/python-envlog.git
cd envlog
# Install in development mode
pip install -e ".[dev,test]"
# Run tests
pytest
# Run tests with coverage
pytest --cov=envlog --cov-report=html
License
MIT License - see LICENSE file for details
Contributing
Contributions welcome! Please open an issue or pull request.
For Developers and AI Agents
See AGENT_BOOTSTRAP.md for comprehensive project documentation including:
- Complete architecture overview
- Module-by-module code walkthrough
- Testing strategies and guidelines
- CI/CD pipeline details
- Development workflow and conventions
- Design decisions and rationale
This document provides the technical context needed to understand and contribute to the project effectively.
Acknowledgments
Inspired by Rust's env_logger crate and the RUST_LOG convention.
Metadata
Release files for envlog 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| envlog-1.0.0.tar.gz | 10.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| envlog-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 18.7 kB
Release files / envlog-1.0.0.tar.gz
| Download URL | envlog-1.0.0.tar.gz |
|---|---|
| Size | 10.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e354f770b6f97b24edd5fc4a44c4db0ec9a048bb93074c4854ad6171f6fa0356
|
|
BLAKE2b-256 checksum How to use checksums |
e910dbfe276493e567e6013adf498042ab774faf8cb472ff81898b7b83f8af24
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 12, 2025.
Transparency logRelease files / envlog-1.0.0-py3-none-any.whl
| Download URL | envlog-1.0.0-py3-none-any.whl |
|---|---|
| Size | 8.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6a4b255b307d7a9fb00558447baa26ca14a57760d1d78f70a3f102220e0bb674
|
|
BLAKE2b-256 checksum How to use checksums |
19250cca39fb9b56ef978f193c3438a1fae347eda3ec5f911bf05292553695f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 12, 2025.
Transparency log