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

v2.1Начало работы

Быстрый старт

Разбор лога nginx потоком и фильтрация медленных запросов в двадцати строках.

Задача: найти в access.log запросы с ошибкой сервера или временем ответа больше полутора секунд и показать, сколько строк не удалось разобрать.

Полный пример#

example-basic.mjs
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 этого сайта и подключается директивой, поэтому пример в документации не расходится с проверенным кодом.

Разбор по шагам#

  1. createParser({ format: 'nginx-combined' }) строит разборщик. Шаблон компилируется один раз, дальше каждая строка обрабатывается за один проход.
  2. onError: 'collect' говорит складывать нераспознанные строки в parser.errors, а не бросать исключение. Подробности в разделе ошибки.
  3. parser.query(...) компилирует запрос в обычную функцию (record) => boolean.
  4. parser.stream(readable) возвращает асинхронный итератор записей. Файл читается кусками, память не растёт вместе с размером лога.

Тот же результат из терминала

bash
sverlo parse access.log --format nginx-combined \
  --query 'status>=500 OR request_time>1.5' --out count

Что дальше#

Обновлено: