Xml Logstash-将多行消息拆分为头和尾

Xml Logstash-将多行消息拆分为头和尾,xml,logstash,multiline,grok,Xml,Logstash,Multiline,Grok,我试图解析一个日志文件,其中包含XML和其他任意输出。 在特定情况下,我想检查预订是否已成功发送给客户 [11-28-51.440000] Sending reservation to customer [11-28-51.492900] <?xml version="1.0" encoding="UTF-8"?><SendReservation><ReservationId>1289</ReservationId><Customer>

我试图解析一个日志文件,其中包含XML和其他任意输出。 在特定情况下,我想检查预订是否已成功发送给客户

[11-28-51.440000] Sending reservation to customer
[11-28-51.492900] <?xml version="1.0" encoding="UTF-8"?><SendReservation><ReservationId>1289</ReservationId><Customer>2892</Customer>...</SendReservation>
[11-28-51.493000] Status: Successfull
[11-28-52.261000] Something different
[11-28-51.520000] Sending reservation to customer
[11-28-54.548900] <?xml version="1.0" encoding="UTF-8"?><SendReservation><ReservationId>2732</ReservationId><Customer>7856</Customer>...</SendReservation>
[11-28-54.600000] Status: Error: Reservation was rejected
现在使用logstash,我需要解析保留的一些字段,包括ReservationId。为此,我可以使用logstashxml过滤器。 但是,我必须将其与成功/错误状态结合起来,该状态在XML输出后作为普通文本打印

我尝试使用多行输入:

input {
  file {
    path => "test.log"
    start_position => "beginning"
    type => "reservation"
    codec => multiline {
      pattern => "\[(.*?)\](.*?)<\?xml[^>]*>"
      negate => true
      what => previous
    }
  }
}
有了这些,我将在logstash事件中得到一条消息:

"message" => "[11-28-51.492900] <?xml version="1.0" encoding="UTF-8"?><SendReservation><ReservationId>1289</ReservationId><Customer>2892</Customer>...</SendReservation>\n[11-28-51.493000] Status: Successfull\n[11-28-52.261000] Something different\n[11-28-51.520000] Sending reservation to customer
为了能够用XML过滤器解析XML,我需要有一个包含有效XML的字段。因此,我试图在xml之前和之后删除时间戳

    mutate {
        gsub => [ "message", "^(.*?)<\?xml[^>]*>", "" ]
    }
    mutate {
        gsub => [ "message", "(?<=<\/SendReservation>).*$", "" ]
    } 
此时,我看到正则表达式匹配只在第一行之前的消息的第一行中起作用\n。这意味着,在结束标记之后删除所有内容将不会产生任何效果。这是我的第一个问题,可能与多行有关

第二个问题是,我不知道如何移动XML内容,我尝试将“message”剪切到一个新字段中,我可以在XML过滤器中将其用作源字段。我尝试了grok,但它需要一个现有字段,我必须创建一个新字段

总之,我只想从我的多行消息中创建一个head和tail字段。头一行包含XML,包含主要信息,尾一行包含一些附加信息,我必须说明这些信息。

好的,多亏了,我自己也找到了

我必须使用

grok { match => { "message" => "(?<head>(\[(.*?)\](.*?)<\?xml[^>]*>(.*?)<\/SendReservation>))+(?<tail>(?<=<\/SendReservation>)(.|\n)*$)" } }
第一个问题的答案: 我必须考虑以下因素:?