Fluent-Bit

FluentBit собирает, парсит и фильтрует сообщения из контейнеров, сохраняя их в хранилище Loki. Конфигурационные файлы fluent-bit.conf и parsers.conf расположены в папке /var/log/flb-storage/.

  • docker — поддерживает объединение больших записей логов, разделённых движком контейнера Docker.
  • cri — обрабатывает запись лога, генерированную движком контейнера CRI-O, поддерживает объединение записей логов.
  • go — обрабатывает записи логов, генерируемые приложением на языке Go, и выполняет объединение, если обнаружены мультистроковые сообщения.
  • python — обрабатывает записи логов, генерируемые приложением на языке Python, и выполняет объединение, если обнаружены мультистроковые сообщения.
  • Flush 5 — интервал (в секундах), через который Fluent Bit будет отправлять собранные данные (логи) в Loki;
  • Daemon Off — указывает, что Fluent Bit не будет работать в фоновом режиме (демоне);
  • Parsers_File parsers.conf — задает файл, в котором находятся определения парсеров (форматов логов).
  • Name forward — тип входного плагина, используемого Fluent Bit для приема данных. В данном случае используется плагин forward, который позволяет принимать данные через сеть (протокол Fluentd Forward);
  • Listen 0.0.0.0 — указывает на то, что Fluent Bit будет слушать на всех доступных сетевых интерфейсах;
  • Port 24224 — порт, на котором Fluent Bit принимает входящие данные.
