Репликация логов в объектное хранилище с помощью Fluent Bit
С помощью Fluent Bit можно настроить агрегацию и репликацию логов из распределенных систем в объектное хранилище VK Object Storage. Логи собираются с машин, обрабатываются и отправляются в бакет VK Object Storage для длительного хранения и последующего анализа downstream-системами.
Для примера далее используются следующие данные:
- Имя бакета:
fluent-bit-logs - Регион аккаунта:
ru-msk(Москва) - Эндпоинт VK Object Storage:
https://hb.ru-msk.vkcloud-storage.ru - Путь к лог-файлу:
/var/log/app/application.log
-
Создайте аккаунт для сервиса VK Object Storage, если это еще не сделано:
-
Перейдите в личный кабинет VK Cloud.
-
Выберите проект.
-
Перейдите в раздел Object Storage → Аккаунты.
-
Нажмите кнопку Добавить аккаунт или Добавить.
-
Задайте имя аккаунта.
-
Нажмите кнопку Создать.
-
В открывшемся окне скопируйте и сохраните идентификатор ключа доступа (Access Key ID) и секретный ключ (Secret Key).
-
-
Создайте бакет VK Object Storage с именем
fluent-bit-logs. -
Убедитесь, что AWS CLI установлен и настроен для работы с созданным аккаунтом VK Object Storage. Это потребуется для проверки отправленных логов.
-
Установите Fluent Bit на машину, с которой будут собираться логи. Инструкции по установке доступны в официальной документации Fluent Bit.
Для доступа к VK Object Storage агент Fluent Bit использует идентификатор ключа доступа и секретный ключ. Не указывайте учетные данные в конфигурационном файле напрямую — используйте переменные окружения.
-
Создайте файл с переменными окружения, например
/etc/fluent-bit/s3-credentials.env:export S3_ACCESS_KEY_ID=<ACCESS_KEY_ID>export S3_SECRET_ACCESS_KEY=<SECRET_KEY>Здесь:
<ACCESS_KEY_ID>— сохраненный при создании аккаунта VK Object Storage идентификатор ключа доступа.<SECRET_KEY>— сохраненный при создании аккаунта VK Object Storage секретный ключ.
-
Ограничьте доступ к файлу с учетными данными:
chmod 600 /etc/fluent-bit/s3-credentials.env -
Настройте загрузку переменных окружения перед запуском Fluent Bit. Если Fluent Bit запускается через плагин systemd, добавьте в юнит-файл:
[Service]EnvironmentFile=/etc/fluent-bit/s3-credentials.env
Конфигурация Fluent Bit состоит из трех основных секций: Input (источник логов), Filter (обработка) и Output (отправка в VK Object Storage).
-
Создайте или отредактируйте файл
/etc/fluent-bit/fluent-bit.conf:[SERVICE]Flush 5Log_Level infostorage.path /var/log/flb-storage/Parsers_File /etc/fluent-bit/parsers.conf[INPUT]Name tailPath /var/log/app/application.logTag app.logsRefresh_Interval 5Mem_Buf_Limit 50MBSkip_Long_Lines On[FILTER]Name parserMatch app.logsKey_Name logParser app_log_parserPreserve_Key trueReserve_Data true[OUTPUT]Name s3Match app.logsregion ru-mskbucket fluent-bit-logsendpoint_url https://hb.ru-msk.vkcloud-storage.ruaccess_key ${S3_ACCESS_KEY_ID}secret_key ${S3_SECRET_ACCESS_KEY}use_put_object Ons3_key_format /logs/%Y/%m/%d/%H/%M-%S-$UUIDtotal_file_size 50Mupload_timeout 10mЗдесь:
-
Name— используемый плагин. Вместо плагинаtailможно использовать плагинsystemdдля сбора логов из journald. В этом случае в блок[INPUT]нужно добавить дополительные параметры. -
Path— путь к лог-файлу. Для примера используется/var/log/app/application.log. -
Tag— тег для маркировки потока логов. -
region— код региона аккаунта VK Object Storage. Для примера используетсяru-msk. -
bucket— имя бакета, в который будут отправляться логи. Для примера используетсяfluent-bit-logs. -
endpoint_url— домен сервиса VK Object Storage, должен соответствовать региону аккаунта:https://hb.ru-msk.vkcloud-storage.ru— для региона Москва;https://hb.kz-ast.vkcloud-storage.ru— для региона Казахстан.
-
access_keyиsecret_key— значения из переменных окружения, настроенных ранее. -
s3_key_format— формат имени файла (ключа объекта) в бакете.
-
-
Создайте файл парсера
/etc/fluent-bit/parsers.conf:[PARSER]Name app_log_parserFormat jsonTime_Key timestampTime_Format %Y-%m-%dT%H:%M:%S.%L
При потере сетевого соединения между Fluent Bit и VK Object Storage логи должны сохраняться в локальный буфер и отправляться после восстановления связи. Для этого используется файловая система в качестве хранилища буфера.
-
Убедитесь, что в секции
[SERVICE]указан путь к хранилищу буфера:[SERVICE]storage.path /var/log/flb-storage/ -
Добавьте параметр
storage.typeв секции[INPUT]:[INPUT]Name tailPath /var/log/app/application.logTag app.logsRefresh_Interval 5Mem_Buf_Limit 50MBSkip_Long_Lines Onstorage.type filesystemЗдесь:
storage.type filesystem— включает запись буфера на диск при переполнении оперативной памяти.Mem_Buf_Limit— задает лимит использования оперативной памяти; при превышении лимита данные записываются на диск.
-
Добавьте параметры повторной отправки в секцию
[OUTPUT]:[OUTPUT]Name s3Match app.logsregion ru-mskbucket fluent-bit-logsendpoint_url https://hb.ru-msk.vkcloud-storage.ruaccess_key ${S3_ACCESS_KEY_ID}secret_key ${S3_SECRET_ACCESS_KEY}use_put_object Ons3_key_format /logs/%Y/%m/%d/%H/%M-%S-$UUIDtotal_file_size 50Mupload_timeout 10mRetry_Limit 5storage.type filesystemЗдесь:
Retry_Limit— количество попыток повторной отправки при ошибке.storage.type filesystem— использует файловую систему для буферизации данных выходного потока.
-
Создайте директорию для буфера и задайте права:
mkdir -p /var/log/flb-storage/chown fluent:fluent /var/log/flb-storage/
Формат именования файлов (key format) определяет, как будут называться объекты в бакете VK Object Storage. Удобный формат позволяет downstream-системам эффективно парсить и запрашивать логи по дате и времени.
Параметр s3_key_format в секции [OUTPUT] задает шаблон имени файла. Доступные переменные шаблона:
%Y— год%m— месяц%d— день%H— час%M— минута%S— секунда$UUID— уникальный идентификатор файла$TAG— тег потока логов
Примеры форматов:
# Иерархический формат по дате и времениs3_key_format /logs/%Y/%m/%d/%H/%M-%S-$UUID# Формат с тегом для разделения по источникамs3_key_format /logs/$TAG/%Y/%m/%d/%H-%M-$UUID# Плоский формат с датойs3_key_format /logs/%Y%m%d-%H%M%S-$UUID
Для примера используется иерархический формат /logs/%Y/%m/%d/%H/%M-%S-$UUID, который создает структуру директорий по дате и времени:
logs/2025/01/15/14-30-00-a1b2c3d4-e5f6-7890-abcd-ef123456789014-35-00-b2c3d4e5-f6a7-8901-bcde-f12345678901
-
Запустите или перезапустите Fluent Bit:
sudo systemctl restart fluent-bit -
Убедитесь, что сервис запущен без ошибок:
sudo systemctl status fluent-bit -
Проверьте логи Fluent Bit на наличие ошибок:
journalctl -u fluent-bit -f --no-pager -
Добавьте тестовую запись в лог-файл:
echo '{"timestamp":"2025-01-15T14:30:00.000","level":"info","message":"Test log entry"}' >> /var/log/app/application.log -
Дождитесь отправки лога в VK Object Storage. Время отправки зависит от параметров
Flush(по умолчанию 5 секунд) иupload_timeout(для примера — 10 минут). -
Проверьте, что объект появился в бакете:
aws s3 ls s3://fluent-bit-logs/logs/ --recursive --endpoint-url https://hb.ru-msk.vkcloud-storage.ru -
(Опционально) Скачайте объект и проверьте его содержимое:
aws s3 cp s3://fluent-bit-logs/logs/2025/01/15/14/30-00-a1b2c3d4-e5f6-7890-abcd-ef1234567890 - --endpoint-url https://hb.ru-msk.vkcloud-storage.ru
Созданные ресурсы тарифицируются. Если они вам больше не нужны:
-
Удалите объекты (лог-файлы) из бакета
fluent-bit-logs. -
Удалите бакет
fluent-bit-logs. -
Остановите сервис Fluent Bit, если он больше не нужен:
sudo systemctl stop fluent-bitsudo systemctl disable fluent-bit -
Удалите файлы с учетными данными и буфером:
rm -f /etc/fluent-bit/s3-credentials.envrm -rf /var/log/flb-storage/