web-dev-qa-db-fra.com

Comment analyser json dans logstash / grok à partir d'une ligne de fichier texte?

J'ai un fichier journal qui ressemble à ceci (simplifié)

exemple Logline

MyLine data={"firstname":"bob","lastname":"the builder"}

Je voudrais extraire le json contenu dans data et créer deux champs, un pour le prénom, un pour le dernier. Cependant, la sortie que j'obtiens est la suivante:

{"message":"Line data={\"firstname\":\"bob\",\"lastname\":\"the builder\"}\r","@version":"1","@timestamp":"2015-11-26T11:38:56.700Z","Host":"xxx","path":"C:/logstashold/bin/input.txt","MyWord":"Line","parsedJson":{"firstname":"bob","lastname":"the builder"}}

Comme vous pouvez le voir

..."parsedJson":{"firstname":"bob","lastname":"the builder"}}

Ce n'est pas ce dont j'ai besoin, je dois créer des champs pour le prénom et le nom dans kibana, mais logstash n'extrait pas les champs avec le filtre json.

LogStash Config

input {
  file {
        path => "C:/logstashold/bin/input.txt"        
       }
}

filter {     

   grok {
            match => { "message" => "%{Word:MyWord} data=%{GREEDYDATA:request}"}        
        }   

    json{
        source => "request"
        target => "parsedJson"
        remove_field=>["request"]
    }   
}   

output {  
    file{
        path => "C:/logstashold/bin/output.txt"
    }   
}

Toute aide grandement appréciée, je suis sûr que je manque quelque chose de simple

Merci

10
bingbon

Après votre filtre json ajoutez un autre appelé mutate afin d'ajouter les deux champs que vous prendrez dans le champ parsedJson.

filter {
  ...
  json {
     ...
  }
  mutate {
    add_field => {
      "firstname" => "%{[parsedJson][firstname]}"
      "lastname" => "%{[parsedJson][lastname]}"
    }
  }
}

Pour votre exemple de ligne de journal ci-dessus, cela donnerait:

{
       "message" => "MyLine data={\"firstname\":\"bob\",\"lastname\":\"the builder\"}",
      "@version" => "1",
    "@timestamp" => "2015-11-26T11:54:52.556Z",
          "Host" => "iMac.local",
        "MyWord" => "MyLine",
    "parsedJson" => {
        "firstname" => "bob",
         "lastname" => "the builder"
    },
     "firstname" => "bob",
      "lastname" => "the builder"
}
19
Val