- У вас уже есть работающий ClickHouse
- У вас установлен Vector
1
Создайте базу данных и таблицу
Создайте таблицу для хранения событий журнала:
- Начните с создания новой базы данных
nginxdb:
- Вставьте всё событие лога как одну строку. Очевидно, это не лучший формат для анализа логов, но ниже мы решим эту проблему с помощью materialized views.
ORDER BY задан как tuple() (пустой кортеж), так как первичный ключ пока не нужен.
2
Настройка Nginx
На этом шаге показано, как настроить ведение журналов в Nginx.
- Следующее свойство
access_logнаправляет журнал в/var/log/nginx/my_access.logв формате combined. Это значение нужно указать в разделеhttpфайлаnginx.conf:
-
Обязательно перезапустите Nginx, если вам пришлось изменить
nginx.conf. - Откройте страницы на вашем веб-сервере, чтобы сгенерировать несколько событий в журнале доступа. Записи журнала в формате combined выглядят следующим образом:
3
Настройка Vector
Vector собирает, преобразует и маршрутизирует журналы, метрики и трассировки (так называемые источники) в различные системы назначения (так называемые приемники), включая встроенную совместимость с ClickHouse.
Источники и приемники задаются в файле конфигурации vector.toml.
- Следующий файл vector.toml определяет источник типа file, который читает новые записи с конца файла my_access.log, а также приемник — таблицу access_logs, определенную выше:
- Запустите Vector, используя приведённую выше конфигурацию. Подробнее о настройке источников и приёмников см. в документации Vector.
- Убедитесь, что журналы доступа записываются в ClickHouse, выполнив следующий запрос. В таблице должны появиться журналы доступа:
4
Разбор журналов
Хранить журналы в ClickHouse удобно, однако запись каждого события в виде одной строки существенно ограничивает возможности анализа данных.
Далее рассмотрим, как разобрать события журнала с помощью materialized view.Materialized view работает аналогично триггеру вставки в SQL. Когда строки данных вставляются в исходную таблицу, materialized view выполняет некоторое преобразование этих строк и вставляет результаты в целевую таблицу.
Materialized view можно настроить для получения разобранного представления событий журнала в access_logs.
Пример одного такого события журнала приведён ниже:В ClickHouse есть различные функции для разбора приведённой выше строки. Функция В некоторых строках есть лишние символы, а user agent (сведения о браузере) не нуждался в разборе, однако
результирующий массив близок к тому, что требуется.Аналогично Обратите внимание, что вторая возвращённая строка — это user agent, успешно извлечённый из лога:Прежде чем рассмотреть финальную команду Строка времени начинается с символа Теперь можно определить materialized view.
Приведённое ниже определение включает Теперь убедитесь, что всё работает.
Журналы доступа должны быть аккуратно разобраны по столбцам:
splitByWhitespace разбивает строку по пробельным символам и возвращает каждый токен в виде массива.
Для демонстрации выполните следующую команду:Query
Response
splitByWhitespace, функция splitByRegexp разбивает строку на массив по регулярному выражению.
Выполните следующую команду, которая возвращает две строки.CREATE MATERIALIZED VIEW, ознакомимся ещё с несколькими функциями для очистки данных.
Например, значение RequestMethod равно "GET и содержит лишнюю двойную кавычку.
Для её удаления можно воспользоваться функцией trimBoth (alias trim):[ и не имеет формата, который ClickHouse может разобрать как дату.
Однако если изменить разделитель с двоеточия (:) на запятую (,), разбор выполняется корректно:POPULATE, что означает: существующие строки в access_logs будут обработаны и вставлены немедленно.
Выполните следующий SQL-оператор:В уроке выше данные сохранялись в двух таблицах, но вы можете изменить исходную таблицу
nginxdb.access_logs, чтобы использовать для неё движок таблицы Null.
Разобранные данные по-прежнему будут попадать в таблицу nginxdb.access_logs_view, но сырые данные не будут храниться в таблице.С помощью Vector, для которого нужны лишь простая установка и быстрая настройка, вы можете отправлять журналы с сервера Nginx в таблицу ClickHouse. С помощью materialized view можно разобрать эти журналы на столбцы для более удобной аналитики.