【问题标题】:How to parse multi line XML in logstash?如何在logstash中解析多行XML?
【发布时间】:2016-01-14 21:58:17
【问题描述】:

我的 s3 存储桶中有多行 XML 文件(约 800 行),我想在 Elasticsearch 中对它们进行索引,但我无法在 logstash 中解析它们。字段有时为空,因此无法手动解析文件。

我的 xml 看起来像:

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

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

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

在我的过滤器中,以下配置:

multiline { 
pattern => ["\t\t"]
what => next
} 

【问题讨论】:

  • 你没有提到是什么导致了你的问题。我一般,使用多行编解码器或过滤器来制作单个事件,然后将其传递给 xml{} 过滤器。
  • 我在我的帖子中添加了我的配置
  • 第二个过滤器应该做什么?您的文件中没有标签的迹象。但是请检查您在 elasticsearch 中的 _source 字段 - 这是否包含您的完整 XML? (如果没有,您能否发布它确实包含的内容的示例?)
  • 我想要匹配单个事件的行,并且我希望每一行都是 Json 字段
  • 还有什么不能与你所拥有的一起工作?

标签: xml elasticsearch logstash


【解决方案1】:

好的,看起来问题是,您对多行编解码器和 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),但也专门将 ErrorLevel 提取到它自己的字段中。

【讨论】:

  • 我所有的 xml 都在标签“ ; [...my events....] ” 我想忽略这个标签,我试过了remove_tag 但没有用。你知道我该怎么做吗? @Sobrique
  • 那将是一个单独的问题,我建议你这样问。
  • 我需要添加auto_flush_interval =&gt; 1 来处理最后一个事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多