Skip to main content
Возможность анализировать журналы в реальном времени критически важна для приложений в продакшне. ClickHouse отлично подходит для хранения и анализа данных журналов благодаря превосходному сжатию (до 170x для журналов) и способности быстро агрегировать большие объёмы данных. В этом руководстве показано, как использовать популярный конвейер данных Vector для отслеживания файла журнала Nginx и отправки данных в ClickHouse. Приведённые ниже шаги аналогичны для отслеживания любого файла журнала. Предварительные требования:
  • У вас уже есть работающий ClickHouse
  • У вас установлен Vector
1

Создайте базу данных и таблицу

Создайте таблицу для хранения событий журнала:
  1. Начните с создания новой базы данных nginxdb:
  1. Вставьте всё событие лога как одну строку. Очевидно, это не лучший формат для анализа логов, но ниже мы решим эту проблему с помощью materialized views.
ORDER BY задан как tuple() (пустой кортеж), так как первичный ключ пока не нужен.
2

Настройка Nginx

На этом шаге показано, как настроить ведение журналов в Nginx.
  1. Следующее свойство access_log направляет журнал в /var/log/nginx/my_access.log в формате combined. Это значение нужно указать в разделе http файла nginx.conf:
  1. Обязательно перезапустите Nginx, если вам пришлось изменить nginx.conf.
  2. Откройте страницы на вашем веб-сервере, чтобы сгенерировать несколько событий в журнале доступа. Записи журнала в формате combined выглядят следующим образом:
3

Настройка Vector

Vector собирает, преобразует и маршрутизирует журналы, метрики и трассировки (так называемые источники) в различные системы назначения (так называемые приемники), включая встроенную совместимость с ClickHouse. Источники и приемники задаются в файле конфигурации vector.toml.
  1. Следующий файл vector.toml определяет источник типа file, который читает новые записи с конца файла my_access.log, а также приемник — таблицу access_logs, определенную выше:
  1. Запустите Vector, используя приведённую выше конфигурацию. Подробнее о настройке источников и приёмников см. в документации Vector.
  2. Убедитесь, что журналы доступа записываются в ClickHouse, выполнив следующий запрос. В таблице должны появиться журналы доступа:
4

Разбор журналов

Хранить журналы в ClickHouse удобно, однако запись каждого события в виде одной строки существенно ограничивает возможности анализа данных. Далее рассмотрим, как разобрать события журнала с помощью materialized view.Materialized view работает аналогично триггеру вставки в SQL. Когда строки данных вставляются в исходную таблицу, materialized view выполняет некоторое преобразование этих строк и вставляет результаты в целевую таблицу. Materialized view можно настроить для получения разобранного представления событий журнала в access_logs. Пример одного такого события журнала приведён ниже:
В ClickHouse есть различные функции для разбора приведённой выше строки. Функция splitByWhitespace разбивает строку по пробельным символам и возвращает каждый токен в виде массива. Для демонстрации выполните следующую команду:
Query
Response
В некоторых строках есть лишние символы, а user agent (сведения о браузере) не нуждался в разборе, однако результирующий массив близок к тому, что требуется.Аналогично splitByWhitespace, функция splitByRegexp разбивает строку на массив по регулярному выражению. Выполните следующую команду, которая возвращает две строки.
Обратите внимание, что вторая возвращённая строка — это user agent, успешно извлечённый из лога:
Прежде чем рассмотреть финальную команду CREATE MATERIALIZED VIEW, ознакомимся ещё с несколькими функциями для очистки данных. Например, значение RequestMethod равно "GET и содержит лишнюю двойную кавычку. Для её удаления можно воспользоваться функцией trimBoth (alias trim):
Строка времени начинается с символа [ и не имеет формата, который ClickHouse может разобрать как дату. Однако если изменить разделитель с двоеточия (:) на запятую (,), разбор выполняется корректно:
Теперь можно определить materialized view. Приведённое ниже определение включает POPULATE, что означает: существующие строки в access_logs будут обработаны и вставлены немедленно. Выполните следующий SQL-оператор:
Теперь убедитесь, что всё работает. Журналы доступа должны быть аккуратно разобраны по столбцам:
В уроке выше данные сохранялись в двух таблицах, но вы можете изменить исходную таблицу nginxdb.access_logs, чтобы использовать для неё движок таблицы Null. Разобранные данные по-прежнему будут попадать в таблицу nginxdb.access_logs_view, но сырые данные не будут храниться в таблице.
С помощью Vector, для которого нужны лишь простая установка и быстрая настройка, вы можете отправлять журналы с сервера Nginx в таблицу ClickHouse. С помощью materialized view можно разобрать эти журналы на столбцы для более удобной аналитики.
Последнее изменение 24 июля 2026 г.