logstash配置中的负regexp

logstash配置中的负regexp,logstash,Logstash,我无法使负regexp表达式在LogStash中工作(如中所述) 考虑以下正正则表达式,它可以正确地检测已赋值的字段: if [remote_ip] =~ /(.+)/ { mutate { add_tag => ["ip"] } } 但是,即使字段为空,否定表达式似乎也返回false: if [remote_ip] !~ /(.+)/ { mutate { add_tag => ["no_ip"] } } 我误解了这个用法吗 更新-这是我的模糊思维。我的配置文件

我无法使负regexp表达式在LogStash中工作(如中所述)

考虑以下正正则表达式,它可以正确地检测已赋值的字段:

if [remote_ip] =~ /(.+)/ {
    mutate { add_tag => ["ip"] }
}
但是,即使字段为空,否定表达式似乎也返回false:

if [remote_ip] !~ /(.+)/ {
    mutate { add_tag => ["no_ip"] }
}
我误解了这个用法吗


更新-这是我的模糊思维。我的配置文件有问题。如果配置文件的其余部分是正常的,那么上面的应该可以工作。

下面是我的配置。类型字段不存在,因此,负表达式返回true

input {
    stdin {
    }
}

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

output {
    stdout {debug => true}
}

regexp/(.+)/表示它接受所有内容,包括blank。因此,当“type”字段存在时,即使字段值为空,它也满足regexp。因此,在您的示例中,如果远程ip字段存在,您的“否定表达式”将始终返回false。

这是我的模糊想法-我的配置文件的其余部分存在问题

基于Ben 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。

谢谢您的帮助-这让我的想法清晰了。不幸的是,您似乎将(+++)与(+.*)混淆了。+至少需要一个字符,而*接受任意数量的字符(包括空白)。我的回复中包含了这两个字段。要查看字段是否存在,只需使用
if[fieldName]{…}
即可,如果不存在,则使用
if![fieldName]{…}