Logstash,从多个文档中的xml文件中拆分事件,保留来自根标记的信息
我的问题是: 我有XML文件,其中包含我希望使用Logstash解析的事件,以便在之后使用Kibana请求它。我希望在每个事件中保留根标记中的所有信息 输入看起来像: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 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"
]
}