2014-02-26 109 views
3

(如the docs描述)我不能讓內LogStash工作負正則表達式表達負的正則表達式

考慮其工作正常,檢測已分配的值字段中輸入以下積極的正則表達式:

if [remote_ip] =~ /(.+)/ { 
    mutate { add_tag => ["ip"] } 
} 

然而,陰性表達似乎返回false,即使該字段爲空:

if [remote_ip] !~ /(.+)/ { 
    mutate { add_tag => ["no_ip"] } 
} 

我誤解用法?

更新 - 這是我的模糊思維。有我的配置文件的問題。如果你的配置文件的其餘部分是理智的,上面的應該可以工作。

+0

要查看一個字段是否存在,只需使用if [fieldName] {...}',如果不存在if [[fieldName] {...}' – Chro

回答

1

這是我的模糊思維 - 我的配置文件的其餘部分有問題。

根據本Lim的例子,我想出了一個輸入更易於測試:

input { 
    stdin { } 
} 

filter { 
    if [message] !~ /(.+)/ { 
     mutate { add_tag => ["blank_message"] } 
    } 
    if [noexist] !~ /(.+)/ { 
     mutate { add_tag => ["tag_does_not_exist"] } 
    } 
} 

output { 
    stdout {debug => true} 
} 

爲空白消息輸出是:

{ 
     "message" => "", 
     "@version" => "1", 
    "@timestamp" => "2014-02-27T01:33:19.285Z", 
      "host" => "benchmark.example.com", 
      "tags" => [ 
     [0] "blank_message", 
     [1] "tag_does_not_exist" 
    ] 
} 

的輸出與消息內容 「測試消息」 是:

test message 
{ 
     "message" => "test message", 
     "@version" => "1", 
    "@timestamp" => "2014-02-27T01:33:25.059Z", 
      "host" => "benchmark.example.com", 
      "tags" => [ 
     [0] "tag_does_not_exist" 
    ] 
} 

因此, 「負正則表達式」僅當該字段爲空或該字段不存在時,纔會返回true。

負面正則表達式/(.*)/只會在該字段不存在時返回true。如果該字段存在(無論是否爲空值),返回值將爲false。

1

下面是我的配置。類型字段不存在,因此,否定表達式返回true。

input { 
    stdin { 
    } 
} 

filter { 
    if [type] !~ /(.+)/ { 
     mutate { add_tag => ["aa"] } 
    } 
} 

output { 
    stdout {debug => true} 
} 

的正則表達式/(.+)/意味着它接受一切,包括空白。因此,當「類型」字段存在時,即使字段值爲空,它也符合正則表達式。因此,在您的示例中,如果remote_ip字段存在,則您的「否定表達式」將始終返回false。

+0

感謝您的幫助 - 它清除了我的想法。不幸的是,你似乎將(。+)與(。*)混淆。 A +需要至少一個字符,而*接受任意數量的字符(包括空白)。我在我的回覆中都包含了這兩個字。 –