2015-05-18 17 views
26

Tôi có các tệp nhật ký đến trong ngăn xếp ELK. Tôi muốn sao chép một trường (foo) để thực hiện các đột biến khác nhau trên nó, Tuy nhiên trường (foo) không phải lúc nào cũng hiện diện.kiểm tra nhật ký nếu trường tồn tại

Nếu foo không tồn tại, sau đó thanh vẫn được tạo ra, nhưng được gán chuỗi chữ "%{foo}"

Làm thế nào tôi có thể thực hiện một đột biến chỉ nếu một lĩnh vực tồn tại?

Tôi đang cố gắng làm một việc như thế này.

if ["foo"] { 
    mutate { 
    add_field => "bar" => "%{foo} 
    } 
} 

Trả lời

26

"foo" là chuỗi ký tự bằng chữ.

[foo] là một trường.

# technically anything that returns 'true', so good for numbers and basic strings: 
if [foo] { 
} 

# contains a value 
if [foo] =~ /.+/ { 
} 
+4

Có vẻ như điều này sẽ hiệu quả, nhưng có lỗi này nếu trường ['foo'] là một boolean. https://github.com/elastic/logstash/issues/1867 – spuder

+0

Ví dụ sau không hoạt động đối với các số (Logstash 1.5.4). – Newerth

51

Để kiểm tra nếu trường foo tồn tại:

1) Đối với các trường kiểu số sử dụng:

if ([foo]) { 
    ... 
} 

2) Đối với các loại khác ngoài số như boolean, sử dụng chuỗi:

if ("" in [foo]) { 
    ... 
} 
+0

đây là một giải pháp khá thanh lịch. Rất trực quan – alfredocambera

+4

Ngoài ra, nó có thể được phủ nhận như thế này: 'if! (" "Trong [foo]) {...}' – worldsayshi

+0

tôi sẽ upvote +2 nếu tôi có thể. cám ơn! –

11

Trên Logstash 2.2.2, cấu trúc ("" in [field]) dường như không hoạt động đối với tôi.

if ![field] { } 

, cho trường không phải là số.

+0

+1 Điều này làm việc tốt hơn cho tôi với Logstash 6.1.2. Ký hiệu '" "trong [trường]' thực sự cho kết quả gián đoạn lẻ – darkwing

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