Продолжение статьи Магия преобразований: ЖР, ТЖ, RAS/RAC, логи - универсальное решение Vector
Посвящена тонкостям универсального разбора технологического журнала и пример отправки его напрямую в ClickHouse. В конце статьи Инструменты экспорта журнала регистрации 1С в ClickHouse/ElasticSearch найдёте интересную табличку сравнения.
Практическая часть
На входе в конвейер Vector имеет многострочный текст одной строки технологического журнала (для наглядности скриншота добавил дополнительные переносы строк):
Первичная внутренняя картина на входе блока Sources типа File (отладочный вывод в формате JSON; правая часть строк message обрезана на скриншоте, она полностью содержит многострочную строку):
Первым шагом в блоке трансформации с типом remap с помощью регулярного выражения
(?P<DateTime>\d{2}:\d{2}.\d{6})-(?P<Duration>\d+),(?P<Event>[a-zA-Z]+),(?P<Level>\d{1}),(?P<Content>(?s).*[^\n|\r$])
разложим message на DateTime, Duration, Event, Level и Content. Так же на основе имени файла получим недостающую информацию о дате и времени. Из части имени каталога получим pid-процесса. На основе Duration для удобства дальнейшего использования вычислим дату-время начала события DateTimeStart:
С помощью регулярного выражения
[^,]*=\'[^\']*\'
вырежем из Content все конструкции ='...', обработаем их отдельно и добавим к результату (Headers и URI):
При необходимости можно пойти и глубже - вторично разложить свойства на составляющие (на все или выборочно), пример для Headers:
Завершающим этапом оставшуюся строку Content раскладываем на части по разделителю ',', профит:
Дополнение
Так же при необходимости можно сразу добавить, к примеру, блок нормализации текстов SQL-запросов:
'%#tt[0-9]%' -> '#tt'
Экспорт в ClickHouse
С помощью завершающего блока конвейера вида Sinks и типа clickhouse отправляем распарсенные данные в ClickHouse (база данных и таблица должны быть созданы заранее):
clickhouse:
type: clickhouse
inputs:
- ParseTechJournal
endpoint: 'http://[ip]:8124'
auth:
strategy: basic
user: default
password: '12345678'
database: log_storage
table: logs_app
skip_unknown_fields: false
encoding:
timestamp_format: rfc3339
batch:
max_events: 100
timeout_secs: 5
Примечание 1. Параметр skip_unknown_fields у меня почему-то игнорируется - отсутствующие в схеме БД поля всегда игнорируются. Если кто подскажет в комментариях, что не так - буду благодарен.
Примечание 2. Для поддержки расширенных форматов импорта данных (в нашем случае поддержка миллисекунд и часового пояса) в конфигурационный файл пользователя ClickHouse (по умолчанию /etc/clickhouse-server/users.xml) необходимо добавить:
<clickhouse>
<profiles>
<default>
<date_time_input_format>best_effort</date_time_input_format>
<date_time_output_format>iso</date_time_output_format>
</default>
Примечание 3. Если вы хотите отправлять данные в разные таблицы БД, в зависимости от Event, то необходимо до добавить блок трансформации с типом Route или поместить имя таблицы в отдельное поле и ссылаться на неё как на переменную. Для фильтрации событий используйте блок трансформации с типом Filter.
Анонс
Следующая часть самая сложная - журнал регистрации 1С.