Перейти к содержимому
Разделы
ЯзыкRUEN

v2.1Рецепты

JSON-логи приложения

Как работать с структурированными логами: имена полей, вложенные объекты и выбор записей по контексту запроса.

Структурированный лог проще разбирать, но у каждой библиотеки логирования свои имена ключей. Сверло ищет время, уровень и сообщение среди типичных вариантов, а остальное оставляет как есть.

Пример#

json
{"time":"2026-10-01T09:14:07.412Z","level":"error","msg":"payment failed","req":{"id":"a1f3","user":42},"ms":812}
js
const parser = createParser({ format: 'json-lines' });
const rec = parser.parseLine(line);
rec.level;            // 'error'
rec.fields.req.id;    // 'a1f3'
rec.fields.ms;        // 812

Свои имена ключей#

Если время лежит под необычным ключом, задайте соответствие:

js
createParser({ format: 'json-lines', keys: { ts: 'at', level: 'sev', msg: 'text' } });

Числовые уровни из pino (10–60) и bunyan (10–60) приводятся автоматически: 30 станет info, 50 — error.

Вложенные поля в запросе#

Запрос обращается к вложенным значениям через точку:

text
req.user:42 AND ms>500

Если ключ вложенного объекта сам содержит точку, берите его в двойные кавычки: "req.id":"a1f3".

Склейка запросов по req.id#

js
const byRequest = new Map();
for await (const rec of parser.stream(src)) {
  const id = rec.fields.req?.id;
  if (!id) continue;
  (byRequest.get(id) ?? byRequest.set(id, []).get(id)).push(rec);
}

Не копите всё

Пример выше хранит все записи в памяти. На большом логе удаляйте группу после закрытия запроса или ограничьте размер Map: иначе потоковая обработка теряет смысл.

Строки, которые не являются JSON, например приветствие процесса при старте, попадают в ошибки с кодом E_NO_MATCH и не мешают остальным.

Обновлено: