Problème pour parser un fichier JSON à l'aide de Logstash


(Benjamin Carriou) #1

Bonjour à tous !

Étant novice sous ELK, merci d'être gentil avec moi :wink:

Je souhaite parser un fichier JSON sous Logstash pour l'indéxer dans ElasticSearch.
Ce fichier est sous la forme suivante:
https://itunes.apple.com/FR/rss/customerreviews/id=525006323/sortBy=mostRecent/json

Voici mon input et filter:

#######################################
############ INPUT SECTION ############
#######################################

input {
  file {
    type => "MappyGPS"
    path => "/opt/scraping-IOS/Mappy.json"
    codec => "json"
    start_position => "beginning"
    codec => multiline {
           pattern => "^{"
           negate => "true"
           what => "previous"
    }
    sincedb_path => "/dev/null"
  }
}

#######################################
########### FILTER SECTION ############
#######################################

filter
{
    mutate
    {
        replace => [ "message", "%{message}" ]
        gsub => [ 'message','\n','']
    }
    if [message] =~ /^{.*}$/
    {
        json { source => message }
    }

}

mais j'ai le message suivant:

{
       "message" => "{\"attributes\":{\"rel\":\"previous\", \"href\":\"https://itunes.apple.com/fr/rss/customerreviews/page=1/id=525006323/sortby=mostrecent/xml?urlDesc=/customerreviews/id=525006323/sortBy=mostRecent/json\"}}, ",
          "tags" => [
        [0] "_jsonparsefailure"
    ],

Merci d'avance pour votre aide :wink:


(David Pilato) #2

Je suis surpris que LS accepte deux codecs.
A mon avis l'un doit écraser l'autre.

En fait, je pense qu'il faut seulement utiliser le codec json.
Il y a le code json_lines aussi mais il est fait pour le cas où tu as un JSON sur une seule ligne, si je comprends bien.


(Benjamin Carriou) #3

Bonjour David et merci de ta réponse.
En fait, j'ai d'autres fichiers JSON qui sont eux, sur une même ligne.
Du coup, j'utilise ceci:

#######################################
############ INPUT SECTION ############
#######################################

input {
  file {
    type => "CandyCrushSodaSaga"
    path => "/opt/scraping-GPS/apps_info_json/CandyCrushSaga.json"
    codec => "json"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

#######################################
########### FILTER SECTION ############
#######################################

filter
{
    mutate
    {
        replace => [ "message", "%{message}" ]
        gsub => [ 'message','\n','']
    }
    if [message] =~ /^{.*}$/
    {
        json { source => message }
    }

}

Je ne sais pas si le code est propre mais ça marche :wink:


(David Pilato) #4

Donc du coup ? Ca marche pour ton premier cas ?


#5

Bonjour,

J'ai actuellement le même problème, or quand je met

codec => "json"

J'ai un message d'erreur qui s'affiche lorsque je lance logstash, et dès que je change "codec => "json"" le problème n'est plus là mais j'ai toujours le "_jsonparsefailure"

Comment puis-je faire ?


(David Pilato) #6

Ouvre une nouvelle question et poste toutes les informations comme un exemple de fichier en entrée, la configuration...

"Ca marche pas" n'est pas vraiment suffisant pour t'aider.


(system) #7