我正在设置logstash,以便能够从filebeat接收xml日志。我面临的问题是我不想打印整个日志文件,我只对特定字段感兴趣。为此,我正在使用xml过滤器插件和Prune过滤器插件。
例如,我正在使用IDMEF-Message警报,并且对“分类”字段感兴趣。
我所做的配置是:
input {
beats {
port => "5044"
}
}
#I'm just interested in the log alert.
filter {
prune {
whitelist_names => [ "^message$"]
}
}
#Get de classification text from the alert
filter {
xml {
source => "message"
store_xml => false
target => "clasifications"
xpath => ["/IDMEF-Message/Alert/Classification/text()", "clasificacion"]
remove_field => "message"
}
}
#Add a new field class with the clasifications value
filter {
mutate{add_field=>{"class"=>"%{clasifications}"}}
}
#remove message and just let the class field
filter {
prune {
whitelist_names => [ "clas"]
}
}
output {
file {
path => "~/xml_logstash.txt"
}
}
我收到的输出仅为{“ class”:“%{clasifications}”}。我还尝试将mutate {add_field => {“ class” =>“%{clasifications}”}}更改为mutate {add_field => {“ class” =>“%{clasificacion}”}},但结果相同
我的疑问是如何访问存储xml过滤器结果的“ clasificacion”字段。
我正在处理的日志的示例是:
<IDMEF-Message>
<Alert messageid="...">
<Analyzer ...
</Analyzer>
<CreateTime ... </CreateTime>
<DetectTime ... </DetectTime>
<AnalyzerTime ... </AnalyzerTime>
<Source>
...
</Source>
<Target>
...
</Target>
<Classification text="Text_Class" />
<IDMEF-Message>
谢谢 鲁比
答案 0 :(得分:0)
我解决了。
问题是我访问分类字段的text属性的方式。如果它是一个属性,则必须使用@text;如果是字段的值,则必须使用text()。
filter {
xml {
source => "message"
store_xml => false
target => "clasifications"
xpath => ["/IDMEF-Message/Alert/Classification/@text", "clasificacion"]
}
}
filter {
mutate{add_field=>{"clasificacion"=>"%{clasificacion}"}}
}