_grokparsefailure 匹配成功

_grokparsefailure on successful match

我开始使用 logstash 来管理系统日志。为了测试它,我从远程机器发送简单的消息并尝试用 logstash 解析它们。

唯一的 Logstash 配置,通过命令行使用:

input {
        syslog {
                type => syslog
                port => 5514
        }
}

filter {
        grok {
                match =>  { "message" => "hello %{WORD:who}" }
                }
      }

output {
        stdout { }
        elasticsearch {
                host => "elk.example.com"
                cluster => "security"
                protocol => "http"
        }
}

我确实收到了日志并且它们被正确解析(生成了 who 字段)。同时,tags包含_grokparsefailure.

我发送的测试日志是hello rambo3。我认为是

2015-01-29T09:27:48.344+0000 10.242.136.232 <13>1 2015-01-29T10:27:48.113612+01:00 AA1.example.com testlog.txt - - - hello rambo3

grok 调试器也同意:

为什么要将 _grokparsefailure 添加到标签中?

有趣的是,通过纯 tcp 发送的相同数据被相同的过滤器正确解析(_grokparsefailure 不在标签中)

_grokparsefailure 不是由您自己的过滤器 grok 添加的。当您使用 syslog 输入时,系统日志格式必须遵循 RFC3164, as mentioned in here.

一般来说,Syslog输入会解析日志并添加相应的field,如log severity。因此,其中有一个 grok 动作。但是,您从远程服务器发送的日志是 RFC 5424 格式。所以,logstash无法解析日志然后添加_grokparsefailure标签。