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

在Logstash过滤器中使用多个grok模式的正确方法是什么?,logstash,logstash-grok,Logstash,Logstash Grok,这两个选项的有效日志存储配置是什么 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}%{

这两个选项的有效日志存储配置是什么

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}" ]
  }

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

相比之下,两者的性能几乎相同,因为的默认值为
true

break\u on\u match

  • 值类型为布尔值
  • 默认值为true
在第一场比赛中破发。grok的第一次成功匹配将导致>过滤器完成。如果您希望grok尝试所有模式(可能您正在解析不同的东西),那么将其设置为false

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

filter {
   grok {
     match => [ "message", "PATTERN1", "PATTERN2" ]
    }
}

请同时参考此答案,

第一种方法更好。它将尝试不同的模式,直到找到匹配;如果没有找到匹配项,您将得到一个错误标记。另一方面,第二种方法将尝试匹配两次,第一次可能成功,第二次可能失败,因此您将有一个错误标签。您就是那个人。当我尝试匹配两个不同的属性时,我没有注意到break_on_match,每个属性都有一个grok表达式。