2014-07-11 18 views
10

Tôi đang sử dụng Logstash để phân tích các bản ghi nhật ký. Tôi chủ yếu tập trung để nhận được các bản ghi email bị trả lại từ nhật ký hậu tố và lưu trữ nó trong cơ sở dữ liệu.Nhiều bộ lọc Grok không lưu trữ bản ghi khớp đầu tiên của bộ lọc

Để nhận nhật ký, trước tiên tôi cần phải tìm ID được tạo bằng postfix tương ứng với id thư của tôi và sử dụng Id đó, tôi cần tìm trạng thái của email. Đối với cấu hình sau, tôi có thể nhận nhật ký.

grok { 
     patterns_dir => "patterns" 
     match => [ 
      "message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}", 
      "message", "%{SYSLOGBASE} %{POSTFIXBOUNCE}" 
     ] 
     named_captures_only => true 
    } 

Tôi đang sử dụng sau nếu điều kiện để lưu trữ các bản ghi phù hợp với mô hình:

if "_grokparsefailure" not in [tags] { 
    #database call 
} 

Như bạn đã thấy, tôi đang sử dụng hai mô hình để tìm tương ứng hai bản ghi khác nhau từ một tập tin đăng nhập.

Bây giờ, tôi muốn phân biệt cả mẫu dựa trên thẻ. Vì vậy, tôi đã sửa đổi cấu hình của mình như sau:

grok { 
     patterns_dir => "patterns" 
     match => [ 
      "message", "%{SYSLOGBASE} %{POSTFIXBOUNCE}" 
     ] 
     add_tag => ["BOUNCED"] 
     remove_tag => ["_grokparsefailure"] 
     named_captures_only => true 
    } 

    grok { 
     patterns_dir => "patterns" 
     match => [ 
      "message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}"    
     ] 
     add_tag => ["INTIALIZATION"] 
     remove_tag => ["_grokparsefailure"] 
     named_captures_only => true 
    } 

Bây giờ, nó chỉ lưu trữ nhật ký mẫu% {POSTFIXCLEANUP}. Nếu tôi đảo ngược thứ tự, nó chỉ lưu trữ mẫu% {POSTFIXBOUNCE}.

vì vậy, sau khi loại bỏ điều kiện đó, tôi thấy rằng thư được phân tích cú pháp từ bộ lọc đầu tiên có thẻ "_grokparsefailure" và thẻ lọc đầu tiên và do đó nó không lưu trữ bản ghi đó.

Ai có thể cho tôi biết cần phải làm gì để khắc phục điều này? Tôi có mắc sai lầm gì không?

+0

chắc chắn remove_tag chỉ được thực hiện nếu nó phù hợp với sự kiện, vì vậy đó có thể là vấn đề của bạn – Alcanzar

+0

Vì vậy, tôi cần làm gì để đạt được kết quả mong muốn? –

Trả lời

12

Bạn cần bảo vệ khối grok thứ 2 - nghĩa là không thực thi nó nếu lần đầu tiên thành công.

if ("BOUNCED" not in [tags]) { 
    grok { 
    patterns_dir => "patterns" 
    match => [ 
     "message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}"    
    ] 
    add_tag => ["INTIALIZATION"] 
    remove_tag => ["_grokparsefailure"] 
    named_captures_only => true 
    } 
} 
+0

Cảm ơn người đàn ông. Nó hoạt động như tôi cần. Cảm ơn bạn rất nhiều. –

+7

nếu câu lệnh phải là 'if (" BOUNCED "không có trong [tags]) {}' –

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