Source code for pysepal.logger.logger
"""Logging configuration for the Sepal UI project.
To use this logging configuration, set the environment variable
SEPALUI_LOG_CFG to the path of the logging configuration file.
The repo has a sample configuration file in the root directory.
"""
import logging
import logging.config
from pathlib import Path
from typing import Optional, Union
import tomli
log = logging.getLogger("sepalui")
[docs]
def setup_logging(
logger_name: str,
config_path: Optional[Union[str, Path]] = None,
) -> logging.Logger:
"""Set up logging configuration from a TOML file and return the configured logger.
Args:
logger_name: Name of the logger to configure and return.
config_path: Path to the logging configuration file.
Defaults to "logging_config.toml" in the caller's directory.
Returns:
The configured logger instance.
If the configuration file does not exist, a NullHandler is added to the specified logger.
If the file exists, it is loaded and the logging configuration is applied.
"""
# Determine the configuration file path
if config_path:
cfg_path = Path(config_path)
else:
# Default to logging_config.toml in the caller's directory
import inspect
caller_file = Path(inspect.stack()[1].filename)
cfg_path = caller_file.parent / "logging_config.toml"
# Get the logger to configure
target_log = logging.getLogger(logger_name)
if not cfg_path.exists():
# Remove existing handlers and add NullHandler
for handler in target_log.handlers[:]:
target_log.removeHandler(handler)
target_log.addHandler(logging.NullHandler())
return target_log
if not cfg_path.is_file():
raise FileNotFoundError(f"Logging config not found at {cfg_path}")
with cfg_path.open("rb") as f:
cfg = tomli.load(f)
logging.config.dictConfig(cfg)
return target_log
# Initialize sepalui logging with default behavior for backward compatibility
log = setup_logging(
"sepalui", config_path=Path(__file__).parent.parent.parent / "logging_config.toml"
)