【问题标题】:log key is not parsed by fluent-bit (both Docker containerized)fluent-bit 不解析日志键(都是 Docker 容器化的)
【发布时间】:2020-03-23 21:20:45
【问题描述】:

我的正则表达式解析器似乎不起作用。 我猜这与来自 Docker 的日志有关,并且没有被转义。 但即使我先包含 Docker 解析器,我也无法让它工作。

我已经用rubular检查过了:https://rubular.com/r/l6LayuI7MQWIUL

fluent-bit.conf

[SERVICE]
    Flush        5
    Daemon       Off
    Log_Level    debug
    Parsers_File parsers.conf

[INPUT]
    Name         forward
    Listen       0.0.0.0
    Port         24224

[FILTER]
    Name         grep
    Match        *
    Regex        log ^.*{.*}$

[FILTER]
    Name         parser
    Match        *
    Key_Name     log
    Parser       springboot

[OUTPUT]
    Name stdout
    Match *

parsers.conf

[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

强劲输出

[0] docker-container: [1584997354.000000000, {"log"=>"2020-03-23 21:02:34.077 TRACE 1 --- [nio-8080-exec-1] org.zalando.logbook.Logbook              : {...}", "container_id"=>"5a1251dcf9de3f0e2b8b7b0bce1d35d9c9285726b477606b6448c7ce9e818511", "container_name"=>"/xxxx", "source"=>"stdout"}]

谢谢

【问题讨论】:

    标签: fluentd fluent-bit


    【解决方案1】:
    • 确保您使用的是最新版本的 Fluent Bit (v1.3.11)
    • 不再需要从您的 parrs.conf 中删除 Decode_Field_As 条目。

    【讨论】:

    • 我已从 1.3 更新到 1.3.11,并删除了我在原始帖子中编辑的 Decode_Field_As。没有改变。还有其他建议吗?
    • @QuintenScheppermans 你设法让它工作了吗?
    • @TatendaZifudzi,不怕。在这完成之前,我去了另一家公司。对不起!
    【解决方案2】:

    就我而言,我使用的是最新版本的aws-for-fluent-bit V2.15.0,因为我想将应用程序日志保存在 cloudwatch 中,而这张图片已经准备好处理这个问题。

    我没有使用 Kubernetes 过滤器,因为它添加了很多我可以直接在集群中看到的东西,我只需要 cloudwatch 中的应用程序日志供开发人员使用。所以我使用这个amazon provide yaml 作为基础,只使用容器日志的 INPUT 尾部和 container_firstline 解析器。

    如您所见,我创建了自己的过滤器,称为“解析器”,它获取日志并执行正则表达式。我的日志很特别,因为我们在某些情况下使用嵌入 JSON,所以最后,我有 2 种类型的日志,一种只有文本,另一种带有 JSON,如下所示 2:

    2021-06-09 15:01:26: a5c35b84: block-bridge-5cdc7bc966-cq44r: clients::63 INFO: Message received from topic block.customer.get.info
    
    2021-06-09 15:01:28: a5c35b84: block-bridge-5cdc7bc966-cq44r: block_client::455 INFO: Filters that will be applied (parsed to PascalCase): {"ClientId": 88888, "ServiceNumber": "BBBBBBFA5527", "Status": "AC"}
    

    这 2 种类型的日志,让我创建了 2 个 PARSER 类型的正则表达式和 1 个称为解析器的自定义 FILTER。过滤器使用解析器(parser_logs 和 parser_json)匹配这两种类型的日志。

    主要问题是 JSON 部分未正确解析,始终使用反斜杠 (\) 获取 JSON 部分以转义双引号 ("),如下所示:

    2021-06-09 15:01:28: a5c35b84: block-bridge-5cdc7bc966-cq44r: block_client::455 INFO: Filters that will be applied (parsed to PascalCase): {\"ClientId\": 88888, \"ServiceNumber\": \"BBBBBBFA5527\", \"Status\": "AC"}
    

    解决方案是添加许多人认为不需要的 Decode_Field_As。就我而言,我需要它来删除那些反斜杠()。您会看到,我仅将字段“additional_message”用于与 JSON 完全匹配的字段。

    最后,这是我的配置:

    .
    .
        [INPUT]
            Name                tail
            Tag                 kube.*
            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_kube.db
            Mem_Buf_Limit       10MB
            Skip_Long_Lines     Off
            Refresh_Interval    10
        [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
    

    要记住的一点是,Decode_Field_As 需要将要解码的字段必须完全是 JSON(以“{”开头并以“}”结尾)。如果它有文本,然后是 JSON,则解码将失败。这就是为什么我必须创建 2 个 PARSER 正则表达式 .. 以完全匹配一个名为“message_additional”的唯一字段内的某些日志中的 JSON。

    这是我在 cloudwatch 中解析的新日志:

    {
        "environment": "a5c35b84",
        "hostname": "block-bridge-5cdc7bc966-qfptx",
        "line": "753",
        "log_level": "INFO",
        "message": "Message received from topic block.customer.get.info",
        "module": "block_client",
        "time_stamp": "2021-06-15 10:24:38"
    }
    
    {
        "environment": "a5c35b84",
        "hostname": "block-bridge-5cdc7bc966-m5sln",
        "line": "64",
        "log_level": "INFO",
        "message": "Getting ticket(s) using params ",
        "message_additional": {
            "ClientId": 88888,
            "ServiceNumber": "BBBBBBFA5527",
            "Status": "AC"
        },
        "module": "block_client",
        "time_stamp": "2021-06-15 10:26:04"
    }
    
    

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 1970-01-01
      • 2021-01-27
      • 2022-07-16
      • 1970-01-01
      • 2022-08-19
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多