Create utils/logging_setup.py
Browse files- utils/logging_setup.py +45 -0
utils/logging_setup.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# utils/logging_setup.py
|
| 2 |
+
from __future__ import annotations
|
| 3 |
+
import logging, os, sys
|
| 4 |
+
from typing import Optional
|
| 5 |
+
|
| 6 |
+
def setup_logging(app_name: str = "videomatte", level: Optional[str] = None) -> None:
|
| 7 |
+
"""
|
| 8 |
+
Initialize root logging for the whole app.
|
| 9 |
+
Call this ONCE, as early as possible (in app entrypoint), BEFORE importing modules that log.
|
| 10 |
+
"""
|
| 11 |
+
# Respect env var if provided; else use DEBUG in dev, INFO otherwise
|
| 12 |
+
env_level = (level or os.environ.get("LOG_LEVEL") or "DEBUG").upper()
|
| 13 |
+
lvl = getattr(logging, env_level, logging.DEBUG)
|
| 14 |
+
|
| 15 |
+
# Make stdout unbuffered so Space/terminal shows logs immediately
|
| 16 |
+
try:
|
| 17 |
+
sys.stdout.reconfigure(line_buffering=True) # py3.7+
|
| 18 |
+
except Exception:
|
| 19 |
+
os.environ.setdefault("PYTHONUNBUFFERED", "1")
|
| 20 |
+
|
| 21 |
+
fmt = "%(asctime)s | %(levelname)-7s | %(name)s: %(message)s"
|
| 22 |
+
datefmt = "%H:%M:%S"
|
| 23 |
+
|
| 24 |
+
# Force=True ensures edits/reloads don’t leave you with no handlers
|
| 25 |
+
logging.basicConfig(
|
| 26 |
+
level=lvl,
|
| 27 |
+
format=fmt,
|
| 28 |
+
datefmt=datefmt,
|
| 29 |
+
handlers=[logging.StreamHandler(sys.stdout)],
|
| 30 |
+
force=True,
|
| 31 |
+
)
|
| 32 |
+
|
| 33 |
+
# Quiet down super chatty libraries, but keep errors
|
| 34 |
+
for noisy in ("urllib3", "PIL", "matplotlib", "numba", "hf_transfer", "transformers", "torch._dynamo"):
|
| 35 |
+
logging.getLogger(noisy).setLevel(logging.WARNING)
|
| 36 |
+
|
| 37 |
+
# Capture warnings as logs
|
| 38 |
+
logging.captureWarnings(True)
|
| 39 |
+
|
| 40 |
+
logging.getLogger(app_name).info("Logging initialized (level=%s)", env_level)
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
def make_logger(name: str) -> logging.Logger:
|
| 44 |
+
# Use a consistent app prefix so filtering is easy
|
| 45 |
+
return logging.getLogger(f"videomatte.{name}")
|