rc-docker / src /recsys /logging_utils.py
moecr7
Dockerize rc-ranked: FastAPI service for HF Spaces
188f0cf
"""Shared logging setup. One formatter, one handler, idempotent configuration."""
from __future__ import annotations
import logging
import sys
from typing import Final
_LOG_FORMAT: Final[str] = "%(asctime)s | %(levelname)-7s | %(name)s | %(message)s"
_DATE_FORMAT: Final[str] = "%H:%M:%S"
_CONFIGURED: dict[str, bool] = {"done": False}
def _configure_root(level: int) -> None:
"""Install a single stdout handler on the root logger exactly once."""
if _CONFIGURED["done"]:
return
root = logging.getLogger()
root.setLevel(level)
# Remove handlers installed by notebook environments (Colab / Jupyter inject one).
for handler in list(root.handlers):
root.removeHandler(handler)
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(logging.Formatter(_LOG_FORMAT, datefmt=_DATE_FORMAT))
root.addHandler(handler)
_CONFIGURED["done"] = True
def get_logger(name: str, level: int = logging.INFO) -> logging.Logger:
"""Return a module-scoped logger. Safe to call repeatedly from anywhere."""
_configure_root(level)
return logging.getLogger(name)