Ответ вслух Middle Ошибки и логирование обновлено

Как устроить логирование в продакшене

Вопрос

Как бы ты устроил логирование в Node-сервисе, чтобы по логам можно было расследовать инцидент?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Логи пишу структурно: каждое событие это JSON-строка с полями. Беру pino, он быстрый и сам добавляет время и уровень.

Что должно прозвучать в ответе

  • Структурные JSON-логи, быстрый логгер (pino)

  • Уровни: error, warn, info, debug; в проде info+

  • Request id в каждой строке через AsyncLocalStorage, проброс в другие сервисы заголовком

  • Писать в stdout, сбор и хранение на стороне инфраструктуры (Loki, ELK)

  • Маскировать секреты и персональные данные

  • Ключевые поля: маршрут, статус, длительность, userId, тип ошибки

Что могут спросить следом

  • Чем логи отличаются от метрик и трейсов?
  • Как не утонуть в объёме логов?

Разбор

Логи пишу структурно: каждое событие это JSON-строка с полями. Беру pino, он быстрый и сам добавляет время и уровень. Уровни использую осмысленно: error для того, что требует внимания, warn для подозрительного, info для ключевых событий, debug только при отладке.

На входе запроса генерирую request id или беру его из заголовка, кладу в AsyncLocalStorage, и логгер подставляет его в каждую строку. При вызове других сервисов передаю его дальше заголовком, тогда один запрос прослеживается через всю систему.

Пишу в stdout, а сбор, хранение и ротация на стороне инфраструктуры: контейнер, сборщик, Loki или ELK. Секреты, пароли и токены маскирую настройкой redact.

При этом помню, что логи не заменяют метрики и трейсы: долю ошибок и задержки смотрю по метрикам, а логи открываю, когда нужно разобрать конкретный случай.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.