Source code for besta.logging

"""
Central logging configuration for BESTA.
"""

import logging
import sys
from typing import Optional


DEFAULT_FORMAT = '\x1b[33;20m %(asctime)s|%(levelname)s\x1b[0m \x1b[1;32m[%(name)s]\x1b[0m: %(message)s'
DATE_FORMAT = '%H:%M/%d-%m-%Y'


[docs] def setup_logging( level: str = "INFO", log_file: Optional[str] = None, console: bool = True, overwrite: bool = False, ): """ Configure the root BESTA logger. Parameters ---------- level : str Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL). log_file : str, optional If provided, logs are written to this file. overwrite : bool If True, overwrite log_file instead of appending. """ numeric_level = getattr(logging, level.upper(), logging.INFO) logger = logging.getLogger("besta") logger.setLevel(numeric_level) logger.propagate = False # prevent duplicate logs # Remove previous handlers logger.handlers.clear() formatter = logging.Formatter(DEFAULT_FORMAT, DATE_FORMAT) # Console handler if console: stream_handler = logging.StreamHandler(sys.stdout) stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) # File handler (optional) if log_file: mode = "w" if overwrite else "a" file_handler = logging.FileHandler(log_file, mode=mode) file_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.debug("Logging configured successfully.")
[docs] def get_logger(module_name: str) -> logging.Logger: """Return a child logger under the ``besta`` namespace.""" base = logging.getLogger("besta") if module_name.startswith("besta."): return base.getChild(module_name[len("besta."):]) return base.getChild(module_name)