我正在尝试匹配条件筛选器中的子字符串,但似乎不起作用。
我有一个这样的日志:
<30>ddns[21535]: Dynamic DNS update for xxx (Duck DNS) successful我正在尝试匹配日志的ddns部分,因为日志也可以由不同的服务发送。
目前我的过滤器看起来是这样的:过滤器{
if [program] =~ "ddns" {
grok {
match => { "message" => "<%{PROG:syslog_pri}>%{DATA:program}[%{INT:pid}]: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
}
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "yyyy:MM:dd-HH:mm:ss" ]
}
mutate {
replace => [ "@source_host", "sflne01.sarandasnet.local" ]
replace => [ "@message", "%{syslog_message}" ]
remove_field => [ "syslog_message", "syslog_timestamp" ]
}
}我也尝试过使用if [program] =~ /^ddns$/,但没有成功。
已更新配置:
filter {
################
# START IPFIRE #
################
if [host] =~ /172\.16\.0\.1/ {
if [program] =~ /(?:k|kernel)/ {
grok {
match => { "message" => "<%{PROG:syslog_pri}>%{DATA:program}: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
}
}
if [prog] =~ /^ddns$/ {
grok {
match => { "message" => "<%{PROG:syslog_pri}>%{DATA:program}\[%{INT:pid}\]: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
}
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "yyyy:MM:dd-HH:mm:ss" ]
}
mutate {
replace => [ "@source_host", "sflne01.sarandasnet.local" ]
replace => [ "@message", "%{syslog_message}" ]
remove_field => [ "syslog_message", "syslog_timestamp" ]
}
kv {
source => "@message"
}
geoip {
source => "SRC"
target => "geoip"
database => "/etc/logstash/GeoLiteCity.dat"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float"]
}
}
################
# END IPFIRE #
################
}发布于 2016-08-19 18:01:24
我用下面的代码做了有条件的工作:
if [message] =~ /ddns/我认为您必须使用/而不是",这样ddns才能用作正则表达式。
/^ddns$/有一个错误:^锚定在字符串的开头,$锚定在字符串的末尾。所以这个正则表达式唯一匹配的是ddns。如果希望正则表达式与字符串中任意位置的ddns匹配,则必须将两者都删除
https://stackoverflow.com/questions/39034101
复制相似问题