Source code for uvex_transients.utils.log
"""Logging setup for uvex_transients.
Configures the package-wide logger (:attr:`logger`), the main entry point for
logging messages across the codebase. Behavior -- level and message format --
is controlled by the central configuration
(:attr:`~uvex_transients.utils.config.config`) under the ``system.logging.main``
namespace.
"""
import logging
from typing import Union
from .config import config
logger = logging.getLogger("uvex_transients")
"""logging.Logger: The main logger for the uvex_transients package."""
logger.propagate = False # Avoid duplicate logs via the root logger.
[docs]
def configure_logging(level: Union[int, str, None] = None) -> None:
"""(Re)configure `logger` from `config`, optionally overriding its level.
Parameters
----------
level : int, str, or None, optional
Logging level to use instead of ``config["system.logging.main.level"]``
(e.g. ``logging.DEBUG`` or ``"DEBUG"``).
"""
resolved_level = level if level is not None else config["system.logging.main.level"]
if isinstance(resolved_level, str):
resolved_level = getattr(logging, resolved_level)
logger.setLevel(resolved_level)
# Don't stack handlers across repeated calls.
logger.handlers.clear()
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(config["system.logging.main.format"]))
logger.addHandler(handler)
configure_logging()