2015-02-26 41 views
9

Khi tôi thấy kết quả trong Kibana, tôi thấy rằng không có trường nào từ JSON, hơn thế nữa, trường message chỉ chứa "status" : "FAILED".Logstash không phân tích cú pháp json

Có thể phân tích các trường từ json và hiển thị chúng trong Kibana không? tôi có cấu hình sau:

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

Và sau đây tệp 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"}] 

Trả lời

15

Yes. bạn cần phải thêm một bộ lọc vào cấu hình của bạn, một cái gì đó như thế này.

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

Nó được mô tả khá tốt trong các tài liệu here

EDIT Các codec json dường như không giống như có một mảng thông qua trong một yếu tố duy nhất làm việc với cấu hình này:.

Đầu vào:

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

quả 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" 

}

Bây giờ với một mảng:

Input

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

Kết quả:

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

Điều này giống như một lỗi trong codec, bạn có thể thay đổi thư của mình thành đối tượng thay vì mảng không?

+0

Tôi đã đọc tài liệu này, nhưng bộ lọc không giúp đỡ. Kết quả là như nhau. Theo tôi hiểu, định nghĩa này cho biết: thông báo chứa đối tượng JSON hợp lệ bạn có thể sử dụng làm băm. Thật tuyệt.Nhưng dù sao, tôi vẫn không thấy JSON hợp lệ trong tin nhắn. Chỉ có các bộ phận. – avasin

+1

Tôi nghĩ rằng vấn đề có thể là tin nhắn của bạn là một mảng và các codec json đang mong đợi một đối tượng tại gốc – stringy05

+0

wow, có lẽ chúng tôi có thể báo cáo lỗi này ... Dù sao, bạn đã đúng - bộ lọc là một giải pháp. https://github.com/elasticsearch/logstash/issues/2702 – avasin

2

Thử mã hóa json_lines thay vì json. Điều này phải được thêm gần đây. Trong trường hợp cụ thể của bạn, trước tiên bạn muốn thay đổi đầu ra của bạn từ một danh sách các json thành newson-jimited được phân tách.

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

codec này sẽ giải mã JSON xem trực tiếp được xuống dòng phân cách. Ví dụ, đối với giải mã tải trọng JSON trong đầu vào redis, hãy sử dụng json codec. Mã hóa sẽ phát ra một chuỗi JSON kết thúc bằng một số '\ n'

2

Đọc trong một tệp có chứa một mảng JSON khó hơn. Dưới đây là một cấu hình đường ống làm việc

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

output { 
    stdout { 
    codec => rubydebug 
    } 
} 
Các vấn đề liên quan