2015-10-06 2 views
3

У меня вопрос о JSON в Logstash. У меня есть JSON вход, который выглядит примерно так:Доступ к вложенному значению JSON с именем ключа переменной в Logstash

{ 
"2": { 
     "name": "name2", 
     "state": "state2" 
    }, 

"1": { 
     "name": "name1", 
     "state": "state1" 
    }, 

"0": { 
     "name": "name0", 
     "state": "state0" 
    } 
} 

Теперь, скажем, я хочу, чтобы добавить поле в logstash конфигурации

json{ 
    source => "message" 
    add_field => { 
      "NAME" => "%{ What to write here ?}" 
      "STATE" => "%{ What to write here ?}" 
    } 
} 

Есть ли способ, чтобы получить доступ к Input JSON так что я получаю поле Name со значением name1, другое поле с именем 2 и третье поле с именем 3. Первый ключ в JSON меняется, это означает, что может быть только одна или несколько других частей. Поэтому я не хочу его жестко кодировать, как

%{[0][name]} 

Спасибо за вашу помощь.

ответ

2

Если вы удалите все новые строки на своем входе, вы можете просто использовать json filter. Вам не нужно действие add_field.

Работа конфигурации без новых линий:

filter { 
     json { source => message } 
} 

Если вы не можете удалить новые строки в входе, нужно, чтобы объединить строки с multiline codec.

Работа конфигурации с новыми линиями:

input { 
    file { 
     path => ["/path/to/your/file"] # I suppose your input is a file. 
     start_position => "beginning" 
     sincedb_path => "/dev/null" # just for testing 
     codec => multiline { 
      pattern => "^}" 
      what => "previous" 
      negate => "true" 
     } 
    } 
} 

filter { 
    mutate { replace => { "message" => "%{message}}" } } 
    json { source => message } 
} 

Я полагаю, что вы используете входной файл. Если вы этого не сделаете, просто измените его.

Выход (для обоих):

"2" => { 
    "name" => "name2", 
    "state" => "state2" 
}, 
"1" => { 
    "name" => "name1", 
    "state" => "state1" 
}, 
"0" => { 
    "name" => "name0", 
    "state" => "state0" 
} 
Смежные вопросы