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