我正在将一组数据解析为ELK堆栈,供一些非技术人员查看。作为其中的一部分,我想在发送到ElasticSearch之前从事件中删除除特定已知字段子集之外的所有字段。
我可以明确指定每个字段放入mutate过滤器中,如下所示:
filter {
mutate {
remove_field => [ "throw_away_field1", "throw_away_field2" ]
}
}
在这种情况下,只要新的字段被添加到输入数据(这可能经常发生,因为数据是从队列中提取并由多个系统用于多种目的),它需要更新过滤,这是额外的开销不需要。更不用说在输入流更新和更新过滤之间是否有一些敏感数据通过,这可能是坏事。
是否有使用logstash过滤器迭代对象的每个字段的方法,如果它不在提供的字段名称列表中,则有remove_field吗?或者我是否必须编写自定义过滤器来执行此操作?基本上,对于每个单个对象,我只想保留8个特定字段,并且绝对抛弃其他所有字段。
看起来logstash.conf文件中提供了非常小的if ![field] =~ /^value$/
类型逻辑,但是我没有看到任何以for each
样式迭代字段本身的示例将字段名称与值列表进行比较。
答案:
将logstash升级到1.5.0以便能够使用prune之类的插件扩展后,解决方案最终看起来像这样:
filter {
prune {
interpolate => true
whitelist_names => ["fieldtokeep1","fieldtokeep2"]
}
}
答案 0 :(得分:7)
Prune白名单应该是您正在寻找的内容。
对于更具体的控制,可能是下一步下降到ruby过滤器。
答案 1 :(得分:3)
另一种选择是将解析后的json移动到新的字段而不是使用mutate,例如:
filter {
json {
source => "json"
target => "parsed_json"
}
mutate {
add_field => {"nested_field" => "%{[parsed_json][nested_field]}"}
remove_field => [ "json", "parsed_json" ]
}
}