Fluent-bit.

Fluent Bit собирает, парсит и фильтрует сообщения из контейнеров и сохраняет их в хранилище Loki. Конфигурационные файлы fluent-bit.conf и parsers.conf расположены в папке /opt/dppm/planr/logging/fluent-bit

[SERVICE]
    Flush        5
    Daemon       Off
    Parsers_File parsers.conf

[INPUT]
    Name        forward
    Listen      0.0.0.0
    Port        24224


[FILTER]
    Name         parser
    Parser       docker
    Match        *
    Key_Name     log
    Reserve_Data true
    Preserve_Key false

[Output]
    Name grafana-loki
    Match planr
    Url ${LOKI_URL}
    RemoveKeys container_id,log
    Labels {service_name="planr"}
    LabelKeys level,source
    BatchWait 1s
    BatchSize 1001024
    LineFormat json

Блок SERVICE задает общие параметры работы Fluent Bit:

  • Flush 5 — интервал (в секундах), через который Fluent Bit будет отправлять собранные данные (логи) в Loki.
  • Daemon Off — указывает, что Fluent Bit не будет работать в фоновом режиме (демоне).
  • Parsers_File parsers.conf — задает файл, в котором находятся определения парсеров (форматов логов).

Блок INPUT описывает входные данные, то есть откуда Fluent Bit будет получать логи.

  • Name forward — тип входного плагина, используемого Fluent Bit для приема данных. В данном случае используется плагин forward, который позволяет принимать данные через сеть (протокол Fluentd Forward).
  • Listen 0.0.0.0 — указывает на то, что Fluent Bit будет слушать на всех доступных сетевых интерфейсах.
  • Port 24224 — порт, на котором Fluent Bit принимает входящие данные.

FILTER позволяет обрабатывать и изменять входящие данные перед их отправкой на выходы. Здесь используется парсер для обработки данных, поступающих от Docker-контейнеров.

  • Name parser — тип фильтра. Фильтр parser, который применяет парсеры для обработки данных.
  • Parser docker — задает парсер для Docker-логов.
  • Match * — задает шаблон для сопоставления входящих данных с фильтром. Символ * означает, что фильтр применяется ко всем входным данным.
  • Key_Name log — указывает, какое поле данных необходимо парсить. В данном случае поле с именем log.
  • Reserve_Data true — сохранение оригинальных данных после их обработки фильтром.
  • Preserve_Key false — после парсинга исходное поле (в данном случае log) будет удалено.

OUTPUT — отправка данных в Grafana Loki.

  • Name grafana-loki — плагин для отправки данных в систему Grafana Loki, которая занимается сбором и хранением логов.
  • Match * — отправляет все данные (все потоки логов).
  • Url ${LOKI_URL} — URL, куда отправляются данные, задан в файле docker-compose.yml. LOKI_URL=http://loki:3100/loki/api/v1/push
  • RemoveKeys container_id — удаляет ключи container_id из отправляемых данных, чтобы не отправлять ненужные поля в Loki.
  • Labels {service_name="planr"} — добавляет статическую метку (label) service_name="planr" к каждому потоку логов. Эти метки используются в Loki для облегчения поиска и фильтрации логов.
  • LabelKeys level,source — указывает, какие ключи из логов использовать для динамических меток. В данном случае метки будут добавляться на основе полей level (уровень логов) и source (источник данных).
  • BatchWait 1s — Fluent Bit ждет 1 секунду перед отправкой данных в батче.
  • BatchSize 1001024 — максимальный размер батча для отправки данных — 1 МБ (1001024 байта).
  • LineFormat json — отправляет данные в формате JSON.

Если, необходимо что бы логи сохранялись в файл, нужно отредактировать файл конфигурации fluent-bit.conf и добавить ещё один раздел Output, в котором:

[Output]
    Name file
    Match *
    Path /fluent-bit/log/output_test
  • Name file - Плагин вывода file позволяет записывать данные, полученные через плагин ввода , в файл.
  • Match * — отправляет все данные (все потоки логов).
  • Path - путь к каталогу для хранения файлов.

