elasticsearch 分析多行日志时出现logstash配置问题,elasticsearch,logstash,logstash-configuration,filebeat,elasticsearch,Logstash,Logstash Configuration,Filebeat" /> elasticsearch 分析多行日志时出现logstash配置问题,elasticsearch,logstash,logstash-configuration,filebeat,elasticsearch,Logstash,Logstash Configuration,Filebeat" />

elasticsearch 分析多行日志时出现logstash配置问题

elasticsearch 分析多行日志时出现logstash配置问题,elasticsearch,logstash,logstash-configuration,filebeat,elasticsearch,Logstash,Logstash Configuration,Filebeat,我有下面的多行日志,我正试图用我的logstash配置解析它 2020-05-27 11:59:17 ---------------------------------------------------------------------- 2020-05-27 11:59:17 Got context 2020-05-27 11:59:17 Raw context: EMAIL=abc.def@example.com

我有下面的多行日志,我正试图用我的logstash配置解析它

2020-05-27 11:59:17 ----------------------------------------------------------------------
2020-05-27 11:59:17 Got context
2020-05-27 11:59:17 Raw context:
                    EMAIL=abc.def@example.com
                    NAME=abc.def
                    PAGER=+11111111111111
                    DATE=2020-05-27
                    AUTHOR=
                    COMMENT=
                    ADDRESS=1.1.1.1
                    ALIAS=abc.example.com
                    ATTEMPT=1
2020-05-27 11:59:17 Previous service hard state not known. Allowing all states.
2020-05-27 11:59:17 Computed variables:
                    URL=abc.example.com
                    STATE=UP                
2020-05-27 11:59:17 Preparing flexible notifications for abc.def
2020-05-27 11:59:17  channel with plugin sms
2020-05-27 11:59:17  - Skipping: set
2020-05-27 11:59:17  channel with plugin plain email        
2020-05-27 11:59:20 --------------------------------------------------------------------
这是我的日志存储配置:

    input {
      stdin { }
    }

    filter {

            grok {
                match => { "message" => "(?m)%{GREEDYDATA:data}"}
            }
            if [data] {
                  mutate {
                     gsub => [
                         "data", "^\s*", ""
                     ]
                  }
                  mutate {
                      gsub => ['data', "\n", " "]
                  }
             }
}

    output {
      stdout { codec => rubydebug }
    }
文件节拍配置:

  multiline.pattern: '^[[:space:]][A-Za-z]* (?m)'
  multiline.negate: false
  multiline.match: after
我想要达到的目标: 多行日志将首先与多行模式匹配,并将拆分为多行,如

  Message1:  2020-05-27 11:59:17 ----------------------------------------------------------------------

  Message2: 2020-05-27 11:59:17 Got context

  Message3:  2020-05-27 11:59:17 Raw notification context:
                        EMAIL=abc.def@example.com
                        NAME=abc.def
                        PAGER=+11111111111111
                        DATE=2020-05-27
                        AUTHOR=
                        COMMENT=
                        ADDRESS=1.1.1.1
                        ALIAS=abc.example.com
                        ATTEMPT=1
在此之后,当解析这些日志行时,将再次使用分隔符对其进行拆分,然后我可以使用kv filter读取单个消息编号3中的每个键值对,如ALIAS=abc.example.com


您能建议如何实现这一点吗?

我建议您使用多行编解码器读取文件(如果您使用的是stdin,您也可以在filter部分定义它),同时为每一新行提供带有时间戳前缀的模式

然后,在grok筛选器中,使用以下命令拆分字段和值:

input {
    file {
        path => "C:/work/elastic/logstash-6.5.0/config/test.txt"
        start_position => "beginning"
        codec => multiline {
            pattern => "^%{TIMESTAMP_ISO8601}"
            negate => true
            what => "previous"
        }
    }
}
filter {
    kv {
        field_split => "\r\n"
        value_split => "="
        source => "message"
    }
}

output {
    elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "test"
    }
}
Kibana中的结果应如下所示:

input {
    file {
        path => "C:/work/elastic/logstash-6.5.0/config/test.txt"
        start_position => "beginning"
        codec => multiline {
            pattern => "^%{TIMESTAMP_ISO8601}"
            negate => true
            what => "previous"
        }
    }
}
filter {
    kv {
        field_split => "\r\n"
        value_split => "="
        source => "message"
    }
}

output {
    elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "test"
    }
}

这是:

编辑:在您声明的注释中,您未能看到包含空格的完整值。我已使用您提供的新状态重新测试了我的解决方案,它运行良好:


非常感谢您的回复。不幸的是,我们公司的麋鹿管理员建议在filbeat配置中进行多行解析。由于我是麋鹿新手,我不知道推荐的方法是什么。我尝试了你的模式,它给了我想要的结果。在日志行中,如果key
STATE=wan abc站点:def蛋糕代理jlp bl3 Missisipi代数开发应用程序abc1 nano/nano/ack/divgen/Missisipi/bots/linux/\n
但我在Kibana中得到的只是STATE=wan。如何获得键值中的所有间隔值?嘿@marco。我刚刚尝试了
STATE=wan abc站点:def蛋糕代理jlp bl3 Missisipi代数开发应用abc1 nano/nano/ack/divgen/Missisipi/bots/linux/\n
,我可以看到Kibana中的所有值,我编辑了我的答案,将其包括在内。我没有更改配置中的任何内容以支持此功能。请根据我的回答检查您的配置。关于filebeat,它的目的是作为一个轻量级代理来移动日志,以便在日志存储中进行进一步的解析和逻辑。在filebeat中使用逻辑是一种不好的做法,随着复杂性的增加,这种做法会变得越来越难维护。@marco,我看到您评论中的最后一个字符是
\n
,如果您使用的是windows断线器,则应该是
\r\n
仅在linux上
\n
请相应地编辑
字段\u split
配置。@marco,如果你觉得有帮助,请接受我的回答。非常感谢。