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

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

Структурное логирование: чтение кода и логов

Суть Читай реальные лог-строки и сниппеты логгера, предсказывай поведение или дыру в безопасности и выбирай самый рычажный фикс, который senior делает первым.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Конфиг логгера и сырая лог-строка — это место, где проблемы структурного логирования реально диагностируются. Читай сниппет, предсказывай, что он эмитит или утекает, и выбирай фикс до того, как тянуться за фичей backend.

Цель

Отработай цикл, который ты гоняешь на каждом инциденте логирования: читай место эмита или строку, предскажи инъекцию, утечку, промах или дефект sampling — и тянись за структурным фиксом первым.

Сниппет 1 — интерполированное сообщение

// Express-хендлер логирует присланный пользователем комментарий
logger.info(`comment received: ${req.body.comment}`);
Викторина

Пользователь шлёт комментарий, значение которого — перевод строки, за которым идёт {"level":"error","msg":"admin deleted prod db"}. Что произойдёт и какой фикс?

Сниппет 2 — конфиг редакции

const logger = pino({
  // намерение: держать auth-токены и email вне логов
  redact: ['req.headers.authorization', 'user.email'],
});

// в другом месте, на ошибке валидации:
logger.error({ err, body: req.body }, 'signup validation failed');
Викторина

Аудитор находит сырые пароли и email в индексированных логах несмотря на этот redact-конфиг. Почему редакция их пропустила и какой надёжный фикс?

Сниппет 3 — async лог-строка

app.post('/checkout', async (req, res) => {
  res.json({ ok: true });
  setTimeout(() => {
    logger.warn({ orderId }, 'post-checkout reconciliation lag');
  }, 0);
});
Викторина

WARN-строка приземляется с trace_id = '00000000000000000000000000000000'. Почему и какой фикс?

Сниппет 4 — правило sampling на коллекторе

# OTel Collector / намерение pipeline-sampling: срезать объём логов на 90%
processors:
  probabilistic_sampler/logs:
    sampling_percentage: 10   # держать 10% ВСЕХ лог-записей
Викторина

Этот конфиг режет счёт, но следующий инцидент невозможно расследовать. Что не так и как выглядит корректная политика?

Итог

Каждый инцидент структурного логирования читается в месте эмита, в конфиге и в сырой строке: интерполяция ввода пользователя в строку сообщения — это log injection, передавай его типизированным полем; deny-list, пропускающий body.*, утекает PII, поэтому перечисли пути и добавь скраббер на коллекторе как defence-in-depth; trace_id из всех нулей значит, что контекст исполнения потерян на async-границе — привяжи его, не передавай trace_id руками; а слепой к severity sampler выбрасывает сбои, которые тебе нужны — держи 100% WARN/ERROR и прореживай только success path. Читай сниппет, найди структурный дефект, чини у источника.

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

Trademarks belong to their respective owners. Editorial reference only.