2013-08-08 33 views
17

Có một tệp nhật ký lưu trữ sự kiện bằng dấu thời gian và thông báo json. Ví dụ:Phân chia thông điệp json Logstash vào các trường

timestamp { "foo": 12, "bar": 13}

Tôi muốn để phân hủy các phím (foo và bar) ở phần json vào các lĩnh vực trong Logstash đầu ra.

Tôi biết rằng tôi có thể đặt trường định dạng trong bộ lọc tệp nhật ký thành json_event nhưng trong trường hợp đó tôi phải bao gồm dấu thời gian trong json. Ngoài ra còn có một bộ lọc json, nhưng có thêm một trường duy nhất với cấu trúc dữ liệu json hoàn chỉnh, thay vì sử dụng các khóa.

Bất kỳ ý tưởng nào về cách thực hiện điều này?

+0

Bạn definetely nên cung cấp cho một cố gắng để @ câu trả lời Nikhil-S'. Ngoài ra, bạn cũng có thể sử dụng bộ lọc kv http://logstash.net/docs/1.4.1/filters/kv – Aldian

Trả lời

1

Bạn chỉ có thể sử dụng đồng bằng Grok filters (bộ lọc/kiểu phong cách regex) và gán giá trị khớp vào biến để tổ chức, lọc và tìm kiếm dễ dàng.

Một ví dụ:

((?<foo_identifier>(\"foo\"))):((?<foo_variable_value>(\d+,))) 

Something dọc theo những đường.

Sử dụng GrokDebugger để trợ giúp nếu bạn gặp khó khăn về cú pháp, mẫu và những thứ bạn cho là phù hợp nhưng không.

Hy vọng rằng sẽ giúp ích một chút.

+2

Tôi đã xem xét tùy chọn đó, nhưng hy vọng rằng sẽ dễ dàng phân tích cấu trúc json và tự động dịch các khóa tên trường. –

10

Tôi đã làm điều này với các cấu hình sau:

filter { 
    grok { 
    match => ["message", "\[%{WORD}:%{LOGLEVEL}\] %{TIMESTAMP_ISO8601:tstamp} :: %{GREEDYDATA:msg}"] 
    } 
    date { 
    match => [ "tstamp", "yyyy-MM-dd HH:mm:ss" ] 
    } 
    json { 
    source => "msg" 
    } 
} 

Bằng cách này, đây là một cấu hình cho phiên bản mới 1.2.0.

Trong phiên bản 1.1.13 bạn cần bao gồm một mục tiêu trên bộ lọc json và tài liệu tham khảo cho nhắn trong bộ lọc grok@message.

16

Dùng thử phiên bản mới nhất 1.2.1 và sử dụng giá trị codec để phân tích cú pháp sự kiện json trực tiếp.

input { 
    file { 
     type => "tweetfile" 
     path => ["/home/nikhil/temp/feed/*.txt"] 
     codec => "json" 
    } 
} 
filter{ 
    json{ 
     source => "message" 
     target => "tweet" 
    } 
} 
output { 
    stdout { } 
    elasticsearch { embedded => true } 
} 
+0

Điều gì xảy ra với trường dấu thời gian khi việc này được thực hiện? – antak

-3

JSON của bạn là sai {"foo": 12, "bar" 13}

nên là:

{"foo": 12, "bar": 13}

+1

Bạn nên thêm nhận xét cho câu hỏi và không đăng câu trả lời, đó là lý do tại sao bạn bị giảm giá. Bạn có lẽ sẽ nhận được một số upvotes và không downvotes sau đó. –

Các vấn đề liên quan