【发布时间】:2016-08-19 08:08:18
【问题描述】:
我正在尝试匹配条件过滤器中的子字符串,但它似乎不起作用。
我有这样的日志:
<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 #
################
}
【问题讨论】:
-
您的现场计划中有什么?您是否使用日志的值创建了该字段?如果不存在,则该字段不存在,条件始终为 false。
-
另外,这不是你的问题,但你的 grok 过滤器有问题,
[和]必须像这样用 \ 转义:\[和\] -
@baudsp 我已经添加了完整的配置。我只关心 ddns 部分,其余部分有效。
-
谢谢。
prog应该是什么值?
标签: logstash-grok elastic-stack logstash-configuration