2015-02-26 15 views
9

Kiedy widzę wyniki w Kibana, widzę, że nie ma pól z JSON, więcej niż, message zawiera tylko pole "status" : "FAILED".Logstash nie parsuje json

Czy można analizować pola z json i pokazywać je w Kibana? Mam następujące config:

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

oraz po pliku 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"}] 

Odpowiedz

15

Tak. musisz dodać filtr do swojej konfiguracji, coś takiego.

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

Jest opisane dość dobrze w docs here

EDYCJA Kodek json nie wydaje się podoba posiadające tablicę podjęta w pojedynczy element współpracuje z tej konfiguracji.

Wejście:

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

Logstash Wynik:

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

}

Teraz z tablicą:

wejścia

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

Wynik:

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

To wygląda jak błąd w kodeku, czy możesz zmienić swoje wiadomości na obiekt, a nie tablicę?

+0

Czytałem te dokumenty, ale filtr nie pomógł. Wynik jest taki sam. Jak rozumiem, ta definicja mówi: wiadomość zawiera poprawny obiekt JSON, który możesz użyć jako hasha. Fajnie.W każdym razie nadal nie widzę prawidłowego komunikatu JSON w komunikacie. Tylko części. – avasin

+1

Myślę, że problemem może być to, że twoja wiadomość jest tablicą, a kodek json oczekuje obiektu w katalogu głównym – stringy05

+0

wow, może uda nam się zgłosić ten błąd ... W każdym razie miałeś rację - filtr jest rozwiązaniem. https://github.com/elasticsearch/logstash/issues/2702 – avasin

2

Wypróbuj kodek json_lines zamiast json. To musiało zostać dodane niedawno. W twoim przypadku, chcesz najpierw zmienić swój wynik z listy json na json.

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

Kodek dekoduje transmisjami JSON, który jest rozdzielany nowej linii. Na przykład dla dekodowania ładunku JSON na wejściu redis, na przykład, użyj zamiast niego kodeka json . Kodowanie wyda pojedynczy łańcuch JSON kończącą w „\ n”

2

czytanie w pliku zawierającego tablicę JSON jest sposobem trudniejsze niż być powinno. Poniżej znajduje się działająca konfiguracja potoku:

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

output { 
    stdout { 
    codec => rubydebug 
    } 
}