2017-02-06 5 views
0

Мы хотим реализовать трассировку запроса службы с помощью http-плагина logstash в формате JSON Array.Проблема синтаксического анализа json с logstash

Мы получаем следующее сообщение об ошибке при попытке разобрать массив JSON:

ошибка:

:message=>"gsub mutation is only applicable for Strings, skipping", :field=>"message", :value=>nil, :level=>:debug, :file=>"logstash/filters/mutate.rb", :line=>"322", :method=>"gsub"} 
:message=>"Exception in filterworker", "exception"=>#<LogStash::ConfigurationError: Only String and Array types are splittable. field:message is of type = NilClass> 

Мой массив JSON является:

{ 
    "data": [ 
     { 
      "appName": "DemoApp", 
      "appVersion": "1.1", 
      "deviceId": "1234567", 
      "deviceName": "moto e", 
      "deviceOSVersion": "5.1", 
      "packageName": "com.DemoApp", 
      "message": "testing null pointer exception", 
      "errorLog": "null pointer exception" 
     }, 
     { 
      "appName": "DemoApp", 
      "appVersion": "1.1", 
      "deviceId": "1234567", 
      "deviceName": "moto e", 
      "deviceOSVersion": "5.1", 
      "packageName": "com.DemoApp", 
      "message": "testing illegal state exception", 
      "errorLog": "illegal state exception" 
     } 
    ] 
} 

мой logstash конфигурации является:

input { 
      http { 
      codec => "plain" 
      } 
    } 
    filter{ 
      json { 
        source => "message" 
       } 
      mutate { gsub => [ "message", "},", "shr" ] } 
      split { 
        terminator => "shr" 
        field => "data" 
      } 
    } 
    } 


output { 
stdout { codec => "json" } 
    gelf{ 
     host => localhost 
     facility => "%{type}" 
     level =>["%{SeverityLevel}", "INFO"] 
     codec => "json" 
    } 
     file{ 
     path => "/chroot/result.log" 
} 
} 

Любая помощь будет оценена.

+0

Я думаю, что вы избежите специальных символов в регулярном выражении: 'mutate {gsub => [" message "," \} \, \ r \ n \ r \ n \ {"," \} shr \ {"] } ' – Kadir

+0

@Kadir Я тоже попробовал ваше предложение. Но я все равно получаю те же ошибки. –

ответ

0

В Logstash есть поле метаданных по умолчанию с именем message. Таким образом, ваше поле json message перекрывает это. Рассмотрите возможность изменения json имя поля message другому.

Другой вариант, возможно, с помощью target настройки и ссылки на целевое поле, как:

json { source => "message" target => "data"} 
mutate { gsub => [ "[data][message]", "\}\,\r\n\r\n\{", "\}shr\{" ] } 

Я надеюсь, что это помогает.

+0

@kair также пробовал эту конфигурацию ... по-прежнему получал ту же ошибку. '{: timestamp =>" 2017-02-07T11: 02: 00.192000 + 0530 ",: message =>" мутация gsub применима только для строк, пропусков ",: field =>" [data] [message] ",: value => nil,: level =>: debug,: file =>" logstash/filters/mutate.rb ",: line =>" 322 ",: method =>" gsub "}' –

+0

ok Я теперь можно разделить мои данные .... отредактировали мой конфиг соответственно. Теперь я столкнулся с новой проблемой. Мои поля переименовываются как: ** data_appName ** вместо того, чтобы быть ** appName **. Любое предложение о том, как избежать этого и получить имя поля, которое необходимо. Я попробовал следующее для ее достижения, а также: 'мутировать { переименовани => { "data_appName"=> "APPNAME"} }' Но до сих пор не получил никакого положительного вывода. –

+0

Насколько я знаю 'mutate {rename => {" [data] [appName] "=>" appName "}}' должен работать. Лучше всего переименовать все поля, как указано выше, затем удалить поле ** данных **. 'мутировать { переименовани => [ "[данных] [APPNAME]", "APPNAME", "[данных] [AppVersion]", "AppVersion", \t \t \t \t \t .. \t \t \t \t \t .. ] remove_field => "data" } ' – Kadir

Смежные вопросы