【问题标题】:Logstash - Split Multiline Message into Head and TailLogstash - 将多行消息拆分为头部和尾部
【发布时间】:2017-01-21 23:22:26
【问题描述】:

我正在尝试解析包含 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。为此,我可以使用 logstash XML 过滤器。 但是我必须将它与成功/错误状态结合起来,它在 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,我需要一个字段为 source,其中包含有效的 XML。因此,我试图删除 xml 之前和之后的所有时间戳。

    mutate {
        gsub => [ "message", "^(.*?)<\?xml[^>]*>", "" ]
    }
    mutate {
        gsub => [ "message", "(?<=<\/SendReservation>).*$", "" ]
    } 

此时我看到,正则表达式匹配仅在消息的第一行(在第一个 \n 之前)有效。这意味着,在结束标记之后删除所有内容将无效。这是我的第一个问题,可能与多行有关。

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

因此,总而言之,我想要的只是从我的多行消息中创建一个头部和尾部字段。 Head 将包含带有 XML 的第一行,包含主要信息,其余部分包含一些我必须关联的附加信息。

【问题讨论】:

    标签: xml logstash multiline grok


    【解决方案1】:

    好的,感谢https://regex101.comhttp://grokconstructor.appspot.com 我自己找到了

    我必须使用

    grok { match => { "message" => "(?<head>(\[(.*?)\](.*?)<\?xml[^>]*>(.*?)<\/SendReservation>))+(?<tail>(?<=<\/SendReservation>)(.|\n)*$)" } }
    

    第一个问题的答案: 我必须考虑到 \n:?&lt;=&lt;\/SendReservation&gt;)(.|\n)*$

    第二个问题的答案: Logstash 从所有正则表达式组名称创建字段。在这种情况下,grok 模式 (?&lt;head&gt;(regex_for_xml))+(?&lt;tail&gt;(regex_for_text)) 将创建一个 head 和一个 tail 字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 2018-03-10
      • 2016-05-18
      • 2011-05-30
      相关资源
      最近更新 更多