v2.1Концепции
Архитектура
Из каких стадий состоит конвейер разбора и почему каждая из них отделена от остальных.
Разбор устроен как конвейер из пяти стадий. Каждая стадия принимает данные предыдущей и ничего не знает о следующей, поэтому их можно тестировать и заменять по отдельности.
источник -> разделитель -> склейка -> сопоставитель -> фильтр -> приёмник
(Readable) (строки) (multiline) (формат/шаблон) (query) (ваш код)Стадии#
- Разделитель строк. Режет поток на строки по
\nи\r\n, хранит неполный хвост между чанками и отбрасывает строки длиннееmaxLineLengthдо того, как они попадут в память. - Склейка. Применяет правило
multiline. Если правило не задано, стадия ничего не делает и не копирует данные. - Сопоставитель. Применяет формат или шаблон. Шаблон компилируется в конечный автомат, который читает строку слева направо один раз.
- Типизатор. Превращает найденные подстроки в
Date, числа и уровни. Ошибка типа превращается вParseError, а не вNaN. - Фильтр. Функция из
parser.queryпропускает или отбрасывает готовую запись.
Решения и причины#
| Решение | Причина |
|---|---|
| Автомат вместо регулярных выражений | Время работы линейно по длине строки, строка с миллионом пробелов не вешает процесс |
| Запись создаётся только после успешной типизации | Нет наполовину заполненных объектов в parser.errors |
fields без прототипа | Ключи из лога не могут перезаписать методы объекта |
| Нет глобального состояния | Два разборщика в одном процессе не влияют друг на друга |
Нет eval и new Function | Запрос и шаблон из внешнего источника нельзя превратить в выполнение кода |
Границы ответственности#
Сверло не читает файлы само, не следит за ротацией логов и не отправляет записи по сети. Для первого есть Readable, для второго — tail в CLI, для третьего — ваш код. Узкая зона ответственности держит библиотеку маленькой и предсказуемой.
Об ожидаемой скорости и бюджетах читайте в разделе производительность.