2017-02-06 1 views
0

Nous voulons implémenter la trace de demande de service en utilisant le plugin http de logstash au format JSON Array.Problème d'analyse de tableau json avec logstash

Nous obtenons l'erreur suivante lorsque vous essayez d'analyser le tableau JSON:

erreur:

: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> 

Mon tableau JSON est:

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

ma config logstash est:

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

Toute aide serait appréciée. Logstash possède un champ de métadonnées par défaut, appelé ,

+0

Je pense que vous pourriez échapper des caractères spéciaux dans la regex: 'mutate {gsub => [" message "," \} \, \ r \ n \ r \ n \ {"," \} shr \ {"] } ' – Kadir

+0

@Kadir J'ai essayé votre suggestion ci-dessus aussi .. Mais je reçois toujours les mêmes erreurs. –

Répondre

0

Donc, votre champ json message chevauche cela. Envisager de changer json nom du champ message à l'autre.

L'autre option à l'aide peut-être mise en target et référencer le champ cible comme:

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

J'espère que cela aide.

+0

@kair essayé la configuration ci-dessus ainsi ... toujours obtenir la même erreur. '{: timestamp =>" 2017-02-07T11: 02: 00.192000 + 0530 ",: message =>" La mutation gsub s'applique uniquement aux chaînes, en ignorant ",: field =>" [data] [message] ",: valeur => nil,: niveau =>: déboguer,: fichier =>" logstash/filters/mutate.rb ",: ligne =>" 322 ",: méthode =>" gsub "}' ' –

+0

ok je suis maintenant capable de diviser mes données .... ont édité ma config en conséquence. Je suis maintenant confronté à un nouveau problème. Mes champs sont renommés en tant que: ** nom_application_données ** au lieu d'être simplement ** appName **. Toute suggestion sur la façon d'éviter cela et d'obtenir le nom du champ qui est nécessaire. Je l'ai essayé les éléments suivants pour y parvenir ainsi: 'muter { renommage => { "data_appName"=> "appName"}}' Mais encore obtenu aucune sortie positive. –

+0

Pour autant que je sache 'muter {renommer => {" [données] [appName] "=>" appName "}}' devrait fonctionner. Une meilleure façon est de renommer tous les champs comme ci-dessus puis supprimez le champ ** data **. 'muter { renommage => [ "[données] [appName]", "appName", "[données] [appVersion]", "appVersion", \t \t \t \t \t .. \t \t \t \t \t .. ] remove_field => "données" } ' – Kadir