Spaces:
Sleeping
Sleeping
| """Structured, coloured logging for the entire system.""" | |
| from __future__ import annotations | |
| import logging | |
| import sys | |
| from typing import Optional | |
| _FMT = "%(asctime)s | %(levelname)-8s | %(name)s | %(message)s" | |
| _DATE_FMT = "%Y-%m-%d %H:%M:%S" | |
| _COLOURS = { | |
| "DEBUG": "\033[36m", | |
| "INFO": "\033[32m", | |
| "WARNING": "\033[33m", | |
| "ERROR": "\033[31m", | |
| "CRITICAL": "\033[35m", | |
| "RESET": "\033[0m", | |
| } | |
| class _ColouredFormatter(logging.Formatter): | |
| def format(self, record: logging.LogRecord) -> str: | |
| colour = _COLOURS.get(record.levelname, "") | |
| reset = _COLOURS["RESET"] | |
| record.levelname = f"{colour}{record.levelname}{reset}" | |
| return super().format(record) | |
| _root_configured = False | |
| def _configure_root(level: str = "INFO") -> None: | |
| global _root_configured | |
| if _root_configured: | |
| return | |
| handler = logging.StreamHandler(sys.stdout) | |
| handler.setFormatter(_ColouredFormatter(fmt=_FMT, datefmt=_DATE_FMT)) | |
| logging.root.setLevel(level) | |
| logging.root.addHandler(handler) | |
| _root_configured = True | |
| def get_logger(name: Optional[str] = None, level: str = "INFO") -> logging.Logger: | |
| """Return a named logger with coloured output.""" | |
| _configure_root(level) | |
| return logging.getLogger(name or "self_healing_ml") | |