Далее, нужно внести изменения в файл docker-compose.yml. Для того, что бы примонтировать локальную папку к файловой системе контейнера, необходимо в файле /opt/dppm/planr/docker-compose.yml в описании профиля fluent-bit в секции volumes сопоставить локальную папку на хосте с папкой в контейнере,например:

fluent-bit:
    image: grafana/fluent-bit-plugin-loki:3.1.0
    container_name: fluent-bit
    restart: *default-restart-policy
    environment:
      - LOKI_URL=http://loki:3100/loki/api/v1/push
    volumes:
    # При использовании portainer указать абсолютный путь до файлов конфигурации.
    # Например:
      # - /opt/dppm/planr/logging/fluent-bit:/fluent-bit/etc/
      # - ./logging/fluent-bit:/fluent-bit/etc/
      - ./logging/output_test:/fluent-bit/log/output_test
    networks:
      planr:
        ipv4_address: ${DOCKER_NETWORK_PREFIX:-172.41.0}.254
    profiles : ['logging', 'all']

Где, ./logging/output_test это локальная папка, а /fluent-bit/log/output_test папка для хранения логов в контейнере. Что бы, изменения вступили в силу, нужно выполнить ./start.sh.

Если, используетcя служба логирования rsyslog(или syslog-ng), то необходимо добавить в конфигурацию fluent-bit следующие разделы:

[FILTER]
    Name   rewrite_tag
    Match  planr
    Rule   $log.command_name (auth.(local|kerberos|openid|saml|validateApiKey|logout))|(user.(setState|setPassword|create|register|disconnect|delete|import|changeForgottenPassword))|(admin.(create|delete|setState|setPassword))|(role.(create|update|delete)) InfoSec true

Фильтр rewrite_tag:

  • Name rewrite_tag — указывает тип фильтра для изменения тега.
  • Match planr — этот фильтр применяется к логам с тегом planr.
  • Rule — определяет правило и проверяет, содержит ли поле log.command_name указанные значения.
[FILTER]
    Name modify
    Match InfoSec
    Add hostname localhost
    Add appname Plan-R
    # Add vendor Digital_Practices
    # Add product Plan-R

Фильтр modify. Этот фильтр модифицирует логи, тег которых равен InfoSec:

  • Name modify — указывает тип фильтра для изменения полей в логах.
  • Match InfoSec — фильтр применяется к логам с тегом InfoSec.
  • Add hostname localhost — добавляет новое поле hostname со значением localhost.
  • Add appname Plan-R — добавляет новое поле appname со значением Plan-R.
  • строки vendor и product неактивны, но их можно раскомментировать для добавления этих полей в логи.
[OUTPUT]
    name                 syslog
    match                InfoSec
    host                 your_host
    port                 514
    mode                 tcp
    syslog_format        rfc5424
    syslog_maxsize       2048
    syslog_hostname_key  hostname
    syslog_appname_key   appname
    syslog_message_key   log

Выходной плагин syslog:

  • name syslog — определяет тип вывода — Syslog.
  • match InfoSec — на выход направляются только логи с тегом InfoSec.
  • host - сервер для отправки логов.
  • port 514 — стандартный порт Syslog для отправки сообщений.
  • mode tcp — используется протокол TCP для передачи данных.
  • syslog_format rfc5424 — формат сообщений Syslog по стандарту RFC5424.
  • syslog_maxsize 2048 — максимальный размер лога — 2048 байт.
  • syslog_hostname_key hostname — ключ для поля hostname, который будет использоваться в Syslog логах.
  • syslog_appname_key appname — ключ для поля appname, который будет использоваться в логах(в данном случае это Plan-R).
  • syslog_message_key log — ключ для основного сообщения лога.

Так же, в файле конфигурации rsyslog /etc/rsyslog.conf, нужно раскомментировать, следующие разделы, которые отвечают за открытие портов 514 UDP/TCP на которых работает служба rsyslog(syslog-ng). register image

После, внесения изменений, необходимо перезапустить службу rsyslog, командой:

sudo systemctl restart rsyslog

Более подробную информацию о настройке конфигурационного файла fluent bit, можно получить на сайте https://docs.fluentbit.io/manual/concepts/data-pipeline