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