【问题标题】:Parse complex XML file using ELK使用 ELK 解析复杂的 XML 文件
【发布时间】:2018-12-25 05:47:06
【问题描述】:

我最近开始学习 ELK,但很难理解如何解析 XML 数据。 我想解析我的 XML 文件,看起来像这样:

<Name nameID="xxxx">
  <Type p="1">xxxxxx</Type>
  <Type p="2">xxxxxx</Type>
    .
    .
  <Type p="9">xxxxx</Type>
  <Value obj="1"> 
    <r p="1">5.94</r>
    <r p="2">62.19</r>
    .
    .
    <r p="9">7.19</r>
  </Value>
  <Value obj="2"> 
    <r p="1">5.94</r>
    <r p="2">62.19</r>
    .
    .
    <r p="9">7.19</r>
  </Value>
</Name>
<Name nameID="yyyy">
  <Type p="1">yyyyy</Type>
  <Type p="2">yyyyyy</Type>
  <Type p="3">yyyy</Type>
  <Value obj="1"> 
    <r p="1">54.94</r>
    <r p="2">6.19</r>
    <r p="3">0</r>
  </Value>
</Name>

我想得到类似的东西:在输出中

"NameID = name1
Type = Type1
obj = obj1
Value = xx
"
"NameID = name1
Type = Type2
obj = obj1
Value = xx
"
"NameID = name1
Type = Type3
obj = obj1
Value = xx
"
...etc
and then
"NameID = name1
Type = Type1
obj = obj2
Value = xx
"
"NameID = name1
Type = Type2
obj = obj2
Value = xx
"
....etc

我使用了这个 logstash.conf,但我没有得到我真正需要的东西(我得到了每个字段的数组)

input {
    file {
        path => "/home/test/data.xml"
        start_position => beginning
        sincedb_path => "/dev/null"
        codec => multiline
        {
            pattern => "<Name"
            negate => true
            what => "previous"
        }
    }
}
filter
{
    xml {
        source => "message"
        target => "parsed"
        add_tag => "xml"
        xpath => [
            "//Name/@nameID","Name",
            "//Type/@p","TypeID",
            "//Type/text()","Type",
            "//Value/@obj","Obj",
            "//r/text()","value"]

【问题讨论】:

标签: xml elasticsearch logstash kibana elastic-stack


【解决方案1】:
  1. 使用logstash ruby filter plugin。 (需要在您的代码中 require 一个 gem 吗?)
  2. 用 ruby​​ parse XML,到
  3. 构建准备索引的 json 文档

【讨论】:

  • 嗨 panchicore,我整天都在寻找相同的例子来使用 ruby​​ 过滤器插件。但是我没有找到使用它的方法。事实上,我不知道如何使用它来解决我的问题。你能给我一个建议吗?非常感谢^^
  • 过滤器接收到var event,通过它你可以访问xml字符串,这里有一个简单的例子,说明如何将字段扁平化为数组github.com/panchicore/es-gtd/blob/master/logstash/…从这里开始
【解决方案2】:

解决方案:

filter { xml { source => "message" store_xml => true target => "theXML" force_array => false } }
split { field => "[theXML][Type]" }
split { field => "[theXML][Value]" }
split { field => "[theXML][Value][r]" }

然后在输出中使用:

output{
if [theXML][Type][p]==[theXML][Value][p]{
elasticsearch ....}}

希望对某人有所帮助;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2013-01-17
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多