Logstash筛选器删除除指定字段列表之外的所有字段的\u字段
我正在将一组数据解析成一个ELK堆栈,供一些非技术人员查看。作为其中的一部分,我希望在发送到ElasticSearch之前,从事件中删除除特定已知字段子集以外的所有字段 我可以显式地指定每个字段以放入一个变异过滤器,如下所示:Logstash筛选器删除除指定字段列表之外的所有字段的\u字段,logstash,logstash-configuration,Logstash,Logstash Configuration,我正在将一组数据解析成一个ELK堆栈,供一些非技术人员查看。作为其中的一部分,我希望在发送到ElasticSearch之前,从事件中删除除特定已知字段子集以外的所有字段 我可以显式地指定每个字段以放入一个变异过滤器,如下所示: filter { mutate { remove_field => [ "throw_away_field1", "throw_away_field2" ] } } 在这种情况下,只要在输入数据中添加一个新字段(由于数据从队列中提取
filter {
mutate {
remove_field => [ "throw_away_field1", "throw_away_field2" ]
}
}
在这种情况下,只要在输入数据中添加一个新字段(由于数据从队列中提取并由多个系统用于多个目的,这种情况经常发生),就需要更新筛选,这是不需要的额外开销。更不用说,如果一些敏感数据在更新输入流和更新过滤之间通过,那可能是不好的
是否有一种方法可以使用logstash过滤器迭代对象的每个字段,如果字段不在提供的字段名列表中,则删除_字段?或者我需要编写一个自定义过滤器来实现这一点?基本上,对于每一个对象,我只想保留8个特定的字段,并完全丢弃所有其他字段
它看起来非常小if![field]=~/^value$/
类型逻辑在logstash.conf文件中可用,但我没有看到任何示例会在每个样式的中迭代字段本身,并将字段名与值列表进行比较
回答:
在将logstash升级到1.5.0以能够使用诸如prune之类的插件扩展之后,解决方案最终看起来是这样的:
filter {
prune {
interpolate => true
whitelist_names => ["fieldtokeep1","fieldtokeep2"]
}
}
白名单应该是你要找的
对于更具体的控制,下一步可能是删除ruby过滤器。另一个选项是将解析的json移到新字段中,而不是使用mutate,例如:
filter {
json {
source => "json"
target => "parsed_json"
}
mutate {
add_field => {"nested_field" => "%{[parsed_json][nested_field]}"}
remove_field => [ "json", "parsed_json" ]
}
}
这正是我要找的。我会给它一个尝试,并报告回来…我必须升级logstash使其工作,因此延迟,但这正是我所寻找的。谢谢你的快速回答!已接受:)这是一个很好的替代解决方案,可以避免我必须升级logstash才能安装prune过滤器。@redstonemercury我认为你可以安装插件,而不是升级logstashlogstash过滤器prune
prune不适用于json中的子集,只有顶级值起作用如果“修剪”有问题,这可能是非常好的b计划。像我一样。。。mutate是核心包。