VK Cloud logo

Репликация логов в объектное хранилище с помощью 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

Подготовительные шаги

  1. Создайте аккаунт для сервиса VK Object Storage, если это еще не сделано:

    1. Перейдите в личный кабинет VK Cloud.

    2. Выберите проект.

    3. Перейдите в раздел Object StorageАккаунты.

    4. Нажмите кнопку Добавить аккаунт или Добавить.

    5. Задайте имя аккаунта.

    6. Нажмите кнопку Создать.

    7. В открывшемся окне скопируйте и сохраните идентификатор ключа доступа (Access Key ID) и секретный ключ (Secret Key).

  2. Создайте бакет VK Object Storage с именем fluent-bit-logs.

  3. Убедитесь, что AWS CLI установлен и настроен для работы с созданным аккаунтом VK Object Storage. Это потребуется для проверки отправленных логов.

  4. Установите Fluent Bit на машину, с которой будут собираться логи. Инструкции по установке доступны в официальной документации Fluent Bit.

1. Настройте безопасное хранение учетных данных

Для доступа к VK Object Storage агент Fluent Bit использует идентификатор ключа доступа и секретный ключ. Не указывайте учетные данные в конфигурационном файле напрямую — используйте переменные окружения.

  1. Создайте файл с переменными окружения, например /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 секретный ключ.
  2. Ограничьте доступ к файлу с учетными данными:

    chmod 600 /etc/fluent-bit/s3-credentials.env
  3. Настройте загрузку переменных окружения перед запуском Fluent Bit. Если Fluent Bit запускается через плагин systemd, добавьте в юнит-файл:

    [Service]EnvironmentFile=/etc/fluent-bit/s3-credentials.env

2. Настройте конфигурацию Fluent Bit

Конфигурация Fluent Bit состоит из трех основных секций: Input (источник логов), Filter (обработка) и Output (отправка в VK Object Storage).

  1. Создайте или отредактируйте файл /etc/fluent-bit/fluent-bit.conf:

    [SERVICE]    Flush         5    Log_Level     info    storage.path  /var/log/flb-storage/    Parsers_File  /etc/fluent-bit/parsers.conf[INPUT]    Name              tail    Path              /var/log/app/application.log    Tag               app.logs    Refresh_Interval  5    Mem_Buf_Limit     50MB    Skip_Long_Lines   On[FILTER]    Name parser    Match app.logs    Key_Name log    Parser app_log_parser    Preserve_Key true    Reserve_Data true[OUTPUT]    Name            s3    Match           app.logs    region          ru-msk    bucket          fluent-bit-logs    endpoint_url    https://hb.ru-msk.vkcloud-storage.ru    access_key      ${S3_ACCESS_KEY_ID}    secret_key      ${S3_SECRET_ACCESS_KEY}    use_put_object  On    s3_key_format   /logs/%Y/%m/%d/%H/%M-%S-$UUID    total_file_size 50M    upload_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 — формат имени файла (ключа объекта) в бакете.

  2. Создайте файл парсера /etc/fluent-bit/parsers.conf:

    [PARSER]    Name        app_log_parser    Format      json    Time_Key    timestamp    Time_Format %Y-%m-%dT%H:%M:%S.%L

3. Настройте буферизацию для обработки потери сети

При потере сетевого соединения между Fluent Bit и VK Object Storage логи должны сохраняться в локальный буфер и отправляться после восстановления связи. Для этого используется файловая система в качестве хранилища буфера.

  1. Убедитесь, что в секции [SERVICE] указан путь к хранилищу буфера:

    [SERVICE]    storage.path  /var/log/flb-storage/
  2. Добавьте параметр storage.type в секции [INPUT]:

    [INPUT]    Name              tail    Path              /var/log/app/application.log    Tag               app.logs    Refresh_Interval  5    Mem_Buf_Limit     50MB    Skip_Long_Lines   On    storage.type      filesystem

    Здесь:

    • storage.type filesystem — включает запись буфера на диск при переполнении оперативной памяти.
    • Mem_Buf_Limit — задает лимит использования оперативной памяти; при превышении лимита данные записываются на диск.
  3. Добавьте параметры повторной отправки в секцию [OUTPUT]:

    [OUTPUT]    Name            s3    Match           app.logs    region          ru-msk    bucket          fluent-bit-logs    endpoint_url    https://hb.ru-msk.vkcloud-storage.ru    access_key      ${S3_ACCESS_KEY_ID}    secret_key      ${S3_SECRET_ACCESS_KEY}    use_put_object  On    s3_key_format   /logs/%Y/%m/%d/%H/%M-%S-$UUID    total_file_size 50M    upload_timeout  10m    Retry_Limit     5    storage.type    filesystem

    Здесь:

    • Retry_Limit — количество попыток повторной отправки при ошибке.
    • storage.type filesystem — использует файловую систему для буферизации данных выходного потока.
  4. Создайте директорию для буфера и задайте права:

    mkdir -p /var/log/flb-storage/chown fluent:fluent /var/log/flb-storage/

4. Настройте формат именования файлов

Формат именования файлов (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-ef1234567890        14-35-00-b2c3d4e5-f6a7-8901-bcde-f12345678901

5. Проверьте работоспособность

  1. Запустите или перезапустите Fluent Bit:

    sudo systemctl restart fluent-bit
  2. Убедитесь, что сервис запущен без ошибок:

    sudo systemctl status fluent-bit
  3. Проверьте логи Fluent Bit на наличие ошибок:

    journalctl -u fluent-bit -f --no-pager
  4. Добавьте тестовую запись в лог-файл:

    echo '{"timestamp":"2025-01-15T14:30:00.000","level":"info","message":"Test log entry"}' >> /var/log/app/application.log
  5. Дождитесь отправки лога в VK Object Storage. Время отправки зависит от параметров Flush (по умолчанию 5 секунд) и upload_timeout (для примера — 10 минут).

  6. Проверьте, что объект появился в бакете:

    aws s3 ls s3://fluent-bit-logs/logs/ --recursive --endpoint-url https://hb.ru-msk.vkcloud-storage.ru
  7. (Опционально) Скачайте объект и проверьте его содержимое:

    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

Удалите неиспользуемые ресурсы

Созданные ресурсы тарифицируются. Если они вам больше не нужны:

  1. Удалите объекты (лог-файлы) из бакета fluent-bit-logs.

  2. Удалите бакет fluent-bit-logs.

  3. Остановите сервис Fluent Bit, если он больше не нужен:

    sudo systemctl stop fluent-bitsudo systemctl disable fluent-bit
  4. Удалите файлы с учетными данными и буфером:

    rm -f /etc/fluent-bit/s3-credentials.envrm -rf /var/log/flb-storage/