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?
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
Ich denke, das Problem könnte sein, dass Ihre Nachricht ein Array ist und der JSON-Codec erwartet ein Objekt an der Wurzel – stringy05
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