2015-02-26 11 views
9

Wenn ich Ergebnisse in Kibana sehe, sehe ich, dass es keine Felder von JSON gibt, mehr über, message Feld enthält nur "status" : "FAILED".Logstash analysiert nicht json

Kann man Felder von json analysieren und in Kibana anzeigen? Ich habe folgende Konfiguration:

input { 
    file { 
    type => "json" 
    path => "/home/logstash/test.json" 
    codec => json 
    sincedb_path => "/home/logstash/sincedb" 
    } 
} 

output { 
    stdout {} 
    elasticsearch { 
    protocol => "http" 
    codec => "json" 
    host => "elasticsearch.dev" 
    port => "9200" 
    } 
} 

Und Datei folgende JSON:

[{"uid":"441d1d1dd296fe60","name":"test_buylinks","title":"Testbuylinks","time":{"start":1419621623182,"stop":1419621640491,"duration":17309},"severity":"NORMAL","status":"FAILED"},{"uid":"a88c89b377aca0c9","name":"test_buylinks","title":"Testbuylinks","time":{"start":1419621623182,"stop":1419621640634,"duration":17452},"severity":"NORMAL","status":"FAILED"},{"uid":"32c3f8b52386c85c","name":"test_buylinks","title":"Testbuylinks","time":{"start":1419621623185,"stop":1419621640826,"duration":17641},"severity":"NORMAL","status":"FAILED"}] 

Antwort

15

Ja. Sie müssen einen Filter zu Ihrer Konfiguration hinzufügen, so etwas.

filter{ 
    json{ 
     source => "message" 
    } 
} 

Es ist beschrieben ziemlich gut in der Dokumentation here

EDIT Der json Codec scheint nicht wie ein Array übergeben, die ein einzelnes Element arbeitet mit dieser config:.

Input:

{"uid":"441d1d1dd296fe60","name":"test_buylinks","title":"Testbuylinks","time":{"start":1419621623182,  "stop":1419621640491,"duration":17309  },  "severity":"NORMAL",  "status":"FAILED" } 

Logstash Ergebnis:

{ 
     "message" => "{\"uid\":\"441d1d1dd296fe60\",\"name\":\"test_buylinks\",\"title\":\"Testbuylinks\",\"time\":{\"start\":1419621623182,  \"stop\":1419621640491,\"duration\":17309  },  \"severity\":\"NORMAL\",  \"status\":\"FAILED\" }", 
    "@version" => "1", 
    "@timestamp" => "2015-02-26T23:25:12.011Z", 
     "host" => "emmet.local", 
      "uid" => "441d1d1dd296fe60", 
     "name" => "test_buylinks", 
     "title" => "Testbuylinks", 
     "time" => { 
      "start" => 1419621623182, 
      "stop" => 1419621640491, 
     "duration" => 17309 
    }, 
    "severity" => "NORMAL", 
     "status" => "FAILED" 

}

Jetzt mit einem Array:

Eingangs

[{"uid":"441d1d1dd296fe60","name":"test_buylinks","title":"Testbuylinks","time":{"start":1419621623182,  "stop":1419621640491,"duration":17309  },  "severity":"NORMAL",  "status":"FAILED" }, {"uid":"441d1d1dd296fe60","name":"test_buylinks","title":"Testbuylinks","time":{"start":1419621623182,  "stop":1419621640491,"duration":17309  },  "severity":"NORMAL",  "status":"FAILED" }] 

Ergebnis:

Trouble parsing json {:source=>"message", :raw=>"[{\"uid\":\"441d1d1dd296fe60\",\"name\":\"test_buylinks\",\"title\":\"Testbuylinks\",\"time\":{\"start\":1419621623182,  \"stop\":1419621640491,\"duration\":17309  },  \"severity\":\"NORMAL\",  \"status\":\"FAILED\" }, {\"uid\":\"441d1d1dd296fe60\",\"name\":\"test_buylinks\",\"title\":\"Testbuylinks\",\"time\":{\"start\":1419621623182,  \"stop\":1419621640491,\"duration\":17309  },  \"severity\":\"NORMAL\",  \"status\":\"FAILED\" }]", :exception=>#<TypeError: can't convert Array into Hash>, :level=>:warn} 
{ 
     "message" => "[{\"uid\":\"441d1d1dd296fe60\",\"name\":\"test_buylinks\",\"title\":\"Testbuylinks\",\"time\":{\"start\":1419621623182,  \"stop\":1419621640491,\"duration\":17309  },  \"severity\":\"NORMAL\",  \"status\":\"FAILED\" }, {\"uid\":\"441d1d1dd296fe60\",\"name\":\"test_buylinks\",\"title\":\"Testbuylinks\",\"time\":{\"start\":1419621623182,  \"stop\":1419621640491,\"duration\":17309  },  \"severity\":\"NORMAL\",  \"status\":\"FAILED\" }]", 
    "@version" => "1", 
    "@timestamp" => "2015-02-26T23:28:21.195Z", 
     "host" => "emmet.local", 
     "tags" => [ 
     [0] "_jsonparsefailure" 
    ] 
} 

Das sieht wie ein Fehler im Codec aus, können Sie Ihre Nachrichten in ein Objekt und nicht in ein Array ändern?

+0

Ich habe diese Dokumentation gelesen, aber Filter hat nicht geholfen. Das Ergebnis ist das gleiche. Wie ich verstehe, sagt diese Definition: Nachricht enthält gültiges JSON-Objekt, das Sie als Hash verwenden können. Es ist schön.Aber ich sehe immer noch keine gültige JSON in der Nachricht. Nur Teile. – avasin

+1

Ich denke, das Problem könnte sein, dass Ihre Nachricht ein Array ist und der JSON-Codec erwartet ein Objekt an der Wurzel – stringy05

+0

wow, vielleicht können wir dies einen Fehler melden ... Wie auch immer, Sie hatten Recht - Filter ist eine Lösung. https://github.com/elasticsearch/logstash/issues/2702 – avasin

2

Versuchen Sie den json_lines Codec anstelle von json. Dies muss kürzlich hinzugefügt worden sein. In Ihrem speziellen Fall möchten Sie zuerst Ihre Ausgabe von einer Liste von JSON in Newline-getrennte JSON ändern.

http://logstash.net/docs/1.4.0/codecs/json_lines

Dieser Codec wird gestreamten JSON dekodieren, die Neue-Zeile begrenzt wird. Für Dekodierung JSON-Nutzdaten in der Redis-Eingabe zum Beispiel, verwenden Sie stattdessen den JSON Codec. Codierung wird eine einzelne JSON Zeichenfolge endet in einem emittieren ‚\ n‘

2

Lesen in einer Datei, die eine JSON Array enthalten ist viel schwieriger, als es sein sollte. Unten ist eine funktionierende Pipeline-Konfiguration

input { 
    exec { 
    command => "cat /path/file_containing_json_array.txt" 
    codec => "json" 
    interval => 3600 
    } 
} 

output { 
    stdout { 
    codec => rubydebug 
    } 
} 
Verwandte Themen