Как устроить логирование в продакшене
Вопрос
Как бы ты устроил логирование в Node-сервисе, чтобы по логам можно было расследовать инцидент?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Структурные 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 ошибок.