【问题标题】:Logstash filter remove_field for all fields except a specified list of fieldsLogstash 过滤器 remove_field 用于除指定字段列表之外的所有字段
【发布时间】:2015-10-28 18:47:24
【问题描述】:

我正在将一组数据解析到 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"]
    }
}

【问题讨论】:

    标签: logstash logstash-configuration


    【解决方案1】:

    Prune 白名单应该是你要找的。​​p>

    对于更具体的控制,下一步可能是使用 ruby​​ 过滤器。

    【讨论】:

    • 这看起来正是我正在寻找的。我会试一试并报告...
    • 我必须升级 logstash 才能使其正常工作,因此会出现延迟,但这正是我想要的。感谢您及时回复!接受:)
    【解决方案2】:

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

    filter {
       json {
          source => "json"
          target => "parsed_json"
       }
    
       mutate {
          add_field => {"nested_field" => "%{[parsed_json][nested_field]}"}
          remove_field => [ "json", "parsed_json" ]
       }
    }
    

    【讨论】:

    • 这是一个很好的替代解决方案,可以让我不必升级 logstash 来安装 prune 过滤器。
    • @redstonemercury 我认为你可以安装插件而不是升级logstash logstash-filter-prune
    • prune 不适用于 json 中的子集,只有顶级值有效
    • 如果'prune'有问题,这可能是一个很好的plan-b。像我一样... mutate 是核心包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多