2016-08-24 37 views
6

Logstashフィルタでネストされたフィールドのコピーを作成したかったが、正しい構文がわからない。Logstash mutate.add_fieldを使用してネストされたフィールドをコピーする

正しくない構文:

mutate { 
    add_field => { "received_from" => %{beat.hostname} } 
} 

beat.hostnameがbeat.hostnameが交換されていない

mutate { 
    add_field => { "received_from" => "%{beat.hostname}" } 
} 

置き換えられません

mutate { 
    add_field => { "received_from" => "%{[beat][hostname]}" } 
} 

beat.hostnameをここに は、私がしようとするものです交換されない

mutate { 
    add_field => { "received_from" => "%[beat][hostname]" } 
} 

途中です。ネストされていないフィールドを与えると、期待どおりに動作します。

{ 
     "@timestamp" => "2016-08-24T13:01:28.369Z", 
      "beat" => { 
       "hostname" => "etg-dbs-master-tmp", 
       "name" => "etg-dbs-master-tmp" 
    }, 
      "count" => 1, 
       "fs" => { 
     "device_name" => "/dev/vdb", 
       "total" => 5150212096, 
       "used" => 99287040, 
      "used_p" => 0.02, 
       "free" => 5050925056, 
       "avail" => 4765712384, 
       "files" => 327680, 
     "free_files" => 326476, 
     "mount_point" => "/opt/ws-etg/datas" 
    }, 
      "type" => "filesystem", 
     "@version" => "1", 
      "tags" => [ 
       [0] "topbeat" 
       ], 
     "received_at" => "2016-08-24T13:01:28.369Z", 
    "received_from" => "%[beat][hostname]" 
} 
+0

は、あなたが使用しているlogstashの設定の関連部分を表示することができますか? – Val

+2

私は再現できませんでした。 'add_field => {" received_from "=>"%{[beatname [hostname]} "}'とlogstash-2.2.2を使って私のために働いた – baudsp

+1

私は私の答えが少し長いことを知っています。あなたの問題は何だったの?ネストされた値の新しいフィールドを書きたいのですか?または、ネストされたフィールドを他のフィールドの値に置き換えますか? – pandaadb

答えて

10

EDIT:あなたの入力メッセージを示さなかったので、私はあなたの出力をオフに働い

logstashで受信したデータ構造は次のようです。あなたの出力にコピーしようとしているフィールドがすでに存在しているので、replaceを使用する必要があります。存在しない場合は、add_fieldを使用する必要があります。私は両方のケースで自分の答えを更新しました。

EDIT 2:私はあなたの問題がネストされている値にアクセスするかもしれないことに気づいたので、私はそれも追加:)あなたは/間違った後方のmutateフィルタを使用している

まず間違い:

あなたは1を追加し、フィールドではなく交換したいです。ドキュメントでは、 "置き換える"オプションが表示されます。参照:https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-replace

2番目の間違いは、逆の構文を使用していることです。あなたが、これが真実であると信じることが表示されます:

"text I want to write" => "Field I want to write it in" 

これが真である間:

mutate { 
    replace => { "[test][a]" => "%{s}"} 
} 

またはあなたがしたい場合は:この知識を用いて

"myDestinationFieldName" => "My Value to be in the field" 

、私たちは今、これを行うことができます実際には存在しない新しいフィールドを追加してください:

mutate { 
     add_field => {"[test][myNewField]" => "%{s}"} 
} 

またはネストされたフィールドの値を持つ新しい既存のフィールド追加:私の例では、

mutate { 
     add_field => {"some" => "%{[test][a]}"} 
} 

以上の詳細は:

input { 
    stdin { 
    } 
} 

filter { 
    json { 
     source => "message" 
    } 

    mutate { 
     replace => { "[test][a]" => "%{s}"} 
     add_field => {"[test][myNewField]" => "%{s}"} 
     add_field => {"some" => "%{[test][a]}"} 
    } 
} 

output { 
      stdout { codec => rubydebug } 
} 

をこの例では、標準出力に標準入力と出力を取ります。 jsonフィルタを使用してメッセージを解析し、次にmutateフィルタを使用して入れ子フィールドを置き換えます。また、ネストされたテストオブジェクトにまったく新しいフィールドを追加します。

{"test" : { "a": "hello"}, "s" : "to_Repalce"} 

我々はtest.aを置換する(値:「こんにちは」)sの そして最後には、新しいフィールドを作成し、「一部」は、だからこのメッセージのtest.a

の値を持っています(値: "to_Repalce")、フィールドtest.myNewFieldに値sを追加します。私の端末に

[email protected]:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf2/ 
Settings: Default pipeline workers: 8 
Pipeline main started 
{"test" : { "a": "hello"}, "s" : "to_Repalce"} 
{ 
    "message" => "{\"test\" : { \"a\": \"hello\"}, \"s\" : \"to_Repalce\"}", 
    "@version" => "1", 
"@timestamp" => "2016-08-24T14:39:52.002Z", 
     "host" => "pandaadb", 
     "test" => { 
      "a" => "to_Repalce", 
    "myNewField" => "to_Repalce" 
}, 
     "s" => "to_Repalce" 
     "some" => "to_Repalce" 
} 

値が正常に置き換えられました。置き換え値がネストされた配列に

新しいフィールドを追加されていると

フィールドには、「いくつかの」が追加されました。

add_fieldを使用すると、aが配列に変換され、そこに値が追加されます。これはあなたの問題を解決し

希望、

アルトゥル

+1

Wahooo非常に印象的な答え。形式:mutate { add_field => {"some" => "%{[test] [a]}"} }がトリックを行います。私が推測するLogstashのドキュメントにあるこの完全な回答には、多くの感謝の意を表します。私はこの回答を私のお気に入りのままにします! – jmcollin92

+0

偉大な答え!私はネストされたフィールドを使用するために同じ構文=> {"some" => "%{[test] [a]}"}を探していました。 –

関連する問題