2015-02-26 8 views
9

Quando vedo risultati in Kibana, vedo che non ci sono campi da JSON, più oltre, il campo message contiene solo "status" : "FAILED".Logstash non analizza json

E 'possibile analizzare i campi da JSON e mostrarli a Kibana? Ho seguente configurazione:

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

E seguente file 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"}] 

risposta

15

Sì. devi aggiungere un filtro alla tua configurazione, qualcosa di simile.

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

E 'descritto molto bene nella documentazione here

EDIT Il codec JSON non sembra come avere una matrice passata in un unico elemento funziona con questa configurazione:.

ingresso:

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

Risultato Logstash:

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

}

Ora con una matrice:

ingresso

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

Risultato:

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

Sembra un errore nel codec, è possibile modificare i messaggi su un oggetto anziché su un array?

+0

Ho letto questo documento, ma il filtro non ha aiutato. Il risultato è lo stesso. Come ho capito, questa definizione dice: il messaggio contiene un oggetto JSON valido che puoi usare come hash. È bello.Ma comunque, non vedo ancora JSON valido nel messaggio. Solo parti. – avasin

+1

Penso che il problema potrebbe essere che il tuo messaggio è un array e il codec json si aspetta un oggetto nella radice – stringy05

+0

wow, forse possiamo segnalare un bug ... Comunque, avevi ragione - il filtro è una soluzione. https://github.com/elasticsearch/logstash/issues/2702 – avasin

2

Provare il codec json_lines anziché json. Questo deve essere stato aggiunto di recente. Nel tuo caso particolare, prima dovresti cambiare il tuo output da un elenco di json a json delimitato da newline.

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

Questo codec decodifica JSON streaming che è delimitato nuova riga. Per il carico utile JSON di decodifica nell'input redis, ad esempio, utilizzare invece il codec json . Codifica emetterà una singola stringa JSON che termina in una '\ n'

2

lettura in un file contenente una matrice JSON è il modo più difficile di quanto dovrebbe essere. Di seguito è una configurazione pipeline di lavoro

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

output { 
    stdout { 
    codec => rubydebug 
    } 
}