elasticsearch,logstash,Xml,elasticsearch,Logstash" /> elasticsearch,logstash,Xml,elasticsearch,Logstash" />

Logstash,从多个文档中的xml文件中拆分事件,保留来自根标记的信息

Logstash,从多个文档中的xml文件中拆分事件,保留来自根标记的信息,xml,elasticsearch,logstash,Xml,elasticsearch,Logstash,我的问题是: 我有XML文件,其中包含我希望使用Logstash解析的事件,以便在之后使用Kibana请求它。我希望在每个事件中保留根标记中的所有信息 输入看起来像: <?xml version="1.0" encoding="UTF-8"?> <ROOT number="34"> <EVENTLIST> <EVENT name="hey"/> <EVENT name="you"/> </EVENTLIST

我的问题是: 我有XML文件,其中包含我希望使用Logstash解析的事件,以便在之后使用Kibana请求它。我希望在每个事件中保留根标记中的所有信息

输入看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT number="34">
  <EVENTLIST>
    <EVENT name="hey"/>
    <EVENT name="you"/>
  </EVENTLIST>
</ROOT>
日志存储配置:

input {
  stdin { }
}
filter {
  xml {
    store_xml => "false"
    source => "message"
    target => "EVENT"
    xpath => [
      "/ROOT/@number","number",
      "/ROOT/EVENTLIST/EVENT/@name","name"
    ]
  }
}
output { elasticsearch { host => localhost } stdout { codec => rubydebug } }
没用。我得到的是:

{
  "number" : ["34"]
  "name":["hey,"you""]
}
我遵循了这篇文章的解决方案:

但我的问题仍然存在,我丢失了根标记的信息

解决方法之一是使用一些ruby过滤器来处理这个问题,但我不知道ruby。 另一种方法是使用一些java编程将XML转换为JSON,然后再将其发送到elasticsearch


如果你的结构像你展示的那样简单,你可以使用我写的
记忆
插件

您的配置如下所示:

filter {
  if ([message] =~ /<ROOT/) {
    grok {
      match => [ "message", 
        'number="(?<number>\d+)" number2="(?<number1>\d+)"'
      ] 
    }
  } else if ([message] =~ /<EVENT /) {
    grok { 
      match => [ "message", 'name="(?<name>[^"]+)"']
    }
  }
  memorize {
    fields => ["number","number1"]
  }
  if ([message] !~ /<EVENT /) {
    drop {}
  } else {
    mutate { remove_field => ["message"] }
  }
}
对于logstash 1.5及更高版本,此插件可通过

bin/plugin install logstash-filter-memorize
尝试此筛选器:

filter {
  xml {
    source => "message"
    target => "xml_content"
  }
  split {
    field => "xml_content[EVENTLIST]"
  }
  split {
    field => "xml_content[EVENTLIST][EVENT]"
  }
  mutate {
    add_field => { "number" => "%{xml_content[number]}" }
    add_field => { "name" => "%{xml_content[EVENTLIST][EVENT][name]}" }
    remove_field => ['xml_content', 'message', 'path']
  }
}
output {
  stdout {
    codec => rubydebug
  }
}
它返回以下事件:

{
        "number" => "34",
    "@timestamp" => 2016-12-23T12:01:17.888Z,
      "@version" => "1",
          "host" => "xubuntu",
          "name" => "hey"
    ]
}
{
        "number" => "34",
    "@timestamp" => 2016-12-23T12:01:17.888Z,
      "@version" => "1",
          "host" => "xubuntu",
          "name" => "you"
    ]
}

重装的Thx。它不能正常工作。我有一些零来代替事件的正确数字,好像它不记得它一样。我也不知道为什么,但即使使用drop{},仍然有像EVENTLIST这样的值文档。。。仍在努力让它发挥作用。好吧,我认为记忆{…}的位置错了,应该放在过滤器的末尾,否则太记忆的过滤器似乎不共享相同的数值。Thx AlcanzarHum,现在我必须改进插件,这样就可以保留一个值数组,而不是一个简单的值。是时候做一些ruby编程了。我计划最终将插件提交给logstash。。。让它记住很多东西真是个好主意。
filter {
  xml {
    source => "message"
    target => "xml_content"
  }
  split {
    field => "xml_content[EVENTLIST]"
  }
  split {
    field => "xml_content[EVENTLIST][EVENT]"
  }
  mutate {
    add_field => { "number" => "%{xml_content[number]}" }
    add_field => { "name" => "%{xml_content[EVENTLIST][EVENT][name]}" }
    remove_field => ['xml_content', 'message', 'path']
  }
}
output {
  stdout {
    codec => rubydebug
  }
}
{
        "number" => "34",
    "@timestamp" => 2016-12-23T12:01:17.888Z,
      "@version" => "1",
          "host" => "xubuntu",
          "name" => "hey"
    ]
}
{
        "number" => "34",
    "@timestamp" => 2016-12-23T12:01:17.888Z,
      "@version" => "1",
          "host" => "xubuntu",
          "name" => "you"
    ]
}