logo
发布于

使用EFK收集集群日志,支持多行日志合并

3772-–
作者
  • avatar
    姓名
    zhli

2023-09-20-06-36-50-20230920063649

  1. Elasticsearch
    • 一个开源分布式搜索和数据分析引擎,底层是Apache Lucene
    • 一个分布式的实时文档存储,每个字段都可以被索引和搜索
    • 支持PB级别的结构化或非结构化数据
  2. Fluent-bit
    • 一个针对日志的收集、处理、转发系统
    • 通过丰富的插件,可以收集处理来自于各种系统的日志
    • 相比Fluentd,资源占用小了很多
  3. Kibana
    • 分析、可视化平台,用于和Elasticsearch一起工作

这里重点介绍下Fluent-bit的多行合并配置:

  1. 首先增加一个Filter,用于处理多行日志
[FILTER]
        name                  multiline
        match                 *
        multiline.key_content log
        multiline.parser      go, multiline-regex-test
  1. parsers.conf增加一个PARSER节点
[MULTILINE_PARSER]
        name          multiline-regex-test
        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{2}:\d{2}:\d{2} ERR\](.*)/"  "cont"
        rule      "cont"          "/^\s+at.*/"                       "cont"
        rule      "cont"          "^\s*$"                            "cont"
        rule      "cont"          "/exception/i"                     "cont"

rule用于匹配多行文本,需要根据实际日志格式做调整。

ps:如果用的ES8以上,需要注意将Suppress_Type_Name设置为On,(https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch)

output-elasticsearch.conf: |
    [OUTPUT]
        Name            es
        Match           *
        Host            ${FLUENT_ELASTICSEARCH_HOST}
        Port            ${FLUENT_ELASTICSEARCH_PORT}
        HTTP_User       ${FLUENT_ELASTICSEARCH_USER}
        HTTP_Passwd     ${FLUENT_ELASTICSEARCH_PASSWORD}
        Logstash_Format On
        Replace_Dots    On
        Retry_Limit     False
        Suppress_Type_Name  On