awesome-everything EN
↑ Обратно к восхождению

Наблюдаемость

Log levels и маршрутизация алертов

Суть Лестница TRACE–FATAL контролирует, что хранится, и кого пейджат. Неправильная классификация загрязняет либо алерт, либо счёт.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 10 min

Slack on-call-инженера завален ERROR-алертами. Половина — повторные попытки, которые прошли успешно. Алерты — шум, реальные ошибки тонут, on-call перестаёт реагировать. Баг не в сервисе — в level, присвоенном log-строке.

Лестница levels

Продакшн-лестница имеет шесть ступеней: TRACE / DEBUG / INFO / WARN / ERROR / FATAL. Каждая ступень — контракт о том, какое действие подразумевает log-строка.

LevelЗначениеПродакшн-дефолтМаршрутизация алертов
TRACEОчень детальный, внутренности фреймворкаВыкл (почти никогда)Нет
DEBUGДетали расследования разработчикаВыкл (только dynamic flag)Нет
INFOСмена состояний на success-путиВкл (дефолт)Запрашивается при расследовании
WARNRecoverable-проблемы, деградированный путьВклSlack, capacity-дашборды
ERRORUnrecoverable, работа осталась несделаннойВклПейджить on-call
FATALПроцесс вот-вот умрётВклНемедленно пейджить on-call

Продакшн-дефолт: INFO и выше

Продакшн-дефолт в 2026 — INFO и выше. DEBUG включается только через dynamic flag во время активного расследования — никогда по умолчанию. TRACE редко встречается вне внутренностей фреймворка.

INFO представляет success-path: смены состояний, позволяющие человеку реконструировать, что делал сервис — request_received, request_completed, kafka_message_processed, transaction_committed. Без INFO-строк нельзя реконструировать нормальное поведение до ошибки.

WARN — для recoverable-проблем: retry успешно прошёл после 3 попыток, взят fallback-путь, deprecation-hit, приближение к rate limit. Система продолжила; возможно, нужно что-то сделать в будущем.

ERROR — для unrecoverable-проблем с недоделанной работой: запрос вернул 5xx, сообщение ушло в dead-letter queue, запись откатилась. Кто-то должен расследовать.

FATAL — для «процесс вот-вот умрёт»: assertion failure, неизбежный OOM. После этого процесс обычно сразу падает или перезапускается.

Маршрутизация алертов следует лестнице levels

Контракт level подразумевает маршрутизацию алертов:

  • ERROR + FATAL питают пейджеры и incident-каналы. Пейджер — неявное обещание, что нужно действие.
  • WARN питает Slack и capacity-дашборды. Немедленного действия не требует; тренд стоит отслеживать.
  • INFO запрашивается во время расследования, никогда не алертится напрямую. Алерт на объём INFO срабатывал бы постоянно на нормальном трафике.
  • DEBUG / TRACE полностью фильтруются из продакшн-хранилища.

Почему неправильная классификация вредит

INFO там, где нужен WARN: проблема закапывается в INFO-поток. WARN-маршрутизация не срабатывает. Медленная деградация невидима, пока не станет ERROR.

ERROR там, где нужен WARN: каждый retry, каждый cache miss, каждый ожидаемый таймаут пейджит on-call. On-call перестаёт реагировать. Когда приходит реальный ERROR, он тонет в шуме. Alert fatigue — один из самых опасных observability-провалов, и почти всегда вызывается over-classified levels.

DEBUG, оставленный включённым в продакшне: runaway cost. Сервис, эмитирующий DEBUG на 1000 req/s, логирует внутренние детали на каждый вызов. При throughput pino ~140k msg/sec это ещё выполнимо, но объём — в 100x раз больше INFO-потока — попадает на backend с полной ingest-ценой. Команды получали счета в 10x за один PR, оставивший debug-флаг включённым.

Почему это работает

Dynamic DEBUG enabling — production-safe паттерн: уровень DEBUG установлен в OFF по умолчанию через environment variable или feature flag и переключается в runtime (обычно обновлением config map или вызовом management endpoint) для конкретного инстанса сервиса во время активного расследования. Через 30-60 минут переключатель истекает или отключается вручную. Этот паттерн даёт DEBUG-детали когда нужно и гарантирует, что ты никогда не платишь за них в steady state.

Викторина

Retry-attempt-цикл эмитирует ERROR на каждую из 5 попыток, включая 3 успешных. Что неправильно в этой классификации?

Викторина

В продакшне — какой log level правильный дефолт для нормальной обработки запроса (например, request_completed со статусом 200)?

Расставь шаги по порядку

Сопоставь каждый сценарий с правильным log level (порядок от TRACE до FATAL):

  1. 1 Bind-параметры конкретного SQL-запроса во время дебага
  2. 2 Checkout-запрос успешно завершён (статус 200)
  3. 3 Попытка retry успешна на попытке 3 из 5
  4. 4 Запрос вернул 503, потому что upstream payment gateway завис, работа не сделана
  5. 5 Приложение поймало unhandled exception и вот-вот завершится
Вспомните перед уходом
  1. 01
    В чём разница между WARN и ERROR и почему это важно для маршрутизации алертов?
  2. 02
    Почему оставление DEBUG включённым в продакшне — это риск стоимости, а не просто риск шума?
  3. 03
    Что такое паттерн dynamic DEBUG flag и почему он лучше перезапуска процесса?
Итог

Шестиступенчатая лестница — TRACE, DEBUG, INFO, WARN, ERROR, FATAL — служит двум целям: volume control (что хранится) и маршрутизация алертов (кто уведомляется). Продакшн-дефолт — INFO и выше; DEBUG выключен по умолчанию и включается только через dynamic flag во время расследования. INFO логирует success-path, WARN — recoverable-деградации, ERROR — unrecoverable-провалы с недоделанной работой, FATAL — неизбежную смерть процесса. Маршрутизация алертов следует напрямую: ERROR и FATAL пейджат on-call, WARN питает дашборды, INFO запрашивается при расследовании. Неправильная классификация создаёт два failure-mode: over-classification (recoverable-проблема как ERROR) вызывает alert fatigue; under-classification (unrecoverable-проблема как WARN) делает реальные провалы невидимыми.

Связанные уроки
встречается в167
Продолжить восхождение ↑Стратегии sampling и стоимость логов
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.