| |
| from __future__ import annotations |
| import logging, os, sys |
| from typing import Optional |
|
|
| def setup_logging(app_name: str = "videomatte", level: Optional[str] = None) -> None: |
| """ |
| Initialize root logging for the whole app. |
| Call this ONCE, as early as possible (in app entrypoint), BEFORE importing modules that log. |
| """ |
| |
| env_level = (level or os.environ.get("LOG_LEVEL") or "DEBUG").upper() |
| lvl = getattr(logging, env_level, logging.DEBUG) |
|
|
| |
| try: |
| sys.stdout.reconfigure(line_buffering=True) |
| except Exception: |
| os.environ.setdefault("PYTHONUNBUFFERED", "1") |
|
|
| fmt = "%(asctime)s | %(levelname)-7s | %(name)s: %(message)s" |
| datefmt = "%H:%M:%S" |
|
|
| |
| logging.basicConfig( |
| level=lvl, |
| format=fmt, |
| datefmt=datefmt, |
| handlers=[logging.StreamHandler(sys.stdout)], |
| force=True, |
| ) |
|
|
| |
| for noisy in ("urllib3", "PIL", "matplotlib", "numba", "hf_transfer", "transformers", "torch._dynamo"): |
| logging.getLogger(noisy).setLevel(logging.WARNING) |
|
|
| |
| logging.captureWarnings(True) |
|
|
| logging.getLogger(app_name).info("Logging initialized (level=%s)", env_level) |
|
|
|
|
| def make_logger(name: str) -> logging.Logger: |
| |
| return logging.getLogger(f"videomatte.{name}") |
|
|