MogensR commited on
Commit
a09952a
·
1 Parent(s): f0dc2a6

Create utils/logging_setup.py

Browse files
Files changed (1) hide show
  1. 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}")