通过 Grok Debugger 获取 Logstash _grokparsefailure 不会抛出任何错误
Getting Logstash _grokparsefailure though Grok Debugger throws no errors
我尝试使用 logstash 和 grok 解析 Check Point 防火墙 Syslog 日志。
日志条目示例:
<190>2015 Mar 19 12:40:55 fw1 <60031> User admin failed to login (wrong authentication) (Source IP:123.123.123.123 Via:HTTP)
我使用这个模式:
<%{POSINT:syslog_pri}>%{YEAR} %{SYSLOGTIMESTAMP:syslog_timestamp} %{DATA:device} <%{POSINT:status}> User %{WORD:account} %{DATA:msg} (?:[(])%{DATA:msg1}(?:[)]) (?:[(])Source IP:%{IPV4:src} Via:%{WORD:protocol}(?:[)])
所有字段都被很好地解析并显示在 elasticsearch/kibana 中。 Grok Debugger 与这个特定的 log/pattern 组合配合得很好。但是,我不断收到 _grokparsefailure 标签。有没有人提示如何摆脱它们?
更新:这是我完整的 logstash 配置(最相关的部分是 "Failed login" 块):
input {
syslog {
type => "syslog"
port => 514
}
}
filter {
if [type] == "syslog" {
geoip { source => "host" }
# Firewall rule fired
if [message] =~ "packet" {
grok {
match => [ "message", "<%{POSINT:syslog_pri}>%{YEAR} %{SYSLOGTIMESTAMP:syslog_timestamp} %{DATA:device} <%{POSINT:status}> %{WORD:activity} %{DATA:inout} (?:[(])%{DATA:msg}(?:[)]) Src:%{IPV4:src} SPort:%{POSINT:sport} Dst:%{IPV4:dst} DPort:%{POSINT:dport} IPP:%{POSINT:ipp} Rule:%{INT:rule} Interface:%{WORD:iface}" ]
}
}
# Failed login
else if [message] =~ "failed" {
grok {
match => [ "message", "<%{POSINT:syslog_pri}>%{YEAR} %{SYSLOGTIMESTAMP:syslog_timestamp} %{DATA:device} <%{POSINT:status}> User %{WORD:account} %{DATA:msg} (?:[(])%{DATA:msg1}(?:[)]) (?:[(])Source IP:%{IPV4:src} Via:%{WORD:protocol}(?:[)])" ]
}
}
# Successful login/out
else if [message] =~ "logged" {
mutate {
add_field => [ "userlogged", "%{host}" ]
}
grok {
match => [ "message", "<%{POSINT:syslog_pri}>%{YEAR} %{SYSLOGTIMESTAMP:syslog_timestamp} %{DATA:device} <%{POSINT:status}> User %{DATA:account} %{WORD} %{WORD:action} (?:[(])Source IP:%{IPV4:src} Via:%{WORD:protocol}(?:[)])" ]
}
}
else {
grok {
match => [ "message", "<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" ]
}
}
}
}
output {
elasticsearch {
host => "localhost"
protocol => "http"
}
}
似乎 _grokparsefailure 是由内部也使用 grok 的输入插件 "syslog" 抛出的。用
替换输入块后
input {
tcp {
port => 514
type => syslog
}
udp {
port => 514
type => syslog
}
}
我没有再收到失败消息。
This blog post对我帮助很大
我收到这个错误是因为我的 filter
块是在 input
块之前声明的。
我尝试使用 logstash 和 grok 解析 Check Point 防火墙 Syslog 日志。
日志条目示例:
<190>2015 Mar 19 12:40:55 fw1 <60031> User admin failed to login (wrong authentication) (Source IP:123.123.123.123 Via:HTTP)
我使用这个模式:
<%{POSINT:syslog_pri}>%{YEAR} %{SYSLOGTIMESTAMP:syslog_timestamp} %{DATA:device} <%{POSINT:status}> User %{WORD:account} %{DATA:msg} (?:[(])%{DATA:msg1}(?:[)]) (?:[(])Source IP:%{IPV4:src} Via:%{WORD:protocol}(?:[)])
所有字段都被很好地解析并显示在 elasticsearch/kibana 中。 Grok Debugger 与这个特定的 log/pattern 组合配合得很好。但是,我不断收到 _grokparsefailure 标签。有没有人提示如何摆脱它们?
更新:这是我完整的 logstash 配置(最相关的部分是 "Failed login" 块):
input {
syslog {
type => "syslog"
port => 514
}
}
filter {
if [type] == "syslog" {
geoip { source => "host" }
# Firewall rule fired
if [message] =~ "packet" {
grok {
match => [ "message", "<%{POSINT:syslog_pri}>%{YEAR} %{SYSLOGTIMESTAMP:syslog_timestamp} %{DATA:device} <%{POSINT:status}> %{WORD:activity} %{DATA:inout} (?:[(])%{DATA:msg}(?:[)]) Src:%{IPV4:src} SPort:%{POSINT:sport} Dst:%{IPV4:dst} DPort:%{POSINT:dport} IPP:%{POSINT:ipp} Rule:%{INT:rule} Interface:%{WORD:iface}" ]
}
}
# Failed login
else if [message] =~ "failed" {
grok {
match => [ "message", "<%{POSINT:syslog_pri}>%{YEAR} %{SYSLOGTIMESTAMP:syslog_timestamp} %{DATA:device} <%{POSINT:status}> User %{WORD:account} %{DATA:msg} (?:[(])%{DATA:msg1}(?:[)]) (?:[(])Source IP:%{IPV4:src} Via:%{WORD:protocol}(?:[)])" ]
}
}
# Successful login/out
else if [message] =~ "logged" {
mutate {
add_field => [ "userlogged", "%{host}" ]
}
grok {
match => [ "message", "<%{POSINT:syslog_pri}>%{YEAR} %{SYSLOGTIMESTAMP:syslog_timestamp} %{DATA:device} <%{POSINT:status}> User %{DATA:account} %{WORD} %{WORD:action} (?:[(])Source IP:%{IPV4:src} Via:%{WORD:protocol}(?:[)])" ]
}
}
else {
grok {
match => [ "message", "<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" ]
}
}
}
}
output {
elasticsearch {
host => "localhost"
protocol => "http"
}
}
似乎 _grokparsefailure 是由内部也使用 grok 的输入插件 "syslog" 抛出的。用
替换输入块后input {
tcp {
port => 514
type => syslog
}
udp {
port => 514
type => syslog
}
}
我没有再收到失败消息。 This blog post对我帮助很大
我收到这个错误是因为我的 filter
块是在 input
块之前声明的。