2014-04-08 27 views
24

Tôi sẽ hết tâm trí ở đây. Tôi có một ứng dụng ghi nhật ký vào một tệp. Mỗi mục nhật ký là một đối tượng JSON. Ví dụ về tệp .json của tôi trông giống như sau:Sử dụng JSON với LogStash

{"Property 1":"value A","Property 2":"value B"} 
{"Property 1":"value x","Property 2":"value y"} 

Tôi đang cố gắng hết sức để có được các mục nhập nhật ký vào LogStash. Để thực hiện việc này, tôi đã tạo tệp cấu hình LogStash sau:

input { 
    file { 
    type => "json" 
    path => "/logs/mylogs.log" 
    codec => "json" 
    } 
} 
output { 
    file { 
    path => "/logs/out.log" 
    } 
} 

Ngay bây giờ, tôi đang thêm bản ghi thủ công vào mylogs.log để thử và làm cho nó hoạt động. Tuy nhiên, chúng xuất hiện kỳ ​​quặc trong stdout. Khi tôi nhìn mở ra.log, tôi thấy một cái gì đó như sau:

{"message":"\"Property 1\":\"value A\", \"Property 2\":\"value B\"}","@version":"1","@timestamp":"2014-04-08T15:33:07.519Z","type":"json","host":"ip-[myAddress]","path":"/logs/mylogs.log"} 

Vì điều này, nếu tôi gửi thư đến ElasticSearch, tôi không nhận được các trường. Thay vào đó tôi nhận được một mớ hỗn độn lộn xộn. Tôi cần tài sản của tôi để vẫn là tài sản. Tôi không muốn họ nhồi nhét vào phần tin nhắn hoặc đầu ra. Tôi có linh cảm, điều này có liên quan đến Codec. Tuy nhiên, tôi không chắc chắn. Tôi không chắc chắn nếu tôi nên thay đổi codec trên cấu hình đầu vào logstash. Hoặc, nếu tôi nên thay đổi đầu vào trên cấu hình đầu ra. Tôi xin chân thành cảm kích sự giúp đỡ khi tôi đang tuyệt vọng vào thời điểm này.

THanks.

Trả lời

30

Hãy thử loại bỏ các json codec và thêm một json filter

input { 
    file { 
    type => "json" 
    path => "/logs/mylogs.log" 
    } 
} 
filter{ 
    json{ 
     source => "message" 
    } 
} 
output { 
    file { 
    path => "/logs/out.log" 
    } 
} 

bạn không cần codec json vì bạn không muốn giải mã JSON nguồn nhưng bạn muốn lọc đầu vào để có được những dữ liệu JSON trong @message trường chỉ.

Hy vọng điều này sẽ hữu ích.

+1

ngọt! Điều đó hiệu quả. Ngoại trừ, nó không giúp tôi vượt qua được JSON thực sự của tôi: (Tôi sẽ cho bạn tín dụng cho câu trả lời. Tôi đã mở một câu hỏi phụ tại http://stackoverflow.com/questions/22944168/json-variants-log4j- with-logstash – user70192

+0

Tuyệt vời! Tôi sẽ xem xét sau nhé Chúc mừng! – vzamanillo

+1

Xin chào! Tôi đã sử dụng tệp cấu hình logstash này 'đầu vào {tcp {port =>' 9563 '}} đầu ra bộ lọc {json {source => "message"}} {elasticsearch {hosts => ["localhost: 9200"]}} 'nhưng vẫn trong tìm kiếm đàn hồi, json của tôi được đặt dưới dạng chuỗi trong trường tin nhắn là _'message:" {\ "container \": \ "DOCKER \", \ "msg \": \ "Từ python 26 oct \"} "' _. Tôi không thể nhận _'container'_ và _'msg'_ là trường khác trong kibana. Tôi có trường bổ sung này trong kibana nói _tags: json của tôi là _ {"container": "DOCKER", "msg": "Từ python 26 oct"} _ –

5

Theo mặc định, tcp đặt mọi thứ vào trường thông báo nếu mã json không được chỉ định.

Một workaround để _jsonparsefailure của trường tin nhắn sau khi chúng tôi xác định các codec json cũng có thể được sửa chữa bằng cách làm như sau:

input { 
    tcp { 
    port => '9563' 
    } 
} 
filter{ 
    json{ 
    source => "message" 
    target => "myroot" 
    } 
    json{ 
    source => "myroot" 
    } 

} 
output { 
    elasticsearch { 
     hosts => [ "localhost:9200" ] 
    } 
} 

Nó sẽ phân tích lĩnh vực thông điệp tới chuỗi json thích hợp để trường myroot và sau đó myroot được phân tích cú pháp để tạo ra json.

Chúng ta có thể loại bỏ các lĩnh vực không cần thiết như nhắn như

filter { 
    json { 
    source => "message" 
    remove_field => ["message"] 
    } 
} 
Các vấn đề liên quan