如何在logstash中解析多行XML?

3

我有一些多行的XML文件(大约800行)存储在我的S3桶中,我想在Elasticsearch中对它们进行索引,但我无法在Logstash中解析它们。 字段有时为空,因此手动解析文件是不可能的。

我的XML文件看起来像:

<ServiceSalesClosed>
   <ErrorLevel>0</ErrorLevel>
   <ErrorMessage/>
   <LaborSaleCustomerPay>50.00</LaborSaleCustomerPay>`
   ... 

在我的输入中,我有配置:

codec => multiline
{ 
pattern => "<ServiceSalesClosed.*"
what => next
}

在我的过滤器中,以下是配置内容:
multiline { 
pattern => ["\t\t"]
what => next
} 

你没有提到是什么导致了你的问题。通常使用multiline编解码器或过滤器将多行事件合并为单个事件,然后将其传递给xml{}过滤器。 - Alain Collins
我在我的帖子中添加了我的配置。 - Antoine L.
第二个过滤器的作用是什么?你的文件中没有制表符的迹象。但是请检查您在 Elasticsearch 中的 _source 字段 - 它是否包含完整的 XML?(如果不包含,您能否发布它所包含内容的示例?) - Sobrique
你不应该同时使用编解码器和过滤器。你的编解码器说:任何包含“<ServiceSalesClosed”的内容都与下一行保持一致,这似乎不正确。 - Alain Collins
你能发布一下你的XML过滤器配置吗? - Sobrique
显示剩余4条评论
1个回答

9
好的,看起来问题在于您混淆了多行编解码器和XML过滤器。
我建议您设置您的多行编解码器:
codec => multiline {
     pattern => "<ServiceSalesClosed>" 
     negate => "true"
     what => "previous"
}

这将保留不包含此标签的任何行,并将其与前面的行组合在一起。这应该将您的XML段落分成可解析的块。您应该在_source中看到此结果。

然后在您的过滤器中:

filter {
  xml => {
    source => "message"
    target => "xml_content"
    xpath => [ "//ErrorLevel", "error_level" ] 
  }
}

这样做会解析您的XML,为“xml_content”(包括您解析的XML)在elasticsearch数据库中创建字段,但还会将ErrorLevel单独提取到一个字段中。


我的所有XML都在一个标签中:<ServiceSales xmlns="dmoes">;[...我的事件...] </ServicesSales>。我想忽略这个标签,我尝试使用remove_tag但没有成功。你知道我该怎么做吗?@Sobrique - Antoine L.
1
那应该是一个单独的问题,我建议您将其作为一个新问题提出。 - Sobrique
1
我需要添加 auto_flush_interval => 1 来处理最后一个事件。 - rjurado01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接