【问题标题】:Fluent-bit Filter seems to only work when Match is *Fluent-bit Filter 似乎仅在 Match 为 * 时才有效
【发布时间】:2020-10-16 12:37:44
【问题描述】:

我正在使用 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 *

它匹配并且在es中解析JSON没有任何问题,但是由于稍后在我的弹性搜索或流利位invalid time format错误中的不同时间格式而出现问题

我可以用不同的标签编辑和制作 8 个不同的 [INPUT] 字段,但这样做似乎只是计算机资源的腰部。

所以我的问题是:如何实际使用标签/过滤器并根据设置在fluent-bit 范围之外的Tags 发送消息(如本例中的docker-compose.yml)?

【问题讨论】:

  • 尝试使用stdout 输出并查看fluent-bit 看到的真实标签。标记是 fluent-bit 记录的行的第一部分。
  • [2] docker.service: [1603090688.558286000, {"PRIORITY"=>"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 的任何好的文档

标签: docker parsing match fluent-bit


【解决方案1】:

Systemd_Filter _SYSTEMD_UNIT=docker.service 将 TAG 设置为 "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

因为我想更改每个字段,所以我刚刚添加了与任何内容匹配的 .* 正则表达式

【讨论】:

    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2011-12-21
    相关资源
    最近更新 更多