fluentd - Fluent Bit 1.8+ 和 MULTILINE_PARSER

标签 fluentd fluent-bit efk

我的目标是从运行在 Bare Kubernetes 上的 Java (Spring Boot) 应用程序收集日志。 然后将这些日志翻译成 ES 并在 Kibana 中可视化。

出于这些目的,我通过 Kubernetes 1.22 部署了 Fleunt Bit 1.8.9。由于我使用 Containerd 而不是 Docker,因此我的 Fluent Bit 配置如下(请注意我只指定了一个日志文件):

  fluent-bit.conf: |
    [SERVICE]
        Flush         1
        Log_Level     info
        Daemon        off
        Parsers_File  parsers.conf
        HTTP_Server   On
        HTTP_Listen   0.0.0.0
        HTTP_Port     2020

    @INCLUDE input-kubernetes.conf
    @INCLUDE filter-kubernetes.conf
    @INCLUDE output-elasticsearch.conf

  input-kubernetes.conf: |
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/*.log
        Read_from_head    true
        Parser            cri

  filter-kubernetes.conf: |
    [FILTER]
        Name                kubernetes
        Match               kube.*
        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     kube.var.log.containers.
        Merge_Log           On
        Merge_Log_Key       log_processed
        K8S-Logging.Parser  On
        K8S-Logging.Exclude Off

  output-elasticsearch.conf: |
    [OUTPUT]
        Name     es
        Match    kube.*
        Host     ${FLUENT_ELASTICSEARCH_HOST}
        Port     ${FLUENT_ELASTICSEARCH_PORT}
        Index    kube-code_index
        Type     kube-code_type

  parsers.conf: |
    [PARSER]
        Name cri
        Format regex
        Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L%z

在 Kibana 中使用此配置,Java 堆栈跟踪消息将以非结构化方式显示: enter image description here

但我需要 Java 堆栈跟踪的结构如下面的屏幕截图所示: enter image description here

我试过这样的配置:

  input-kubernetes.conf: |
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/*.log
        Read_from_head    true
        Multiline.parser  cri, multiline-regex-cri

和:

parsers.conf: |
    [PARSER]
        # http://rubular.com/r/tjUt3Awgg4
        Name cri
        Format regex
        Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L%z

    [MULTILINE_PARSER]
        name          multiline-regex-cri
        type          regex
        flush_timeout 1000
        #
        # Regex rules for multiline parsing
        # ---------------------------------
        #
        # configuration hints:
        #
        #  - first state always has the name: start_state
        #  - every field in the rule must be inside double quotes
        #
        # rules |   state name  | regex pattern                  | next state
        # ------|---------------|--------------------------------------------
        rule      "start_state"   "/(\D+ \d+ \d+\:\d+\:\d+)(.*)/"  "cont"
        rule      "cont"          "/^\s+at.*/"                     "cont"

但同样,日志不是结构化的: enter image description here

请帮我构建日志。

最佳答案

我也遇到过这个问题。如果您在输入上使用多个解析器,fluentbit 会尝试将它们中的每一个应用于相同的原始输入,而不是一个接一个地应用它们。

当你有多个多行解析器,并希望一个接一个地应用它们时,你应该使用过滤器,在你的情况下它会是这样的:

[INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/*.log
        Read_from_head    true
        Multiline.parser  cri

[FILTER]
        Name                  multiline
        Match                 kube.*
        multiline.key_content log
        multiline.parser      java

我可以在你的屏幕截图中看到,你正在尝试解析 java stacttrace,为此你可以使用内置的 java 解析器,所以你不需要 multiline-regex-cri

关于fluentd - Fluent Bit 1.8+ 和 MULTILINE_PARSER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69878876/

相关文章:

fluentd - fluent-bit 可以解析一个文件中的多种类型的日志行吗?

elasticsearch - 流利的配置来解析auth.log

elasticsearch - 无法使用 metricbeat 获取 kubernetes 资源 "events",出现错误 "Failure 403 events is forbidden:"

linux - 如何将部分时间戳添加到 Fluentd 输出文件格式

centos - fluentbit 写入/var/log/messages

elasticsearch - Fluentd-无法与Elasticsearch通信,无法重置连接并重试。 getaddrinfo:名称或服务未知(SocketError)

environment-variables - 您可以在 fluentd 的配置文件中使用环境变量吗

google-cloud-platform - 向 google-fluidd 添加自定义插件

elasticsearch - 如何在Fluent Bit中处理间歇性断开连接并通过HTTP发送正确的时间戳?