from __future__ import annotations import logging import os from typing import Final from colorama import Fore, Style, init as colorama_init __all__: Final[list[str]] = ["get_logger"] class _ColourFormatter(logging.Formatter): _COLOUR_FOR_LEVEL = { logging.DEBUG: Fore.CYAN, logging.INFO: Fore.GREEN, logging.WARNING: Fore.YELLOW, logging.ERROR: Fore.RED, logging.CRITICAL: Fore.MAGENTA, } def format(self, record: logging.LogRecord) -> str: # noqa: D401 colour = self._COLOUR_FOR_LEVEL.get(record.levelno, "") return f"{colour}{super().format(record)}{Style.RESET_ALL}" def get_logger(name: str | None = None, level: int | None = None) -> logging.Logger: """Return a configured logger instance.""" colorama_init() env_level = os.getenv("LOG_LEVEL", "INFO").upper() if level is None: level = getattr(logging, env_level, logging.INFO) handler = logging.StreamHandler() handler.setFormatter( _ColourFormatter("%(asctime)s [%(levelname)s] %(name)s: %(message)s") ) logger = logging.getLogger(name) logger.setLevel(level) logger.handlers.clear() logger.addHandler(handler) return logger