我试图匹配我的条件筛选器中的一个子字符串,但它似乎不工作。Logstash条件不匹配
我有一个日志是这样的:
<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 #
################
}
您的字段程序中包含什么内容?您是否使用日志的值创建了该字段?如果不是,那么该字段不存在,条件将始终为假。 – baudsp
此外,它不是在你的问题,但你的grok过滤器有一个问题,'['和']'必须用\像这样转义:'\ ['和'\]' – baudsp
@baudsp我已经添加完整配置。我只关心ddns部分,其余部分工作。 – rhillhouse