我試圖匹配我的條件篩選器中的一個子字符串,但它似乎不工作。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