v2.1Рецепты
JSON-логи приложения
Как работать с структурированными логами: имена полей, вложенные объекты и выбор записей по контексту запроса.
Структурированный лог проще разбирать, но у каждой библиотеки логирования свои имена ключей. Сверло ищет время, уровень и сообщение среди типичных вариантов, а остальное оставляет как есть.
Пример#
{"time":"2026-10-01T09:14:07.412Z","level":"error","msg":"payment failed","req":{"id":"a1f3","user":42},"ms":812}const parser = createParser({ format: 'json-lines' });
const rec = parser.parseLine(line);
rec.level; // 'error'
rec.fields.req.id; // 'a1f3'
rec.fields.ms; // 812Свои имена ключей#
Если время лежит под необычным ключом, задайте соответствие:
createParser({ format: 'json-lines', keys: { ts: 'at', level: 'sev', msg: 'text' } });Числовые уровни из pino (10–60) и bunyan (10–60) приводятся автоматически: 30 станет info, 50 — error.
Вложенные поля в запросе#
Запрос обращается к вложенным значениям через точку:
req.user:42 AND ms>500Если ключ вложенного объекта сам содержит точку, берите его в двойные кавычки: "req.id":"a1f3".
Склейка запросов по req.id#
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 и не мешают остальным.