[Feature] Структурированное логирование ошибок и dev-вывода #120

Closed
opened 2026-10-20 21:33:25 +03:00 by codex-bot · 0 comments
Owner

Контекст

Неожиданные 5xx не логируются: HttpExceptionFilter (@Catch()) превращает любое исключение в ответ 500 и не передаёт ошибку в логгер, поэтому pino-http видит только статус. В dev вывод — сырой JSON без цвета (pino-pretty не подключён). Полные тела запросов и ответов не логируются намеренно (ADR 008, backend/.ai/conventions/observability.md) и вне scope этой задачи.

Acceptance Criteria

  1. Неожиданная ошибка (не HttpException) логируется через StructuredLogger.event('error', ...) с полями code, name и stack. Поле message не пишется. Публичный ответ problem+json не меняется.
  2. Для 4xx validation-ошибок в лог попадают имена невалидных полей без значений. Тело ответа не меняется.
  3. В completion-строке HTTP указывается userId, если он есть в res.locals.
  4. В NODE_ENV=development вывод форматируется pino-pretty с цветом уровней. В production пакет не загружается, production-зависимостей не добавляется.
  5. Route для 404 остаётся <unmatched> (защита от кардинальности).
  6. Тесты: HTTP-уровень для фильтра (500 пишет error с полями, ответ не изменён), отсутствие значений в полях 4xx, unit для completion/userId.

Вне scope

  • Полные тела запросов и ответов (требует нового ADR).
  • Сбор, хранение и alerting логов.
## Контекст Неожиданные 5xx не логируются: `HttpExceptionFilter` (`@Catch()`) превращает любое исключение в ответ 500 и не передаёт ошибку в логгер, поэтому pino-http видит только статус. В dev вывод — сырой JSON без цвета (`pino-pretty` не подключён). Полные тела запросов и ответов не логируются намеренно (ADR 008, `backend/.ai/conventions/observability.md`) и вне scope этой задачи. ## Acceptance Criteria 1. Неожиданная ошибка (не `HttpException`) логируется через `StructuredLogger.event('error', ...)` с полями `code`, `name` и stack. Поле `message` не пишется. Публичный ответ problem+json не меняется. 2. Для 4xx validation-ошибок в лог попадают имена невалидных полей без значений. Тело ответа не меняется. 3. В completion-строке HTTP указывается `userId`, если он есть в `res.locals`. 4. В `NODE_ENV=development` вывод форматируется `pino-pretty` с цветом уровней. В production пакет не загружается, production-зависимостей не добавляется. 5. Route для 404 остаётся `<unmatched>` (защита от кардинальности). 6. Тесты: HTTP-уровень для фильтра (500 пишет error с полями, ответ не изменён), отсутствие значений в полях 4xx, unit для completion/`userId`. ## Вне scope - Полные тела запросов и ответов (требует нового ADR). - Сбор, хранение и alerting логов.
codex-bot added the Kind/Enhancement
Priority
Medium
3
labels 2026-10-20 21:33:29 +03:00
hermes-agent was assigned by codex-bot 2026-10-20 21:33:29 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/backend#120