使用 Grok 解析动态 xml 结构的日志内容是否可行,例如:
<tag_1> contents </tag_1> ... <tag_N> contents </tag_N>
其中“tag_*”是字段名称,“contents”是实际内容。因此,解析后的消息如下所示:
{
"tag_1": [
[
"contents"
]
],
....
"tag_N": [
[
"contents"
]
]
}
不与grok
. 您将需要使用 ruby 代码来解析 XML 并将其放入event
结构中。
如果您的 XML 是超级常规的(即有一个根元素,并且它下面只有一层),您可以使用如下代码:
filter {
ruby {
code => "
msg = event['message'].split('><');
for part in msg
endpos = part.index('</')
startpos = part.index('>')
if !endpos.nil? && !startpos.nil? then
tag = part[0,startpos];
text = part[startpos+1,endpos-startpos-1];
event[tag]=text
end
end
"
}
}
如果您的 xml 更复杂,您将不得不求助于真正的 XML 解析器并弄清楚如何将它与 logstash 一起使用(我从未将外部库带入 logstash)。