Фильтр Fluent-bit, похоже, работает только при совпадении *

#docker #parsing #match #fluent-bit

#docker #синтаксический анализ #совпадение #fluent-bit

Вопрос:

Я использую docker-compose, который генерирует более 20 сервисов. Большинство из них похожи, но анализируют разные форматы даты и времени или значения, которые немного отличаются. Моя идея ведения журнала заключается в том, чтобы записывать все в systemd, а затем передавать его через fluent-bit.

большинство сервисов в docker-compose выглядят примерно так (начало тега получает разные имена в зависимости от синтаксического анализатора, который я захочу использовать позже):

 A-service:
    image: A-service
    restart: always
    network_mode: host
    depends_on:
      - kafka
      - schema-registry
    environment:
      - KAFKA_BROKERS=127.0.0.1:9092
      - SCHEMA_REGISTRY_URL=127.0.0.1:8081
    logging:
      driver: journald
      options: 
        tag: "dockerC/{{.ImageName}}/{{.Name}}/{{.ID}}"

B-service:
    image: B-service
    restart: always
    network_mode: host
    depends_on:
      - kafka
      - schema-registry
    environment:
      - KAFKA_BROKERS=127.0.0.1:9092
      - SCHEMA_REGISTRY_URL=127.0.0.1:8081
    logging:
      driver: journald
      options: 
        tag: "dockerJ/{{.ImageName}}/{{.Name}}/{{.ID}}"
  

fluent-bit.conf:

 [SERVICE]
    Flush        5
    Daemon       Off
    Log_Level    info
    parsers_file parsers.conf

[INPUT]
    Name            systemd
    Tag             *
    Path            /run/log/journal
    Systemd_Filter    _SYSTEMD_UNIT=docker.service
    Systemd_Filter    _SYSTEMD_UNIT=kubelet.service

[FILTER]
    Name         parser
    Parser       dockerJ
    Match        dockerJ*
    Key_Name     MESSAGE
    Reserve_Data On
    Preserve_Key On


[FILTER]
    Name         parser
    Parser       dockerC
    Match        dockerC*
    Key_Name     MESSAGE
    Reserve_Data On
    Preserve_Key On

[OUTPUT]
    Name            es
    Match           *
    Index           fluent_bit
    Type            json
    Retry_Limit     false
    Host            ${ELASTICSEARCH_HOST}
    Port            ${ELASTICSEARCH_PORT}
    HTTP_User       ${ELASTICSEARCH_USERNAME}
    HTTP_Passwd     ${ELASTICSEARCH_PASSWORD}
    tls             off
    tls.verify      Off
  

parsers.conf

 [PARSER]
    Name         dockerJ
    Format       json
    Time_Key     timeStamp
    Time_Format  %Y-%m-%dT%H:%M:%S.%L
    Time_Keep    On
    # Command      |  Decoder | Field | Optional Action
    # =============|==================|=================
    Decode_Field_As   escaped_utf8    MESSAGE    do_next
    Decode_Field   json       MESSAGE

[PARSER]
    Name         dockerC
    Format       json
    Time_Key     time
    Time_Format  %Y/%m/%d %H:%M:%S.%L
    Time_Keep    On
    # Command      |  Decoder | Field | Optional Action
    # =============|==================|=================
    Decode_Field_As   escaped_utf8    MESSAGE    do_next
    Decode_Field   json       MESSAGE
  

если я изменю соответствие фильтра:

Match dockerC* -> Match *
Match dockerJ* -> Match *

Он совпадает, и JSON анализируется без каких-либо проблем в es, но позже у меня возникают проблемы из-за разных форматов времени в моем эластичном поиске или ошибке fluent-bit invalid time format

Я мог бы отредактировать и создать примерно 8 разных полей [ВВОДА] с разными тегами, но для этого, похоже, просто недостаточно компьютерных ресурсов.

Итак, мой вопрос: как на самом деле использовать теги / фильтры и отправлять сообщения на основе Tags , которые установлены вне области видимости fluent-bit (как в данном случае — docker-compose.yml )?

Комментарии:

1. Попробуйте использовать stdout вывод и посмотрите реальные теги, которые видит fluent-bit. Тег — это первая часть строки, которую регистрирует fluent-bit .

2. [2] docker.service: [1603090688.558286000, {«ПРИОРИТЕТ»=> «6», «SYSLOG_IDENTIFIER»=>»kafka/confluentinc/cp-kafka:5.5.1/sentiveillance-server-unit_kafka_1/046e4274d9ba» , …. Это интересно. Я предполагаю, что [2] означает поток, а «docker.service:» — это тег, который устанавливается Systemd_Filter _SYSTEMD_UNIT=docker.service . Как я должен отличать один тег от другого на данный момент? Я попытался установить `Systemd_Filter dockerC *`, но, похоже, он по-прежнему соответствует Systemd_Filter _SYSTEMD_UNIT=docker.service документации и выполняет поиск — я не могу найти никакой хорошей документации по Systemd_Filter

Ответ №1:

Systemd_Filter _SYSTEMD_UNIT=docker.service устанавливает ТЕГ как "docker.service" , а не поле тега, которое я ожидал. Чтобы использовать нужный мне ТЕГ, мне нужно вручную изменить каждый ТЕГ. Что достижимо при добавлении моего rewrite_tag фильтра:

 [FILTER]
    Name          rewrite_tag
    Match         docker.service*
    Rule          $NAME_OF_THE_TAG_KEY .*  $NAME_OF_THE_TAG_KEY false
    Emitter_Name  re_emitted
  

поскольку я хочу изменить каждое поле, я просто добавил .* регулярное выражение, которое соответствует чему угодно