除了指定的字段列表之外的所有字段的Logstash过滤器remove_field

red*_*ury 10 logstash logstash-configuration

我正在将一组数据解析为ELK堆栈,供一些非技术人员查看.作为其中的一部分,我想在发送到ElasticSearch之前从事件中删除除特定已知字段子集之外的所有字段.

我可以明确指定每个字段放入mutate过滤器,如下所示:

filter {
    mutate {
        remove_field => [ "throw_away_field1", "throw_away_field2" ]
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,无论何时将新字段添加到输入数据(这可能经常发生,因为数据是从队列中提取并由多个系统用于多种目的),它将需要更新过滤,这是额外的开销.不需要.更不用说在输入流更新和更新过滤之间是否有一些敏感数据通过,这可能是不好的.

有没有办法使用logstash过滤器迭代对象的每个字段,如果它不在提供的字段名称列表中,则删除remove_field?或者我是否必须编写自定义过滤器来执行此操作?基本上,对于每个单个对象,我只想保留8个特定字段,并且绝对抛弃其他所有字段.

看起来if ![field] =~ /^value$/logstash.conf文件中提供了非常小的类型逻辑,但我没有看到任何示例会在for each样式中迭代字段本身并将字段名称与值列表进行比较.

回答:

在将logstash升级到1.5.0以便能够使用诸如prune之类的插件扩展之后,解决方案最终看起来像这样:

filter {
    prune {
        interpolate => true
        whitelist_names => ["fieldtokeep1","fieldtokeep2"]
    }
}
Run Code Online (Sandbox Code Playgroud)

Ala*_*ins 7

修剪白名单应该是你想要的.

对于更具体的控制,可能是下一步下降到红宝石过滤器.


小智 5

另一种选择是将解析的 json 移动到新的字段中,然后使用 mutate,例如:

filter {
   json {
      source => "json"
      target => "parsed_json"
   }

   mutate {
      add_field => {"nested_field" => "%{[parsed_json][nested_field]}"}
      remove_field => [ "json", "parsed_json" ]
   }
}
Run Code Online (Sandbox Code Playgroud)