我试图匹配条件过滤器中的子字符串,但它似乎不起作用。
我有这样的日志:
<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 #
################
}
答案 0 :(得分:1)
我使用这个进行了有条件的工作:
if [message] =~ /ddns/
我认为您必须使用/
而不是"
,以便将ddns
用作正则表达式。
/^ddns$/
出现错误:字符串开头的^
锚点和结尾的$
。所以这个正则表达式唯一匹配的是ddns
。如果您希望正则表达式在字符串
ddns
,则必须同时删除这两者