首页 文章

Logstash grok匹配2种模式

提问于
浏览
0

日志行示例:

2017-05-04 10:37:22,972 INFO [My.Super.JAVA.CLASS] Outbound Message bla bla
2017-05-04 10:38:22,972 INFO [My.Super.JAVA.CLASS] Inbound Message bla bla
2017-05-04 10:39:22,972 INFO [My.Super.JAVA.CLASS] some other bla bla

我想做的是制作3种模式,每种模式一种 . 所以这就是我做的:

"message", '(?m)%{DATE_TIME:timestamp}\s*%{LOGLEVEL:level}\s*\[%{JAVACLASS:class}\]\s*Outbound Message%{GREEDYDATA:stuff}']
"message", '(?m)%{DATE_TIME:timestamp}\s*%{LOGLEVEL:level}\s*\[%{JAVACLASS:class}\]\s*Inbound Message%{GREEDYDATA:otherstuff}']
"message", '(?m)%{DATE_TIME:timestamp}\s*%{LOGLEVEL:level}\s*\[%{JAVACLASS:class}\]\s*%{GREEDYDATA:messageInfo}'

以第一个日志消息为例,它将与第一个和第三个模式匹配,显然是因为GREEDYDATA部分 . 我的问题是,如何让前两个消息只匹配前两个模式(比如,从第三个模式中排除它们)?

更新(已解决):我在grok中使用了'if' . 每当我匹配一个模式时,我都会添加一个标签'grokked',然后,我测试'grokked'是否在标签中,如果不是,我匹配第二个模式等等...更多详情:https://discuss.elastic.co/t/grok-with-conditional-patterns-and-adding-a-tag/43844/2

1 回答

  • 0

    我会用流利的方式代替logstash . 但回到主题:寻找你的共同点并避免它 . 另一种选择是添加标签:

    filter {
       grok {
         add_tag => [ "foo_%{somefield}" ]
            }
           }
    

    要么:

    filter {
     grok {
      match => { "message" => "%{SYSLOGBASE} %{DATA:message}" }
       overwrite => [ "message" ]
           }
         }
    

相关问题