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