Skip to content

Commit ea7034c

Browse files
28nitin07claude
andcommitted
fix(backend): clean startup logs, filter health pings, suppress TF/torch stderr noise
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 527b05c commit ea7034c

1 file changed

Lines changed: 40 additions & 23 deletions

File tree

backend/main.py

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,48 +10,65 @@
1010
from app.errors.handlers import register_handlers
1111
from app.services import tts_service, clothing_detector
1212

13-
# ── Logging config ─────────────────────────────────────────────────────────────
14-
# Show INFO+ from our code; suppress noisy third-party logs
13+
# ── Silence noisy libraries (Python logging layer) ─────────────────────────────
14+
for _lib in ("tensorflow", "absl", "h5py", "keras", "kokoro", "torch",
15+
"urllib3", "httpx", "httpcore"):
16+
logging.getLogger(_lib).setLevel(logging.ERROR)
17+
18+
# ── Suppress TF stderr noise via env vars (must be set before TF imports) ──────
19+
os.environ.setdefault("TF_CPP_MIN_LOG_LEVEL", "3") # suppress TF C++ logs
20+
os.environ.setdefault("TF_ENABLE_ONEDNN_OPTS", "0") # suppress oneDNN warning
21+
os.environ.setdefault("PYTHONWARNINGS", "ignore") # suppress Python warnings
22+
23+
# ── App logger ─────────────────────────────────────────────────────────────────
1524
logging.basicConfig(
1625
level=logging.INFO,
17-
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
26+
format="%(asctime)s [%(levelname)s] %(message)s",
1827
datefmt="%H:%M:%S",
1928
)
20-
# Suppress library noise
21-
for _noisy in ("tensorflow", "absl", "h5py", "keras", "kokoro", "torch",
22-
"urllib3", "httpx", "httpcore", "uvicorn.access"):
23-
logging.getLogger(_noisy).setLevel(logging.ERROR)
24-
2529
logger = logging.getLogger("rizzvision")
2630

2731

32+
# ── Filter health-check pings from access log ───────────────────────────────────
33+
class _HealthFilter(logging.Filter):
34+
def filter(self, record: logging.LogRecord) -> bool:
35+
msg = record.getMessage()
36+
return not any(p in msg for p in ("/health", "HEAD /", "GET / "))
37+
38+
logging.getLogger("uvicorn.access").addFilter(_HealthFilter())
39+
40+
2841
@asynccontextmanager
2942
async def lifespan(app: FastAPI):
30-
logger.info("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
31-
logger.info("🚀 Rizzvision backend starting up")
32-
logger.info("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
43+
logger.info("----------------------------------------")
44+
logger.info("Rizzvision backend starting")
45+
logger.info("----------------------------------------")
3346

34-
# 1. TTS warmup
35-
logger.info("[1/2] Loading Kokoro TTS pipelines (en + hi)…")
47+
logger.info("[1/2] Loading Kokoro TTS (en + hi)...")
3648
try:
3749
await asyncio.to_thread(tts_service.warmup)
38-
logger.info("[1/2] TTS ready")
50+
logger.info("[1/2] TTS loaded OK")
3951
except Exception as exc:
40-
logger.error("[1/2] TTS warmup failed: %s", exc)
52+
logger.error("[1/2] TTS load FAILED: %s", exc)
4153

42-
# 2. Clothing classifier
43-
logger.info("[2/2] Loading clothing classifier v3 (EfficientNetB3, 115 MB)…")
54+
logger.info("[2/2] Loading clothing classifier v3 (115 MB)...")
4455
try:
4556
await asyncio.to_thread(clothing_detector._load)
46-
logger.info("[2/2] ✓ Clothing classifier ready — thresholds: %s", clothing_detector._thresholds)
57+
t = clothing_detector._thresholds
58+
logger.info(
59+
"[2/2] Classifier loaded OK | tops=%.3f bottoms=%.3f "
60+
"footwear=%.3f outerwear=%.3f dress=%.3f",
61+
t.get("tops", 0), t.get("bottoms", 0),
62+
t.get("footwear", 0), t.get("outerwear", 0), t.get("dress", 0),
63+
)
4764
except Exception as exc:
48-
logger.error("[2/2] ✗ Clothing classifier failed to load: %s", exc)
65+
logger.error("[2/2] Classifier load FAILED: %s", exc)
4966

50-
logger.info("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
51-
logger.info("All models loaded — accepting requests")
52-
logger.info("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
67+
logger.info("----------------------------------------")
68+
logger.info("All models ready — accepting requests")
69+
logger.info("----------------------------------------")
5370
yield
54-
logger.info("🛑 Rizzvision backend shutting down")
71+
logger.info("Backend shutting down")
5572

5673

5774
app = FastAPI(title="rizzvision-v2", version="2.0.0", lifespan=lifespan)

0 commit comments

Comments
 (0)