如何在 logstash 中解析多行 XML?
How to parse multi line XML in logstash?
我的 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 过滤器感到困惑。
我可以建议你设置多行吗:
codec => multiline {
pattern => "<ServiceSalesClosed>"
negate => "true"
what => "previous"
}
这将采用任何 不 包含此标记的行,并将其与前面的行保持一致。这应该将您的 XML 节分组为可解析的块。您应该在 _source
中看到此结果。
然后在你的过滤器中:
filter {
xml => {
source => "message"
target => "xml_content"
xpath => [ "//ErrorLevel", "error_level" ]
}
}
然后这应该解析您的 XML,在 elasticsearch 数据库中为 "xml_content" 创建字段(包括您解析的 XML),但也专门将 ErrorLevel
提取到一个字段中它自己的。
我的 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 过滤器感到困惑。
我可以建议你设置多行吗:
codec => multiline {
pattern => "<ServiceSalesClosed>"
negate => "true"
what => "previous"
}
这将采用任何 不 包含此标记的行,并将其与前面的行保持一致。这应该将您的 XML 节分组为可解析的块。您应该在 _source
中看到此结果。
然后在你的过滤器中:
filter {
xml => {
source => "message"
target => "xml_content"
xpath => [ "//ErrorLevel", "error_level" ]
}
}
然后这应该解析您的 XML,在 elasticsearch 数据库中为 "xml_content" 创建字段(包括您解析的 XML),但也专门将 ErrorLevel
提取到一个字段中它自己的。