技術者以外の人が表示できるように、一連のデータをELKスタックに解析しています。この一環として、ElasticSearchに送信する前に、特定の既知のフィールドのサブセットを除くすべてのフィールドをイベントから削除したいと思います。
次のように、変更フィルターにドロップする各フィールドを明示的に指定できます。
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"]
}
}
プルーン ホワイトリストはあなたが探しているものでなければなりません。
より具体的な制御については、Rubyフィルターにドロップすることがおそらく次のステップです。
別のオプションは、解析されたjsonを新しいフィールドに移動し、mutateを使用することです。例:
filter {
json {
source => "json"
target => "parsed_json"
}
mutate {
add_field => {"nested_field" => "%{[parsed_json][nested_field]}"}
remove_field => [ "json", "parsed_json" ]
}
}