Spaces:
Running
Running
| """ | |
| Shared structured logger for the Luminary HF backend. | |
| Outputs readable, sectioned logs that are easy to scan in the HF Space container view. | |
| """ | |
| from __future__ import annotations | |
| import logging | |
| import sys | |
| import time | |
| from datetime import datetime, timezone | |
| # ββ ANSI colour palette ββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| _R = "\033[0m" # reset | |
| _B = "\033[1m" # bold | |
| _DIM = "\033[2m" # dim | |
| _GRN = "\033[32m" # green | |
| _CYN = "\033[36m" # cyan | |
| _YLW = "\033[33m" # yellow | |
| _RED = "\033[31m" # red | |
| _MAG = "\033[35m" # magenta | |
| _BLU = "\033[34m" # blue | |
| _WHT = "\033[97m" # bright white | |
| _TAG_COLORS: dict[str, str] = { | |
| "STARTUP": _CYN, | |
| "MODEL": _MAG, | |
| "UPLOAD": _BLU, | |
| "PROCESS": _BLU, | |
| "CHAT": _GRN, | |
| "QUIZ": _GRN, | |
| "SWITCH": _YLW, | |
| "ERROR": _RED, | |
| "HEALTH": _DIM, | |
| } | |
| class _FmtHandler(logging.StreamHandler): | |
| """Formatter that wraps log records into readable tag-prefixed lines.""" | |
| def emit(self, record: logging.LogRecord) -> None: | |
| try: | |
| tag = getattr(record, "tag", record.levelname) | |
| msg = record.getMessage() | |
| color = _TAG_COLORS.get(tag, _WHT) | |
| ts = datetime.now(timezone.utc).strftime("%H:%M:%S") | |
| prefix = f"{_DIM}{ts}{_R} {color}{_B}[{tag}]{_R}" | |
| # indent continuation lines | |
| lines = msg.splitlines() | |
| out = prefix + " " + lines[0] | |
| for line in lines[1:]: | |
| out += "\n" + (" " * (len(ts) + len(tag) + 5)) + line | |
| sys.stdout.write(out + "\n") | |
| sys.stdout.flush() | |
| except Exception: | |
| self.handleError(record) | |
| # ββ Module-level logger setup βββββββββββββββββββββββββββββββββββββββββββββββββ | |
| _handler = _FmtHandler() | |
| _handler.setFormatter(logging.Formatter("%(message)s")) | |
| log = logging.getLogger("luminary") | |
| log.setLevel(logging.DEBUG) | |
| if not log.handlers: | |
| log.addHandler(_handler) | |
| log.propagate = False | |
| # ββ Convenience helpers βββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| def _tag(tag: str) -> dict: | |
| return {"extra": {"tag": tag}} | |
| def banner(title: str, width: int = 58) -> None: | |
| """Print a prominent box banner (e.g. at startup).""" | |
| bar = "β" * width | |
| inner = title.center(width) | |
| sys.stdout.write( | |
| f"\n{_B}{_CYN}β{bar}β\n" | |
| f"β{_WHT}{_B}{inner}{_CYN}β\n" | |
| f"β{bar}β{_R}\n\n" | |
| ) | |
| sys.stdout.flush() | |
| def section(tag: str, msg: str) -> None: | |
| """Print a thin divider line with an annotation.""" | |
| color = _TAG_COLORS.get(tag, _WHT) | |
| ts = datetime.now(timezone.utc).strftime("%H:%M:%S") | |
| width = max(0, 58 - len(tag) - len(msg) - 4) | |
| bar = "β" * width | |
| sys.stdout.write(f"{_DIM}{ts}{_R} {color}{_B}[{tag}]{_R} {_DIM}{msg} {bar}{_R}\n") | |
| sys.stdout.flush() | |
| def ok(tag: str, msg: str) -> None: | |
| color = _TAG_COLORS.get(tag, _WHT) | |
| ts = datetime.now(timezone.utc).strftime("%H:%M:%S") | |
| sys.stdout.write(f"{_DIM}{ts}{_R} {color}{_B}[{tag}]{_R} {_GRN}β{_R} {msg}\n") | |
| sys.stdout.flush() | |
| def step(tag: str, msg: str) -> None: | |
| color = _TAG_COLORS.get(tag, _WHT) | |
| ts = datetime.now(timezone.utc).strftime("%H:%M:%S") | |
| sys.stdout.write(f"{_DIM}{ts}{_R} {color}{_B}[{tag}]{_R} {_DIM}β{_R} {msg}\n") | |
| sys.stdout.flush() | |
| def warn(tag: str, msg: str) -> None: | |
| color = _TAG_COLORS.get(tag, _WHT) | |
| ts = datetime.now(timezone.utc).strftime("%H:%M:%S") | |
| sys.stdout.write(f"{_DIM}{ts}{_R} {color}{_B}[{tag}]{_R} {_YLW}β {_R} {_YLW}{msg}{_R}\n") | |
| sys.stdout.flush() | |
| def error(tag: str, msg: str) -> None: | |
| ts = datetime.now(timezone.utc).strftime("%H:%M:%S") | |
| sys.stdout.write( | |
| f"{_DIM}{ts}{_R} {_RED}{_B}[{tag}]{_R} " | |
| f"{_RED}β Error{_R}\n" | |
| f"{' ' * (len(ts) + len(tag) + 5)}{_RED}{msg}{_R}\n" | |
| ) | |
| sys.stdout.flush() | |
| class Timer: | |
| """Context manager / manual stopwatch with labelled output.""" | |
| def __init__(self, tag: str, label: str) -> None: | |
| self.tag = tag | |
| self.label = label | |
| self._t0: float = 0.0 | |
| def start(self) -> "Timer": | |
| self._t0 = time.perf_counter() | |
| return self | |
| def elapsed(self) -> float: | |
| return time.perf_counter() - self._t0 | |
| def done(self, extra: str = "") -> float: | |
| secs = self.elapsed() | |
| msg = f"{self.label} {_DIM}({secs:.2f}s){_R}" | |
| if extra: | |
| msg += f" {_DIM}{extra}{_R}" | |
| ok(self.tag, msg) | |
| return secs | |
| def __enter__(self) -> "Timer": | |
| return self.start() | |
| def __exit__(self, *_) -> None: | |
| self.done() | |