2016-07-21 14 views
0

logstash(最新バージョン)のネストされたJSONフィールドへのアクセスに問題があります。LogstashのネストされたJSONフィールドへのアクセス

私の設定ファイルは以下の通りです:

input { 
    http { 
    port => 5001 
    codec => "json" 
    } 
} 

filter { 
    mutate { 
    add_field => {"es_index" => "%{[statements][authority][name]}"} 
    } 
    mutate { 
    gsub => [ 
     "es_index", " ", "_" 
    ] 
    } 
    mutate { 
    lowercase => ["es_index"] 
    } 
    ruby { 
    init => " 
     def remove_dots hash 
      new = Hash.new 
      hash.each { |k,v| 
       if v.is_a? Hash 
        v = remove_dots(v) 
       end 
       new[ k.gsub('.','_') ] = v 
       if v.is_a? Array 
        v.each { |elem| 
         if elem.is_a? Hash 
          elem = remove_dots(elem) 
         end 
         new[ k.gsub('.','_') ] = elem 
        } unless v.nil? 
       end 
      } unless hash.nil? 
      return new 
     end 
    " 
    code => " 
     event.instance_variable_set(:@data,remove_dots(event.to_hash)) 
    " 
    } 
} 

output { 
    stdout { 
    codec => rubydebug 
    } 
    elasticsearch { 
    hosts => "elasticsearch:9200" 
    index => "golab-%{+YYYY.MM.dd}" 
    } 
} 

私はのmutateでフィルタを持っています。インデックス名の一部として使用できるフィールドを追加したいと思います。これを使用すると、角括弧内の内容が文字列として使用されます。"%{[statements][authority][name]}"%{[statements][authority][name]}es_indexフィールドに保存されます。 Logstashはこれが文字列だと思っているようですが、なぜですか?

私はまた、この式を使用しようとしました:"%{statements}"。それは期待どおりに働いています。フィールド文のすべてはes_indexに渡されます。私が"%{[statements][authority]}"を使用する場合、奇妙なことが起こります。 es_indexは、"%{statements}"が生成するのと全く同じ出力で埋められます。私は何が欠けていますか? "%{[statements][authority]}"

Logstash出力:

{ 
    "statements" => { 
      "verb" => { 
       "id" => "http://adlnet.gov/expapi/verbs/answered", 
      "display" => { 
       "en-US" => "answered" 
      } 
     }, 
      "version" => "1.0.1", 
     "timestamp" => "2016-07-21T07:41:18.013880+00:00", 
      "object" => { 
      "definition" => { 
         "name" => { 
        "en-US" => "Example Activity" 
       }, 
       "description" => { 
        "en-US" => "Example activity description" 
       } 
      }, 
        "id" => "http://adlnet.gov/expapi/activities/example" 
     }, 
      "actor" => { 
       "account" => { 
       "homePage" => "http://example.com", 
        "name" => "xapiguy" 
      }, 
      "objectType" => "Agent" 
     }, 
      "stored" => "2016-07-21T07:41:18.013880+00:00", 
     "authority" => { 
        "mbox" => "mailto:[email protected]", 
        "name" => "GoLab", 
      "objectType" => "Agent" 
     }, 
       "id" => "0771b9bc-b1b8-4cb7-898e-93e8e5a9c550" 
    }, 
      "id" => "a7e31874-780e-438a-874c-964373d219af", 
     "@version" => "1", 
    "@timestamp" => "2016-07-21T07:41:19.061Z", 
      "host" => "172.23.0.3", 
     "headers" => { 
       "request_method" => "POST", 
       "request_path" => "/", 
       "request_uri" => "/", 
       "http_version" => "HTTP/1.1", 
        "http_host" => "logstasher:5001", 
       "content_length" => "709", 
     "http_accept_encoding" => "gzip, deflate", 
       "http_accept" => "*/*", 
      "http_user_agent" => "python-requests/2.9.1", 
      "http_connection" => "close", 
       "content_type" => "application/json" 
    }, 
     "es_index" => "{\"verb\":{\"id\":\"http://adlnet.gov/expapi/verbs/answered\",\"display\":{\"en-us\":\"answered\"}},\"version\":\"1.0.1\",\"timestamp\":\"2016-07-21t07:41:18.013880+00:00\",\"object\":{\"definition\":{\"name\":{\"en-us\":\"example_activity\"},\"description\":{\"en-us\":\"example_activity_description\"}},\"id\":\"http://adlnet.gov/expapi/activities/example\",\"objecttype\":\"activity\"},\"actor\":{\"account\":{\"homepage\":\"http://example.com\",\"name\":\"xapiguy\"},\"objecttype\":\"agent\"},\"stored\":\"2016-07-21t07:41:18.013880+00:00\",\"authority\":{\"mbox\":\"mailto:[email protected]\",\"name\":\"golab\",\"objecttype\":\"agent\"},\"id\":\"0771b9bc-b1b8-4cb7-898e-93e8e5a9c550\"}" 
} 

は、あなたがその権威を見ることができるがes_indexの一部です。だからフィールドとして選ばれていませんでした。事前

答えて

2

多くのおかげで私は解決策を見つけました。クレジットはjpcareyに行きます(Elasticsearch Forum

私はcodec => "json"を削除しなければなりませんでした。それは別のデータ構造につながります。 statementsはオブジェクトにはなりません。そこで%{[statements][authority][name]}%{[statements][0][authority][name]}に変更する必要がありました。それは問題なく動作します。

このリンクに従うと、私のmutateフィルタの実装が改善されています。

関連する問題