Skip to main content

Envlog

Tests Lint Code Quality Examples Python 3.8+ PyPI version License: MIT

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's DEBUG (Rust's trace is more verbose, maps to Python's lowest)
  • debug → DEBUG
  • info → INFO
  • warn / warning → WARNING
  • error → ERROR
  • critical → 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 format
  • date_format: Custom date format
  • force: 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

  1. Parses RUST_LOG-style specification
  2. Converts to Python logging level names
  3. Generates a logging.config.dictConfig configuration
  4. 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)

Source distribution for envlog 1.0.0
File Size Uploaded
envlog-1.0.0.tar.gz 10.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for envlog 1.0.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page