2017-03-21 3 views
0

Ich benutze Logstash 5, um eine Datei aufzunehmen, die eine Reihe von JSON-Dokumenten enthält, extrahiere einen Teil jedes Dokuments in jedem Ereignis und schreibe sie in eine andere Datei.Pretty-print JSON-Dokument in Logstash 5

Ich möchte den Ausgang JSON hübsch drucken. Ich fand diesen Thread: How do I pretty-print JSON for an email body in logstash?, der ideal aussah, aber Logstash 5 verhindert jetzt, dass Sie direkt auf Ereignisattribute zugreifen, indem Sie es durch die Methoden event.get und event.set ersetzen (siehe https://www.elastic.co/guide/en/logstash/current/event-api.html).

Ich versuchte, das oben zu konvertieren, wie folgt:

ruby { 
    init => "require 'json'" 
    code => "@pretty_body = JSON.pretty_generate(event.get('body')) 
      event.set('body', @pretty_body) 
      " 
} 

aber

ERROR logstash.filters.ruby - Ruby exception occurred: only generation of JSON objects or arrays allowed 

Was ist der richtige LS5 Äquivalent der oben bekommen?

Antwort

2

Ich glaube, Sie suchen nach folgenden Kriterien:

filter { 
    ruby { 
    init => "require 'json'" 
    code => "event.set('message', JSON.pretty_generate(JSON.parse(event.get('message'))))" 
    } 
} 

Hier ist mein Test und das Ergebnis:

input: {"make_me_pretty":"test"} 
{ 
    "@timestamp" => 2017-03-22T04:56:00.118Z, 
     "@version" => "1", 
     "message" => "{\n \"make_me_pretty\": \"test\"\n}" 
} 
0

Danke @fylie! Ich poste dies als eine andere Antwort, da ich etwas anpassen musste, was ich tat.

Mein Problem war, dass das Eingabedokument ein JSON-Dokument ist, das in ein anderes JSON-Dokument eingeschlossen ist. Das innere Dokument ist also ein Feld im äußeren Dokument, das Metadaten enthält. Also "Nachricht" enthält mehr als ich in die Datei schreiben möchte.

Ich war auf dem Versuch, das Dokument zu reduzieren, was ich nur wollte, indem Sie das innere doc-Feld mit dem JSON-Filter bis zur obersten Ebene zu analysieren, alles andere zu entfernen, und dann pretty-printing was übrig blieb. So hatte ich nichts mehr im Ruby-Filter zu verwenden.

Um das zu beheben, behalte ich alles, analysiere das innere doc-Feld nicht mit dem json-Filter, sondern drucke es stattdessen mit dem Ruby-Filter und gebe nur das Feld {format =>% {fieldname }} Option im Dateiausgabe-Plugin, und es funktioniert wie gewünscht.