2015-04-23 18 views
9

Tôi đã cài đặt và hoạt động ELK trong máy, nhưng bây giờ tôi muốn thực hiện lọc và thêm trường phức tạp tùy thuộc vào thông báo sự kiện.Thêm các trường tùy thuộc vào thông báo sự kiện trong Logstash không hoạt động

Cụ thể, tôi muốn đặt "id_error" và "descripcio" tùy thuộc vào mẫu tin nhắn.

Tôi đã thử nhiều kết hợp mã trong tệp "logstash.conf", nhưng tôi không thể nhận được hành vi mong đợi.

Ai đó có thể cho tôi biết những gì tôi đang làm sai, những gì tôi phải làm hoặc nếu điều này là không thể? Cảm ơn trước.

này được "logstash.conf" của tôi tập tin, với các thử nghiệm cuối cùng tôi đã thực hiện, dẫn đến có sự kiện nào bị bắt trong Kibana:

input { 
    file { 
     path => "C:\xxx.log" 
    } 
} 

filter { 
    grok { 
     patterns_dir => "C:\elk\patterns" 
     match => [ "message", "%{ERROR2:error2}" ] 
     add_field => [ "id_error", "2" ] 
     add_field => [ "descripcio", "error2!!!" ] 
    } 
    grok { 
     patterns_dir => "C:\elk\patterns" 
     match => [ "message", "%{ERROR1:error1}" ] 
     add_field => [ "id_error", "1" ] 
     add_field => [ "descripcio", "error1!!!" ] 
    } 
    if ("_grokparsefailure" in [tags]) { drop {} } 
} 

output { 
    elasticsearch { 
    host => "localhost" 
    protocol => "http" 
    index => "xxx-%{+YYYY.MM.dd}" 
    } 
} 

Tôi cũng đã thử các mã sau đây, kết quả trong các lĩnh vực "id_error "và" descripcio "với cả hai va chạm" [1,2] "và" [error1 !!!, error2 !!!] "tương ứng, trong mỗi sự kiện phù hợp.

Vì "break_on_match" được đặt "true" theo mặc định, tôi chỉ nhận được các trường phía sau mệnh đề khớp, nhưng điều này không xảy ra.

input { 
    file { 
    path => "C:\xxx.log" 
    } 
} 

filter { 
    grok { 
    patterns_dir => "C:\elk\patterns" 
    match => [ "message", "%{ERROR1:error1}" ] 
    add_field => [ "id_error", "1" ] 
    add_field => [ "descripcio", "error1!!!" ] 
    match => [ "message", "%{ERROR2:error2}" ] 
    add_field => [ "id_error", "2" ] 
    add_field => [ "descripcio", "error2!!!" ] 
    } 
    if ("_grokparsefailure" in [tags]) { drop {} } 
} 

output { 
    elasticsearch { 
    host => "localhost" 
    protocol => "http" 
    index => "xxx-%{+YYYY.MM.dd}" 
    } 
} 
+0

add_field (và add_tag) chỉ chạy khi bộ lọc tự thành công, vì vậy nếu grok {} không khớp với mẫu, trường sẽ không được thêm vào. –

+0

Tôi đã kiểm tra tất cả các mẫu lỗi khác nhau một cách riêng lẻ và tất cả chúng đều thành công, vì vậy đó không phải là vấn đề. – Natsen

+0

Vì vậy, đầu ra của bạn có chứa các trường error1 và error2? –

Trả lời

4

Tôi đã giải quyết được sự cố. Tôi nhận được kết quả mong đợi với mã sau trong "logstash.conf":

input { 
    file { 
    path => "C:\xxx.log" 
    } 
} 

filter { 
    grok { 
    patterns_dir => "C:\elk\patterns" 
    match => [ "message", "%{ERROR1:error1}" ] 
    match => [ "message", "%{ERROR2:error2}" ] 
    } 
    if [message] =~ /error1_regex/ { 
    grok { 
     patterns_dir => "C:\elk\patterns" 
     match => [ "message", "%{ERROR1:error1}" ] 
    } 
    mutate { 
     add_field => [ "id_error", "1" ] 
     add_field => [ "descripcio", "Error1!" ] 
     remove_field => [ "message" ] 
     remove_field => [ "error1" ] 
    } 
    } 
    else if [message] =~ /error2_regex/ { 
    grok { 
     patterns_dir => "C:\elk\patterns" 
     match => [ "message", "%{ERROR2:error2}" ] 
    } 
    mutate { 
     add_field => [ "id_error", "2" ] 
     add_field => [ "descripcio", "Error2!" ] 
     remove_field => [ "message" ] 
     remove_field => [ "error2" ] 
    } 
    } 
    if ("_grokparsefailure" in [tags]) { drop {} } 
} 

output { 
    elasticsearch { 
    host => "localhost" 
    protocol => "http" 
    index => "xxx-%{+YYYY.MM.dd}" 
    } 
} 
Các vấn đề liên quan