web-dev-qa-db-fra.com

Utilisation de JSON avec LogStash

Je sors de mon esprit ici. J'ai une application qui écrit des journaux dans un fichier. Chaque entrée de journal est un objet JSON. Un exemple de mon fichier .json ressemble à ceci:

{"Property 1":"value A","Property 2":"value B"}
{"Property 1":"value x","Property 2":"value y"}

J'essaie désespérément d'obtenir les entrées de journal dans LogStash. Pour tenter de le faire, j'ai créé le fichier de configuration LogStash suivant:

input {
  file {
    type => "json"
    path => "/logs/mylogs.log"
    codec => "json"
  }
}
output {
  file {
    path => "/logs/out.log"
  }
}

En ce moment, j'ajoute manuellement des enregistrements à mylogs.log pour essayer de le faire fonctionner. Cependant, ils apparaissent étrangement dans la sortie standard. Lorsque je regarde open out.log, je vois quelque chose comme ceci:

{"message":"\"Property 1\":\"value A\", \"Property 2\":\"value B\"}","@version":"1","@timestamp":"2014-04-08T15:33:07.519Z","type":"json","Host":"ip-[myAddress]","path":"/logs/mylogs.log"}

Pour cette raison, si j'envoie le message à ElasticSearch, je ne reçois pas les champs. Au lieu de cela, je reçois un désordre brouillé. J'ai besoin que mes propriétés soient toujours des propriétés. Je ne veux pas qu'ils soient entassés dans la partie message ou la sortie. J'ai un pressentiment que cela a quelque chose à voir avec les codecs. Pourtant, je n'en suis pas sûr. Je ne sais pas si je devrais changer le codec sur la configuration d'entrée logstash. Ou, si je devais changer l'entrée sur la configuration de sortie. J'apprécierais sincèrement toute aide car je suis désespéré à ce stade.

Merci.

29
user70192

Essayez de supprimer le codec json et d'ajouter un filtre json

input {
  file {
    type => "json"
    path => "/logs/mylogs.log"
  }
}
filter{
    json{
        source => "message"
    }
}
output {
  file {
    path => "/logs/out.log"
  }
}

vous n'avez pas besoin du codec json car vous ne voulez pas décoder le JSON source mais vous voulez filtrer l'entrée pour obtenir les données JSON dans le champ @message uniquement.

J'espère que cela t'aides.

37
vzamanillo

Par défaut, TCP place tout dans le champ message si le codec json n'est pas spécifié.

Une solution de contournement à _ jsonparsefailure du champ de message après avoir spécifié le codec json peut également être corrigée en procédant comme suit:

input {
  tcp {
    port => '9563'
  }
}
filter{
  json{
    source => "message"
    target => "myroot"
  }
  json{
    source => "myroot"
  }

}
output {
    elasticsearch {
      hosts => [ "localhost:9200" ]
    }
}

Il analysera le champ du message dans la chaîne json appropriée pour le champ myroot, puis myroot est analysé pour produire le json.

Nous pouvons supprimer le champ redondant comme message as

filter {
  json {
    source => "message"
    remove_field => ["message"]
  }
}
11
Tinkal Gogoi