首页 > 解决方案 > Fluent-bit Filter 似乎仅在 Match 为 * 时才有效

问题描述

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

流利的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

解析器配置文件

[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] 字段,但这样做似乎只是计算机资源的腰部。

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

标签: dockerparsingmatchfluent-bit

解决方案


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

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


推荐阅读