2014-04-08 11 views
24

Ich bin hier verrückt. Ich habe eine App, die Protokolle in eine Datei schreibt. Jeder Protokolleintrag ist ein JSON-Objekt. Ein Beispiel für meine .json Datei sieht wie folgt aus:Verwenden von JSON mit LogStash

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

Ich versuche verzweifelt die Log-Einträge in LogStash zu bekommen. In einem Versuch, dies zu tun, habe ich die folgende LogStash Konfigurationsdatei erstellt:

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

Gerade jetzt, ich bin Aufzeichnungen manuell hinzufügen, es zu versuchen zu mylogs.log und erhalten zu arbeiten. Sie erscheinen jedoch merkwürdig in der Standardausgabe. Wenn ich offen out.log anschaue, sehe ich etwas wie folgt aus:

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

Aus diesem Grund, wenn ich die Nachricht an Elasticsearch schicken, ich habe nicht die Felder bekommen. Stattdessen bekomme ich ein Durcheinander. Ich brauche meine Eigenschaften, um immer noch Eigenschaften zu sein. Ich möchte nicht, dass sie in den Nachrichtenteil oder die Ausgabe gepackt werden. Ich habe eine Ahnung, dass dies etwas mit Codecs zu tun hat. Aber ich bin mir nicht sicher. Ich bin mir nicht sicher, ob ich den Codec in der logstash Eingabekonfiguration ändern sollte. Oder, wenn ich die Eingabe an der Ausgabekonfiguration ändern sollte. Ich würde jede Hilfe sehr schätzen, da ich an dieser Stelle verzweifelt bin.

THanks.

Antwort

30

Versuchen Sie, die json codec Entfernen und Hinzufügen eines json filter

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

Sie nicht den json-Codec, weil Sie nicht die Quelle JSON entschlüsseln wollen, aber Sie wollen die Eingabe filtern, um die JSON-Daten in der @message zu erhalten nur Feld.

Hoffe, das hilft.

+1

Süße entfernen! Das hat funktioniert. Außer, es hat mir nicht geholfen, an meinem echten JSON vorbeizukommen :(. Ich gebe dir Anerkennung für die Antwort. Ich habe eine zweite Frage unter http://stackoverflow.com/questions/22944168/json-variants-log4j- with-logstash – user70192

+0

Sehr gut! Ich werde später einen Blick darauf werfen Cheers. – vzamanillo

+1

Hallo! Ich habe diese Logstash-Konfigurationsdatei 'Eingang {tcp {Port => '9563'}} Filter {Json {Quelle =>" Nachricht "}} ausgegeben {elasticsearch {hosts => ["localhost: 9200"]}} 'aber immer noch in der elastischen Suche mein json wird als eine Zeichenfolge im Nachrichtenfeld als _' Nachricht: "{\" Container \ ": \" DOCKER \ ", \ "msg \": \ "Von python 26 oct \"} "' _. Ich bin nicht in der Lage, _ 'container'_ und _'msg'_ als anderes Feld in kibana zu erhalten. Ich habe dieses zusätzliche Feld in kibana und sagt _tags: _jsonparsefailure_. Mein json ist _ {"container": "DOCKER", "msg": "Von python 26 okt"} _ –

5

Standardmäßig tcp alles auf Nachrichtenfeld, wenn JSON-Codec nicht angegeben.

Eine Abhilfe zu _jsonparsefailure des Nachrichtenfeldes, nachdem wir auch, indem Sie die folgende behoben kann die json Codec angeben werden:

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

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

Es Nachrichtenfeld, um einen ordnungsgemäßen JSON-String analysiert Feld myRoot und Dann wird Myroot analysiert, um den JSON zu erhalten.

Wir können die redundante Feld wie Nachricht als

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