Décomposer le message Logstash json en champs

il a un logfile qui stocke l'événement avec un horodatage et un message json. Par exemple:

timestamp {"foo": 12," bar": 13}

je voudrais décomposer les touches (foo et bar) dans la partie json en champs dans la sortie Logstash.

je suis conscient que je peux définir le champ format dans le filtre de fichier Logstash à json_event mais dans ce cas je dois inclure le timestamp dans json. Il y a aussi un filtre json, mais qui ajoute un simple champ avec la structure complète de données json, au lieu d'utiliser les clés.

avez-vous des idées sur la façon de procéder?

17
demandé sur Maurits Rijk 2013-08-08 17:05:27

4 réponses

essayez le dernier logstash 1.2.1 et utilisez la valeur codec pour analyser les événements json directement.

input {
    file {
        type => "tweetfile"
        path => ["/home/nikhil/temp/feed/*.txt"]
        codec => "json"
    }
}
filter{
    json{
        source => "message"
        target => "tweet"
    }
}
output {
    stdout { }
    elasticsearch { embedded => true }
}
16
répondu Nikhil S 2014-07-09 16:47:56

j'ai fait cela avec la config suivante:

filter {
  grok {
    match => ["message", "\[%{WORD}:%{LOGLEVEL}\] %{TIMESTAMP_ISO8601:tstamp} :: %{GREEDYDATA:msg}"]
  }
  date {
    match => [ "tstamp", "yyyy-MM-dd HH:mm:ss" ]
  }
  json {
    source => "msg"
  }
}

soit dit en passant, ceci est une configuration pour la nouvelle version 1.2.0.

Dans la version 1.1.13 vous devez inclure un cible sur le filtre json et la référence pour message dans le grok filtre @message.

10
répondu mimes70 2013-09-07 02:32:39

Vous pouvez simplement utiliser brut Analyser des filtres (regex style filters/patterns) et assignez la valeur correspondante dans une variable pour faciliter l'organisation, le filtrage et la recherche.

Un exemple:

((?<foo_identifier>(\"foo\"))):((?<foo_variable_value>(\d+,)))

quelque chose dans ce sens.

GrokDebugger pour aider si vous êtes coincé sur la syntaxe, les modèles et les choses que vous pensez devrait être apparié mais ne sont pas.

j'Espère que cela vous aide un peu.

1
répondu Adam 2013-08-08 14:34:55

votre JSON est faux {"foo": 12, "bar" 13}

devrait être:

{"foo": 12, "bar": 13}

-3
répondu Jeryl Cook 2014-06-16 08:30:07