2017-02-06 10 views
0

logstash의 http 플러그인을 사용하여 서비스 요청 추적을 JSON Array 형식으로 구현하려고합니다.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의 설정은 다음과 같습니다

우리는 JSON 배열을 구문 분석하려고 시도 할 때 다음과 같은 오류를 얻고있다

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

@ 카디르 나는 당신의 위의 제안을 시도했다. 그러나 나는 여전히 같은 실수를하고있다. –

답변

0

Logstash에는 메시지이라는 기본 메타 데이터 필드가 있습니다. 그래서 귀하의 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 => : 디버그, : file =>"logstash/filters/mutate.rb ", : line =>"322 ", : method =>"gsub "} –

+0

내 데이터를 분할 할 수있게되었습니다 .... 그에 따라 내 설정을 편집했습니다. 나는 지금 새로운 문제에 직면하고있다. 내 필드의 이름이 ** app_Name **이 아닌 ** data_appName **으로 변경됩니다. 이 문제를 피하고 필요한 필드 이름을 얻는 방법에 대한 제안. 나는뿐만 아니라 그것을 달성하기 위해 다음 밖으로 시도 : ' 돌연변이 { 이름 변경 => { "data_appName을"=> "프로그램 응용"} }' 그러나 여전히 긍정적 인 결과를 얻지 않았다. –

+0

'mutate {rename => { "[data] [appName]"=> "appName"}}'이 제대로 작동해야한다는 것을 알고 있습니다. 더 좋은 방법은 위의 모든 필드의 이름을 바꾸고 ** 데이터 ** 필드를 제거하는 것입니다. '개의 mutate { 바꾸기 => [ "[데이터] 프로그램 응용]", "프로그램 응용" "[데이터] appVersion]", "appVersion" \t \t \t \t \t을 .. \t \t \t \t \t .. ] remove_field => "data" } – Kadir