2015-04-22 3 views
0

Я пытаюсь разобрать JSON-файл от Keen.io с помощью logstash в elasticsearch. Расположение и отметка времени сохраняются в параметрах, как это:Интерпретировать местоположения из файла Keen.io JSON в logstash filter

{ 
    "result": 
    [ 
    { 
     "keen": 
     { 
     "timestamp": "2014-12-02T12:23:51.000Z", 
     "created_at": "2014-12-01T23:25:31.396Z", 
     "id": "XXXX", 
     "location": 
     { 
      "coordinates": [-95.8, 36.1] 
     } 
     } 
    } 
    ] 
} 

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

input { 
    file { 
    path => ["test.json"] 
    start_position => beginning 
    type => json 
    } 
} 

filter { 
    json { 
    source => message 
    remove_field => message 
    } 
} 

output { 
    stdout { codec => rubydebug } 
} 

Как я могу разобрать «метку» и «местоположение» поля таким образом, они используются для @timestamp и @ geoip.координаты в Elasticsearch?

Обновление: Я пробовал варианты этого без везения. Документация очень проста - я не понимаю, как обращаться с полями JSON? Есть ли способ добавить отладочный вывод, чтобы помочь? Я пробовал How to debug the logstash file plugin и Print a string to stdout using Logstash 1.4?, но не работает.

filter { 
    json { 
    source => message 
    remove_field => message 
    } 
    if ("[result][0][keen][created_at]") { 
    date { 
     add_field => [ "[timestamp]", "[result][0][keen][created_at]" ] 
     remove_field => "[result][0][keen][created_at]" 
    } 
    } 

Update 2:

Дата сейчас работает, еще нужно, чтобы получить место рабочей.

filter { 
    json { 
    source => message 
    remove_field => message 
    add_tag => ["valid_json"] 
    } 
    if ("valid_json") { 
    if ("[result][0][keen][created_at]") { 
     date { 
     match => [ "[result][0][keen][created_at]", "ISO8601" ] 
     } 
    } 
    } 
} 
+1

Я не думаю, что 'add_field' является правильным, вам понадобится' update_field', потому что поле timestamp уже существует. Во всяком случае, он вообще переходит в часть 'if (...)'? Добавьте тег где-нибудь там, чтобы узнать. –

+0

Но 'update_field' не существует? Хорошая идея по тегу, было интересно, для чего они нужны. – parsley72

+1

Что вам нужно, это атрибут 'match' фильтра' date', например 'filter { date { match => [" [result] [0] [keen] [created_at] "," MMM dd YYYY HH: mm: ss "] } }' –

ответ

0

поле Keen.io в «created_at» хранится в ISO 8601 format и поэтому может быть легко разобран даты фильтра. Локальные/длинные координаты можно установить, скопировав существующие координаты Keen.io в массив geoip.coordinates logstash.

input { 
    file { 
    path => ["data.json"] 
    start_position => beginning 
    type => json 
    } 
} 

filter { 
    json { 
    source => message 
    remove_field => message 
    add_tag => ["valid_json"] 
    } 
    if ("valid_json") { 
    if ("[result][0][keen][created_at]") { 
     date { 
     # Set @timestamp to Keen.io's "created_at" field 
     match => [ "[result][0][keen][created_at]", "ISO8601" ] 
     } 
    } 
    if ("[result][0][keen][location][coordinates]") { 
     mutate { 
     # Copy existing co-orndiates into geoip.coordinates array 
     add_field => [ "[geoip][coordinates]", "%{[result][0][keen][location][coordinates][0]}" ] 
     add_field => [ "[geoip][coordinates]", "%{[result][0][keen][location][coordinates][1]}" ] 
     remove_field => "[result][0][keen][location][coordinates]" 
     } 
    } 
    } 
} 

output { 
    stdout { codec => rubydebug } 
} 
Смежные вопросы