我正在设置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}”}}来改变{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>
谢谢Rubi
我解决了
问题是我访问分类字段的文本属性的方式。如果它是属性,则必须使用@text,而case中的text()是字段的值。
filter {
xml {
source => "message"
store_xml => false
target => "clasifications"
xpath => ["/IDMEF-Message/Alert/Classification/@text", "clasificacion"]
}
}
filter {
mutate{add_field=>{"clasificacion"=>"%{clasificacion}"}}
}