Source code for ForMoSA.core.loggings

import logging
from rich.logging import RichHandler
from rich.theme import Theme
from rich.console import Console
import os

NO_LOGGING = 100

[docs] def setup_logging(level: str ="INFO", logfile: str | os.PathLike = None, name: str = None): ''' Setup the logging Parameters ---------- level : str Level of the logger ('INFO', 'DEBUG', 'WARNING', 'ERROR', 'CRITICAL') logfile : str | os.PathLike Path of the log name : str Name of the logger Returns ------- logger : logging.Logger Logger Notes ----- Authors: Arthur Vigan and Allan Denis ''' logger_name = f"ForMoSA.{name}" if name else "ForMoSA" logger = logging.getLogger(logger_name) # Normalization level = level.upper() if level in {"OFF", "NONE"}: logger.setLevel(NO_LOGGING) else: logger.setLevel(getattr(logging, level, logging.INFO)) logger.propagate = False if logger.hasHandlers(): logger.handlers.clear() if level in {"OFF", "NONE"}: # If no logging, we return the logger earlier return logger # Theme Rich theme = Theme({ "logging.level.debug": "dim", "logging.level.info": "green", "logging.level.warning": "yellow", "logging.level.error": "red", "logging.level.critical": "bold red", }) console = Console(theme=theme) # Handler console handler = RichHandler( show_time=False, show_path=False, console=console, markup=True, ) logger.addHandler(handler) # Handler (optional) if logfile: fh = logging.FileHandler(logfile, mode="a") formatter = logging.Formatter("%(asctime)s | %(name)s | %(levelname)s | %(message)s") fh.setFormatter(formatter) logger.addHandler(fh) return logger