|
|
|
|
|
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}") |
|
|
|