v2.1Начало работы
Быстрый старт
Разбор лога nginx потоком и фильтрация медленных запросов в двадцати строках.
Задача: найти в access.log запросы с ошибкой сервера или временем ответа больше полутора секунд и показать, сколько строк не удалось разобрать.
Полный пример#
import { createReadStream } from 'node:fs';
import { createParser } from 'sverlo';
const parser = createParser({ format: 'nginx-combined', onError: 'collect' });
const slow = parser.query('status>=500 OR request_time>1.5');
let hits = 0;
for await (const rec of parser.stream(createReadStream('access.log'))) {
if (!slow(rec)) continue;
hits++;
console.log(rec.ts.toISOString(), rec.fields.status, rec.fields.path);
}
console.log(`slow or failed: ${hits}, unparsed: ${parser.errors.length}`);Файл example-basic.mjs лежит в каталоге includes этого сайта и подключается директивой, поэтому пример в документации не расходится с проверенным кодом.
Разбор по шагам#
createParser({ format: 'nginx-combined' })строит разборщик. Шаблон компилируется один раз, дальше каждая строка обрабатывается за один проход.onError: 'collect'говорит складывать нераспознанные строки вparser.errors, а не бросать исключение. Подробности в разделе ошибки.parser.query(...)компилирует запрос в обычную функцию(record) => boolean.parser.stream(readable)возвращает асинхронный итератор записей. Файл читается кусками, память не растёт вместе с размером лога.
Тот же результат из терминала
sverlo parse access.log --format nginx-combined \
--query 'status>=500 OR request_time>1.5' --out countЧто дальше#
- Свой формат строк: шаблоны.
- Стек-трейсы и другие записи на несколько строк: многострочные записи.
- Рецепт для реального сервера: nginx.