"""#1926 observability: app-logger StreamHandler в main.py (логи app.* в stdout). Без него INFO от `logging.getLogger("app.*")` терялся (в `docker logs` видны были только uvicorn-логгеры), и полезные строки (OSRM road-distance applied, RBAC, analyze) были невидимы при отладке на VPS. """ from __future__ import annotations import logging def test_app_logger_has_stdout_handler() -> None: import app.main # noqa: F401 — module-level logging setup выполняется на импорте app_logger = logging.getLogger("app") # Уровень INFO (default APP_LOG_LEVEL). assert app_logger.level == logging.INFO # Ровно один маркированный StreamHandler — идемпотентность (повторный импорт # не плодит дубли). marked = [h for h in app_logger.handlers if getattr(h, "_gd_app_stream", False)] assert len(marked) == 1 assert isinstance(marked[0], logging.StreamHandler) # propagate=True → Sentry/GlitchTip LoggingIntegration (хендлер на root) # продолжает получать breadcrumbs/events; stdout-дубля нет (у root своего # stdout-хендлера нет). assert app_logger.propagate is True