[INPUT]
    Name                tail
    Tag                 tenant.*
    Path                /var/log/containers/*_tenant2_webapp-*.log
    Docker_Mode         On
    Docker_Mode_Flush   5
    Docker_Mode_Parser  container_firstline
    Parser              docker
    DB                  /var/log/flb-storage/flb_container.db
    Mem_Buf_Limit       50MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    Rotate_Wait         30
    storage.type        filesystem
    Read_from_Head      ${READ_FROM_HEAD}
 
 [INPUT]
     Name               tail
     Tag                kube.*
     Path               /var/log/containers/*.log
     Parser             docker
     DB                 /var/log/flb_graylog.db
     DB.Sync            Normal
     Docker_Mode        On
     Buffer_Chunk_Size  512KB
     Buffer_Max_Size    5M
     Rotate_Wait        30
     Mem_Buf_Limit      30MB
     Skip_Long_Lines    On
     Refresh_Interval   10
 
[FILTER]
     Name kubernetes
     Match kube.*
     Merge_Log On
     Merge_Log_Key log
     Keep_Log Off
     K8S-Logging.Parser On
     K8S-Logging.Exclude Off
     Annotations Off
     Labels On
[INPUT[]
    Name              tail
    Tag               kube.*
    Path              /var/log/containers/*.log
    DB                /var/log/flb_kubernetes.db
    Parser            docker
    Docker_Mode       On
    Mem_Buf_Limit     64MB
    Skip_Long_Lines   On
    Refresh_Interval  10
 
[INPUT]
    Name                tail
    Tag                 application.*
    Exclude_Path        /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*, /var/log/containers/kube-proxy*
    Path                /var/log/containers/*.log
    Docker_Mode         On
    Docker_Mode_Flush   5
    Docker_Mode_Parser  container_firstline
    Parser              docker
    DB                  /var/fluent-bit/state/flb_container.db
    Mem_Buf_Limit       50MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    Rotate_Wait         30
    storage.type        filesystem
 
[INPUT]
    Name                tail
    Tag                 user-api.*
    Path                /var/log/containers/user-api*.log
    Docker_Mode         On
    Docker_Mode_Flush   5
    Docker_Mode_Parser  container_firstline_user
    Parser              docker
    DB                  /var/fluent-bit/state/flb_user_api.db
    Mem_Buf_Limit       50MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    Rotate_Wait         30
    storage.type        filesystem
    Read_from_Head      ${READ_FROM_HEAD}
 
[INPUT]
  Name                tail
  Tag                 application.*
  Exclude_Path        /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*, /var/log/containers/kube-proxy*
  Path                /var/log/containers/*.log
  Docker_Mode         On
  Docker_Mode_Flush   5
  Docker_Mode_Parser  container_firstline
  Parser              docker
  DB                  /var/fluent-bit/state/flb_container.db
  Mem_Buf_Limit       50MB
  Skip_Long_Lines     On
  Refresh_Interval    10
  Rotate_Wait         30
  Read_from_Head      Off
 
[INPUT]
  Name                tail
  Tag                 application.*
  Path                /var/log/containers/fluent-bit*
  Parser              docker
  DB                  /var/fluent-bit/state/flb_log.db
  Mem_Buf_Limit       5MB
  Skip_Long_Lines     On
  Refresh_Interval    10
  Read_from_Head      Off
 
[INPUT]
  Name                tail
  Tag                 application.*
  Path                /var/log/containers/cloudwatch-agent*
  Multiline.parser    docker,cri
  # Docker_Mode         On
  # Docker_Mode_Flush   5
  # Docker_Mode_Parser  cwagent_firstline
  #Parser              docker
  DB                  /var/fluent-bit/state/flb_cwagent.db
  rotate_wait         15
  Mem_Buf_Limit       5MB
  Skip_Long_Lines     On
  Refresh_Interval    10
  #Read_from_Head      true  
 
[INPUT]
    Name             tail
    Path             /var/log/containers/abc-*.log, /var/log/containers/def-*.log, /var/log/containers/ghi-*.log, /var/log/containers/jkl-*.log, /var/log/containers/mno-*.log
    Exclude_Path     /var/log/containers/aggregator-fluent-bit-*_logging_fluent-bit-*.log, /var/log/containers/aws-node*.log, /var/log/containers/collector-fluent-bit-*_logging_fluent-bit-*.log, /var/log/containers/kube-proxy*.log
    DB               /var/fluent-bit/state/flb_container.db
    multiline.parser docker, cri
    Tag              kube.*
    threaded         on
    Mem_Buf_Limit    32MB
    Skip_Long_Lines  On
    Skip_Empty_Lines On
    Refresh_Interval 10
    Rotate_Wait      30
 
    # Buffering & Storage (https://docs.fluentbit.io/manual/administration/buffering-and-storage#input-section-configuration)
    storage.type     filesystem
[INPUT]
    Name tail
    Path /var/log/containers/*.log
    Docker_Mode On
    Docker_Mode_Parser python-multiline
[INPUT]
    Name             tail
    Path             /var/log/containers/*.log
    Parser           docker
    Tag              kube.*
    Refresh_Interval 5
    Mem_Buf_Limit    5MB
    Skip_Long_Lines  On
    DB               /tail-db/tail-containers-state.db
    DB.Sync          Normal
    Ignore_Older 2d
    Multiline On
    Multiline_Flush 5
    Parser_Firstline first_line
  • Name parser — тип фильтра. Фильтр parser, который применяет парсеры для обработки данных;
  • Parser docker — задает парсер для Docker-логов;
  • Match _ — задает шаблон для сопоставления входящих данных с фильтром. Символ _ означает, что фильтр применяется ко всем входным данным;
  • Key_Name log — указывает, какое поле данных необходимо парсить. В данном случае поле с именем log;
  • Reserve_Data true — сохранение оригинальных данных после их обработки фильтром;
  • Preserve_Key false — после парсинга исходное поле (в данном случае log) будет удалено.
    [MULTILINE_PARSER]
        name          multiline-docker-python
        type            regex
        flush_timeout 3000
        # fluent-bit is not looking at the log field to run the regex below 
        key_content log
 
        # rules |   state name  | regex pattern                           | next state
        # ------|---------------|-------------------------------------------------------
        rule      "start_state"   "/(\d+-\d+-\d+ \d+:\d+:\d+,\d+):(.*)/"    "cont"
        rule      "cont"          "^((?!\d+-\d+-\d+ \d+:\d+:\d+,\d+).*)"    "cont"
[PARSER]
    Name python-multiline
    Format regex
    Regex /(?<time>\d+-\d+-\d+ \d+:\d+:\d+,\d+):(?<message>.*)/
    Time_Key  time
    Time_Format %F %H:%M:%S,%L
    Input:
[PARSER]
    Name        springboot
    Format      regex
    Regex       (?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}.\d{1,3}) (?<level>[^ ]*) (?<number>\d*) --- (?<thread>\[[^ ]*) (?<logger>[^ ]*) *: (?<message>[^ ].*)$
    Time_Key    time
    Time_Format %Y-%m-%d %H:%M:%S.%L
 
[PARSER]
    Name         docker
    Format       json
    Time_Key     time
    Time_Format  %Y-%m-%dT%H:%M:%S.%L
    Time_Keep    On
    # Command      |  Decoder | Field | Optional Action
    # =============|==================|=================
    Decode_Field_As   escaped    log
    [FILTER]
        Name                parser
        Match               kube.*
        Key_Name            log
        Parser              parser_json
        Parser              parser_logs
 
    [PARSER]
        Name   parser_logs
        Format regex
        Regex  ^(?<time_stamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}): (?<environment>.*?): (?<hostname>.*?): (?<module>.*?)::(?<line>\d+) (?<log_level>[A-Z]+): (?<message>[a-zA-Z0-9 _.,:()'"!¡]*)$
        Time_Key time
        Time_Format %d/%b/%Y:%H:%M:%S %z
    [PARSER]
        Name   parser_json
        Format regex
        Regex  ^(?<time_stamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}): (?<environment>.*?): (?<hostname>.*?): (?<module>.*?)::(?<line>\d+) (?<log_level>[A-Z]+): (?<message>[^{]*)(?<message_additional>{.*)$
        Time_Key time
        Time_Format %d/%b/%Y:%H:%M:%S %z
        Decode_Field_As   escaped_utf8       message_additional    do_next
        Decode_Field_As   escaped            message_additional    do_next
        Decode_Field_As   json               message_additional
    [PARSER]
        Name        container_firstline
        Format      regex
        Regex       (?<log>(?<="log":")\S(?!\.).*?)(?<!\\)".*(?<stream>(?<="stream":").*?)".*(?<time>\d{4}-\d{1,2}-\d{1,2}T\d{2}:\d{2}:\d{2}\.\w*).*(?=})
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%LZ
    [PARSER]
        Name        docker
        Format      json
        Time_Key    @timestamp
        Time_Format %Y-%m-%dT%H:%M:%S.%L
        Time_Keep   Off
[MULTILINE_PARSER]
    name          multiline-regex
    type          regex
    flush_timeout 1000
 
 
    # rules |   state name  | regex pattern                    | next state
    # ------|---------------|----------------------------------|-----------
    rule      "start_state"   "/(Dec \d+ \d+\:\d+\:\d+)(.*)/"    "cont"
    rule      "cont"          "/^\s+at.*/"                       "cont"
  • 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.
  • Name file - Плагин вывода file позволяет записывать данные, полученные через плагин ввода в файл;
  • Match * — отправляет все данные (все потоки логов);
  • Path - путь к каталогу для хранения файлов.
