logger
¶
Full name: tenets.utils.logger
logger¶
Logging utilities for Tenets.
Provides a single entrypoint get_logger
that configures Rich logging once and returns child loggers for modules.
Functions¶
get_logger¶
Return a configured logger.
Environment variables
- TENETS_LOG_LEVEL: DEBUG|INFO|WARNING|ERROR|CRITICAL
Source code in tenets/utils/logger.py
Python
def get_logger(name: Optional[str] = None, level: Optional[int] = None) -> logging.Logger:
"""Return a configured logger.
Environment variables:
- TENETS_LOG_LEVEL: DEBUG|INFO|WARNING|ERROR|CRITICAL
"""
env_level = os.getenv("TENETS_LOG_LEVEL")
default_level_name = env_level.upper() if env_level else "INFO"
level_map = {
"DEBUG": logging.DEBUG,
"INFO": logging.INFO,
"WARNING": logging.WARNING,
"ERROR": logging.ERROR,
"CRITICAL": logging.CRITICAL,
}
resolved_level = level if level is not None else level_map.get(default_level_name, logging.INFO)
# Configure root with the resolved level (explicit level overrides env)
_configure_root(resolved_level)
logger_name = name or "tenets"
logger = logging.getLogger(logger_name)
logger.propagate = True
# Apply level rules:
# - If explicit level provided, set it for this logger
# - If requesting the base 'tenets' logger (or name None), set its level
# - If requesting a child under 'tenets.', let it inherit (don't set level)
# - Otherwise (arbitrary logger names), set the resolved level
if level is not None:
logger.setLevel(level)
elif logger_name == "tenets":
logger.setLevel(resolved_level)
elif logger_name.startswith("tenets."):
# Inherit from parent 'tenets' logger / root, do not set explicit level
pass
else:
logger.setLevel(resolved_level)
return logger