2016-07-21 2 views
0

У меня проблема с доступом к вложенному полю JSON в logstash (последняя версия).Доступ к вложенному полю JSON в Logstash

Мой конфигурационный файл выглядит следующим образом:

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}" 
    } 
} 

У меня есть фильтр с мутировать. Я хочу добавить поле, которое я могу использовать как часть имени индекса. Когда я использую это "%{[statements][authority][name]}", содержимое в скобках используется как строка. %{[statements][authority][name]} сохраняется в поле es_index. Кажется, что Logstash думает, что это строка, но почему?

Я также попытался использовать это выражение: "%{statements}". Он работает, как и ожидалось. Все в полевых операциях передается es_index. Если я использую "%{[statements][authority]}", то случаются странные вещи. es_index заполнен тем же самым результатом, который производит "%{statements}". Что мне не хватает?

Logstash Выход с "%{[statements][authority]}":

{ 
    "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.