[SERVICE]
  Flush                     1
  Daemon                    Off
  Log_Level                 info
  Parsers_File              parsers.conf
  Parsers_File              custom_parsers.conf
  HTTP_Server               On
  HTTP_Listen               0.0.0.0
  HTTP_Port                 2020
 
[INPUT]
  Name                      tail
  Path                      /var/log/containers/*.log
  Parser                    docker
  Tag                       kube.*
  Mem_Buf_Limit             4MB
  Skip_Long_Lines           On
  Skip_Empty_Lines          On
 
[FILTER]
  Name                      kubernetes
  Match                     kube.*
  Merge_Log                 On
  Keep_Log                  On
  K8S-Logging.Parser        On
  K8S-Logging.Exclude       On
 
[OUTPUT]
  Name                      loki
  Match                     kube.*
  Host                      loki.logging.svc.cluster.local
  Port                      3100
  Labels                    job=fluent, namespace=$kubernetes['namespace_name'], pod=$kubernetes['pod_name'], container=$kubernetes['container_name']
  Auto_kubernetes_labels    off
  Line_format               json
[SERVICE]
    Flush         2
    Log_Level     info
    Daemon        Off
    Parsers_File  parsers.conf
    Parsers_File  custom_parsers.conf
    HTTP_Server   On
    HTTP_Listen   0.0.0.0
    HTTP_Port     2020
 
[INPUT]
    Name                tail
    Tag                 application.*
    Exclude_Path        /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*, /var/log/containers/kube-proxy*
    Path                /var/log/containers/*.log
    Docker_Mode         On
    Docker_Mode_Flush   5
    Docker_Mode_Parser  container_firstline
    Parser              docker
    DB                  /var/fluent-bit/state/flb_container.db
    Mem_Buf_Limit       50MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    Rotate_Wait         30
    Read_from_Head      Off
 
[INPUT]
    Name                tail
    Tag                 application.*
    Path                /var/log/containers/fluent-bit*
    Parser              docker
    DB                  /var/fluent-bit/state/flb_log.db
    Mem_Buf_Limit       5MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    Read_from_Head      Off
 
[INPUT]
    Name                tail
    Tag                 application.*
    Path                /var/log/containers/cloudwatch-agent*
    #Parser              multiline
    Docker_Mode         On
    Docker_Mode_Flush   5
    Docker_Mode_Parser  cwagent_firstline
    Parser              docker
    DB                  /var/fluent-bit/state/flb_cwagent.db
    rotate_wait         15
    Mem_Buf_Limit       5MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    #Read_from_Head      true   
 
[FILTER]
    Name                kubernetes
    Match               application.*
    Kube_URL            https://kubernetes.default.svc:443
    Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
    Kube_Tag_Prefix     application.var.log.containers.
    Merge_Log           On
    Merge_Log_Key       pod_name
    K8S-Logging.Parser  On
    K8S-Logging.Exclude Off
    Labels              Off
    Annotations         Off
 
[FILTER]
    Name                multiline
    Match               application.*
    multiline.key_content log
    multiline.parser      go, multiline-regex-test
 
[OUTPUT]
    Name                cloudwatch_logs
    Match               application.*
    region              ${REGION}
    log_group_name      /aws/containerinsights/${CLUSTER_NAME}/application
    log_stream_prefix   ${APP_POD_NAMESPACE}-
    auto_create_group   true
    extra_user_agent    container-insights
 
[INPUT]
    Name                systemd
    Tag                 dataplane.systemd.*
    Systemd_Filter      _SYSTEMD_UNIT=docker.service
    Systemd_Filter      _SYSTEMD_UNIT=kubelet.service
    DB                  /var/fluent-bit/state/systemd.db
    Path                /var/log/journal
    Read_From_Tail      Off
 
[INPUT]
    Name                tail
    Tag                 dataplane.tail.*
    Path                /var/log/containers/aws-node*, /var/log/containers/kube-proxy*
    Docker_Mode         On
    Docker_Mode_Flush   5
    Docker_Mode_Parser  container_firstline
    Parser              docker
    DB                  /var/fluent-bit/state/flb_dataplane_tail.db
    Mem_Buf_Limit       50MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    Rotate_Wait         30
    Read_from_Head      Off
 
[FILTER]
    Name                modify
    Match               dataplane.systemd.*
    Rename              _HOSTNAME                   hostname
    Rename              _SYSTEMD_UNIT               systemd_unit
    Rename              MESSAGE                     message
    Remove_regex        ^((?!hostname|systemd_unit|message).)*$
 
[FILTER]
    Name                aws
    Match               dataplane.*
    imds_version        v1
 
[OUTPUT]
    Name                cloudwatch_logs
    Match               dataplane.*
    region              ${REGION}
    log_group_name      /aws/containerinsights/${CLUSTER_NAME}/dataplane
    log_stream_prefix   ${APP_POD_NAMESPACE}-${APP_POD_NAME}-
    auto_create_group   true
    extra_user_agent    container-insights
 
[INPUT]
    Name                tail
    Tag                 host.dmesg
    Path                /var/log/dmesg
    Parser              syslog
    DB                  /var/fluent-bit/state/flb_dmesg.db
    Mem_Buf_Limit       5MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    Read_from_Head      Off
 
[INPUT]
    Name                tail
    Tag                 host.messages
    Path                /var/log/messages
    Parser              syslog
    DB                  /var/fluent-bit/state/flb_messages.db
    Mem_Buf_Limit       5MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    Read_from_Head      Off
 
[INPUT]
    Name                tail
    Tag                 host.secure
    Path                /var/log/secure
    Parser              syslog
    DB                  /var/fluent-bit/state/flb_secure.db
    Mem_Buf_Limit       5MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    Read_from_Head      Off
 
[FILTER]
    Name                aws
    Match               host.*
    imds_version        v1
 
[OUTPUT]
    Name                cloudwatch_logs
    Match               host.*
    region              ${REGION}
    log_group_name      /aws/containerinsights/${CLUSTER_NAME}/host
    log_stream_prefix   ${APP_NODE_NAME}.
    auto_create_group   true
    extra_user_agent    container-insights