在 Logstash 过滤器中拥有多个 grok 模式的正确方法是什么?

Den*_*nis 2 logstash logstash-grok

这两个选项的有效 logstash 配置是什么?

else if [pipeline] == "tomcat_all" {
  grok {
    match => [ "message", "%{MONTH}%{SPACE}%{MONTHDAY},%{SPACE}%{YEAR}%{SPACE}%{HOUR}:?%{MINUTE}(?::?%{SECOND})%{SPACE}(?:AM|PM)%{SPACE}%{NOTSPACE:class}%{SPACE}%{NOTSPACE:type_log}%{SPACE}%{WORD:loglevel}:%{SPACE}%{GREEDYDATA:log_text}" ]
    match => [ "message", "%{TIME:timestamp}%{SPACE}\|-%{WORD:loglevel}%{SPACE}in%{SPACE}%{NOTSPACE:class}%{SPACE}%{GREEDYDATA:log_text}" ]

...

else if [pipeline] == "123" {
  grok {
    match => [ "message", "%{MONTH}%{SPACE}%{MONTHDAY},%{SPACE}%{YEAR}%{SPACE}%{HOUR}:?%{MINUTE}(?::?%{SECOND})%{SPACE}(?:AM|PM)%{SPACE}%{NOTSPACE:class}%{SPACE}%{NOTSPACE:type_log}%{SPACE}%{WORD:loglevel}:%{SPACE}%{GREEDYDATA:log_text}" ]
  }
  grok {
    match => [ "message", "%{TIME:timestamp}%{SPACE}\|-%{WORD:loglevel}%{SPACE}in%{SPACE}%{NOTSPACE:class}%{SPACE}%{GREEDYDATA:log_text}" ]
  }
Run Code Online (Sandbox Code Playgroud)

Logstash 似乎在两种配置下都可以正常启动并且没有报告错误,但是对于多个 grok 模式,grok 解析还不能正常工作。

Suf*_*ori 5

相比较而言,两者几乎同样表现,因为默认值break_on_matchtrue

break_on_match

  • 值类型是布尔值
  • 默认值为真

第一场比赛破门。grok 的第一次成功匹配将导致 > 过滤器完成。如果您希望 grok 尝试所有模式(也许您正在解析不同的内容),请将其设置为 false。

您的第一个模式可以进一步简化如下,

filter {
   grok {
     match => [ "message", "PATTERN1", "PATTERN2" ]
    }
}
Run Code Online (Sandbox Code Playgroud)

也请参阅此答案,一个日志中的多个模式