fix(backend): emit app.* INFO logs to stdout on the API process (#1926) #1941

Merged
bot-backend merged 1 commit from fix/1926-app-log-stdout into main 2026-06-27 02:59:09 +00:00
Collaborator

Что

App-level логи (logging.getLogger("app.*")) не имели StreamHandler → их INFO терялся: docker logs gendesign-backend-1 показывал только uvicorn-логгеры. Полезные строки («OSRM road-distance applied», RBAC, analyze, zone-regulation) были невидимы при отладке на VPS (в Sentry/GlitchTip они шли breadcrumb'ами, но не в stdout). Особенно мешает после флипа OSRM (#39) — не видно fallback-rate и применение.

Как

main.py вешает один StreamHandler на корневой "app" логгер на уровне APP_LOG_LEVEL (default INFO):

  • propagate=True сохранён → Sentry/GlitchTip LoggingIntegration (хендлер на root) продолжает получать breadcrumbs/events.
  • Нет двойного stdout: у root своего stdout-хендлера нет (uvicorn default config вешает хендлеры только на uvicorn* логгеры с propagate:false) — подтверждено ревьюером дампом uvicorn LOGGING_CONFIG.
  • Идемпотентно: маркер _gd_app_stream guard против дубля при uvicorn --reload / повторном импорте.
  • API-процесс только (main.py); celery worker (celery_app.py) НЕ тронут — там loader'ы чатятся per-sync, INFO бы зашумил.
  • Flood-safe на API: analyze-путь логирует INFO per-request (parcels.py — 3 logger.info), не per-row.

Проверки

  • ruff · новый tests/test_app_logging.py (handler present + level INFO + propagate intact) + test_health .
  • code-reviewer: APPROVE, 0 critical — load-bearing «no double-emit» проверен дампом uvicorn config (root без stdout-хендлера); Sentry intact; идемпотентность; flood-safety; attr-trick валиден.

Пост-деплой verify (закрывает no-double-emit + Sentry-intact в проде): после одного /analyze в docker logs gendesign-backend-1 появится строка app.* INFO («OSRM road-distance applied») ровно один раз + breadcrumb в GlitchTip.

Refs #1926

## Что App-level логи (`logging.getLogger("app.*")`) не имели StreamHandler → их INFO терялся: `docker logs gendesign-backend-1` показывал только uvicorn-логгеры. Полезные строки («OSRM road-distance applied», RBAC, analyze, zone-regulation) были **невидимы при отладке на VPS** (в Sentry/GlitchTip они шли breadcrumb'ами, но не в stdout). Особенно мешает после флипа OSRM (#39) — не видно fallback-rate и применение. ## Как `main.py` вешает **один** StreamHandler на корневой `"app"` логгер на уровне `APP_LOG_LEVEL` (default INFO): - **propagate=True** сохранён → Sentry/GlitchTip LoggingIntegration (хендлер на root) продолжает получать breadcrumbs/events. - **Нет двойного stdout**: у root своего stdout-хендлера нет (uvicorn default config вешает хендлеры только на `uvicorn*` логгеры с `propagate:false`) — подтверждено ревьюером дампом uvicorn LOGGING_CONFIG. - **Идемпотентно**: маркер `_gd_app_stream` guard против дубля при uvicorn `--reload` / повторном импорте. - **API-процесс только** (main.py); celery worker (`celery_app.py`) НЕ тронут — там loader'ы чатятся per-sync, INFO бы зашумил. - **Flood-safe на API**: analyze-путь логирует INFO per-request (`parcels.py` — 3 `logger.info`), не per-row. ## Проверки - `ruff` ✅ · новый `tests/test_app_logging.py` (handler present + level INFO + propagate intact) + `test_health` ✅. - `code-reviewer`: **✅ APPROVE**, 0 critical — load-bearing «no double-emit» проверен дампом uvicorn config (root без stdout-хендлера); Sentry intact; идемпотентность; flood-safety; attr-trick валиден. Пост-деплой verify (закрывает no-double-emit + Sentry-intact в проде): после одного `/analyze` в `docker logs gendesign-backend-1` появится строка app.* INFO («OSRM road-distance applied») ровно один раз + breadcrumb в GlitchTip. Refs #1926
bot-backend added 1 commit 2026-06-27 02:46:26 +00:00
fix(backend): emit app.* INFO logs to stdout on the API process (#1926)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 1m57s
CI / backend-tests (pull_request) Successful in 12m12s
eab7e3b9f3
App-level logs (logging.getLogger("app.*")) had no StreamHandler, so their
INFO was lost — `docker logs gendesign-backend-1` showed only uvicorn loggers.
Useful lines (e.g. "OSRM road-distance applied", RBAC, analyze) were invisible
when debugging on the VPS (only Sentry/GlitchTip received them as breadcrumbs).

main.py now attaches one StreamHandler to the root "app" logger at
APP_LOG_LEVEL (default INFO), idempotent (marker guard), propagate=True so the
Sentry LoggingIntegration on root still gets breadcrumbs/events and there's no
stdout double (root has no stdout handler). API process only — celery worker
(celery_app.py) untouched, since its loaders log per-sync and would be noisy.
Flood-safe on the API: the analyze hot path logs INFO per-request (parcels.py
has 3 logger.info), not per-row.

Adds tests/test_app_logging.py (handler present, level INFO, propagate intact).

Refs #1926
bot-backend merged commit fc61fee15e into main 2026-06-27 02:59:09 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1941
No description provided.