Logstash将非结构化日志行合并到一个事件

时间:2020-05-08 11:45:36

标签: logstash filebeat

我的日志格式如下

[23:59:43] TYPE[student03]
[23:59:43] Write Ack!
[23:59:43] <application><status>Active</status></application>
[23:59:43] --------PushToFile Start--------
[23:59:43] --------PushToFile Name --------
[23:59:43] --------PushToFile End--------
[23:59:47] --------on parser--------
[23:59:47] ClientIPAddress > 123.12.123.2
[23:59:43] TYPE[student04]
[23:59:43] Write Ack!
[23:59:43] FGHSFHG3453D56HJ3456FJ372GJ1387FFKJH
[23:59:43] --------PushToFile Start--------
[23:59:43] --------PushToFile Name --------
[23:59:43] --------PushToFile End--------
[23:59:47] --------on parser--------
[23:59:47] ClientIPAddress > 123.12.123.2
[23:59:43] TYPE[student03]
[23:59:43] Write Ack!
[23:59:43] FGHSFHG3453D56HJ3456FJ372GJ1387FFKJH
[23:59:43] --------PushToFile Start--------
[23:59:43] --------PushToFile Name --------
[23:59:43] --------PushToFile End--------
[23:59:47] --------on parser--------
[23:59:47] ClientIPAddress > 123.12.123.2

我想解析这些日志,以仅获取TYPE [student03]和学生身份。我将使用lostash过滤器删除其余的行。现在,我需要将TYPE和status作为单个事件,以便可以将其作为单个消息发送给Rabbitmq,例如

[23:59:43]-student03-<application><status>Active</status></application>

如何使用聚合过滤器实现这一目标?我尝试了聚合过滤器。但是,我认为我们需要在两个日志行中使用相同的模式来合并聚合。或任何其他替代方法

请帮助!

我的logstash配置文件

    beats {
     port => 5044
   }
}
filter {

  if ([message] =~ "Write Ack!"){
   drop{}
  }
  else if ([message] =~ "PushToFile Start"){
    drop{}
  }
  else if ([message] =~ "PushToFile Name"){
    drop{}
  }
  else if ([message] =~ "PushToFile End"){
    drop{}
  }
  else if ([message] =~ "on parser"){
     drop{}
  }  
  else if ([message] =~ "ClientIPAddress") {
    drop { }
  }                     
}
output {
 stdout { codec => rubydebug }
}

1 个答案:

答案 0 :(得分:0)

您可以使用 Grok过滤器(如下所示)仅解析所需的两行,然后使用下面的 Ruby过滤器进行必要的字符串操作并保存字段中的最后一条消息并使用它。

格罗克过滤器

grok{
    match => {"message" => "%{TIME}] TYPE.%{GREEDYDATA:STATUS}."}
    match => {"message" => "%{TIME}] <application><status>Active</status></application>"}
    }
if "_grokparsefailure" in [tags]{drop{}}

Ruby过滤器

ruby{
    code => "
        if event.get('STATUS')
            @save_status = event.get('STATUS')
            event.cancel()
        else
            event.set('final_message', event.get('message').sub(' ', '-'+@save_status+'-'))
        end
    "
}

请注意,仅当您的日志按顺序排列时,此方法才有效。