2017-11-07 9 views
0

私はKafkaからJSON入力を受け取り、それをElasticsearch Outputに送るLogstash設定を持っています。私はKibanaを用いたELデータを表示するとき、それが後で新しい列に表示できるように、新しいフィールドとしてstatus値を追加したいと思いLogstashネストJSON Parse

TrackingData: { 
    "path": "/hello/world", 
    "method": "GET", 
    "requestDateTime": "2017-11-07T16:12:02.635", 
    "duration": 5104684, 
    "status": 200 
} 

:JSON受信

は、以下の構造を有しています。これについては、Logstash設定にmutatefilterを含める必要があることを理解しています。

statusの値をJSON構造体から外して新しいフィールドに入れるには、Rubyの文字列はどうすればよいですか?

マイLogstashの設定次のように現在、次のとおりです。メッセージはLogstashによって処理されると、私はroot_fieldがKibanaで大丈夫解析され

input { 
    kafka { 
     bootstrap_servers => ["kafka:9092"] 
     topics => "test-topic" 
     group_id => "test-topic-group" 
    } 
} 
filter { 
    mutate { 
     add_field => { 
      "root_field" => "%{[message]}" 
      "status_field" => "%{[message][TrackingData][status]}" 
     } 
    } 
} 
output { 
    stdout { 
     codec => rubydebug 
    } 
    elasticsearch { 
     hosts => ["elk:9200"] 
} 

見ることができます(私はJSONであることを証明するためにこのフィールドを追加しましたpar32)、status_fieldはキバナに%{[message][TrackingData][status]}と表示されます(つまり、解析文字列が正しくない必要があります)。

上記のJSON構造のうちstatusの値を取得するには、解析文字列をどのように指定する必要がありますか?

答えて

0

2つのことが間違っていました。最初の問題はJSON自体が間違っていたことでした。 TrackingData"で囲まれていませんでした。正しいJSONは次のようにする必要があります:

"TrackingData": { 
    "path": "/hello/world", 
    "method": "GET", 
    "requestDateTime": "2017-11-07T16:12:02.635", 
    "duration": 5104684, 
    "status": 200 
} 

第二に、私はcodec => "json"を追加し、Logstashのconfigでfilterコードブロックを削除しました:今

input { 
    kafka { 
     bootstrap_servers => ["kafka:9092"] 
     topics => "test-topic" 
     group_id => "test-topic-group" 
     codec => "json" 
    } 
} 
output { 
    stdout { 
     codec => rubydebug 
    } 
    elasticsearch { 
     hosts => ["elk:9200"] 
} 

、JSONs'キー/値はに解析されている受信必要に応じて木場の別々の列に表示することができます(または必要がない場合は除外します)。

Kibana screen grab showing JSON fields in separate columns