Structured logging for Python that emphasizes simplicity, power, and performance
Global configuration system for structlog that controls how loggers are created, how log events are processed, and how the overall logging pipeline behaves. Configuration is typically done once at application startup and affects all subsequent logger creation.
Configure structlog's global defaults including processors, wrapper classes, context classes, and logger factories.
def configure(
processors=None,
wrapper_class=None,
context_class=None,
logger_factory=None,
cache_logger_on_first_use=None
) -> None:
"""
Configure structlog's global defaults.
Args:
processors (list, optional): List of processor functions/classes to apply to all log events
wrapper_class (type, optional): Class to wrap loggers (default: BoundLogger)
context_class (type, optional): Class for context storage (default: dict)
logger_factory (callable, optional): Factory function for creating loggers
cache_logger_on_first_use (bool, optional): Whether to cache loggers after first use
"""Configure structlog only if it hasn't been configured already, useful for libraries that want to set defaults without overriding user configuration.
def configure_once(
processors=None,
wrapper_class=None,
context_class=None,
logger_factory=None,
cache_logger_on_first_use=None
) -> None:
"""
Configure structlog only if not already configured.
Args:
Same as configure()
"""Get the current configuration state and check whether structlog has been configured.
def get_config() -> dict[str, Any]:
"""
Get current structlog configuration as a dictionary.
Returns:
dict: Current configuration with keys for processors, wrapper_class,
context_class, logger_factory, cache_logger_on_first_use
"""
def is_configured() -> bool:
"""
Check if structlog has been configured.
Returns:
bool: True if configure() has been called, False otherwise
"""Reset structlog to its built-in defaults, clearing any previous configuration.
def reset_defaults() -> None:
"""
Reset structlog to built-in defaults.
This clears any previous configuration and restores the original
default processors, wrapper class, and other settings.
"""import structlog
# Simple configuration with console output
structlog.configure(
processors=[
structlog.processors.TimeStamper(fmt="iso"),
structlog.dev.ConsoleRenderer()
],
wrapper_class=structlog.stdlib.BoundLogger,
logger_factory=structlog.stdlib.LoggerFactory(),
cache_logger_on_first_use=True,
)import structlog
import logging
# Configure Python logging first
logging.basicConfig(
level=logging.INFO,
format="%(message)s",
)
# Configure structlog for JSON output
structlog.configure(
processors=[
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.add_log_level,
structlog.processors.JSONRenderer()
],
wrapper_class=structlog.stdlib.BoundLogger,
logger_factory=structlog.stdlib.LoggerFactory(),
context_class=dict,
cache_logger_on_first_use=True,
)import structlog
# Configuration optimized for development
structlog.configure(
processors=[
structlog.processors.TimeStamper(fmt="iso"),
structlog.dev.ConsoleRenderer(
colors=True,
exception_formatter=structlog.dev.rich_traceback
)
],
wrapper_class=structlog.stdlib.BoundLogger,
logger_factory=structlog.stdlib.LoggerFactory(),
cache_logger_on_first_use=True,
)import structlog
# Library code that sets defaults without overriding user config
def setup_logging():
structlog.configure_once(
processors=[
structlog.processors.TimeStamper(),
structlog.processors.JSONRenderer()
],
wrapper_class=structlog.stdlib.BoundLogger,
logger_factory=structlog.stdlib.LoggerFactory(),
)import structlog
# Check if configured
if not structlog.is_configured():
# Set up default configuration
structlog.configure(...)
# Get current configuration
config = structlog.get_config()
print(f"Processors: {config['processors']}")
print(f"Wrapper class: {config['wrapper_class']}")Install with Tessl CLI
npx tessl i tessl/pypi-structlog