Logstash:嵌套的grok搜索?将字段解析为多个字段?

问题描述 投票:4回答:3

我的日志条目看起来像这样......

2014-02-25 00:00:03,936 INFO  - something happened...bla bla bla
2014-02-25 00:00:03,952 INFO  - ***Request Completed*** [   78.002] mS [http://cloud.mydomain.local/schedule/search?param=45]
2014-02-25 00:00:04,233 INFO  - something else happened...bla bla bla

我有一个正确解析行的grok过滤器...

grok {
    match => [ "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- %{GREEDYDATA:body}" ]
}

如果'body'以“*** Request Completed ***”开头,我想解析'body'之外的其他数据。即'elaspsedms'和'uri'。我怎样才能做到这一点?

在其他地方,有人建议我向grok过滤器添加另一个消息条目,如下所示......

grok {
    match => [ 
              "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- \*\*\*Request Completed\*\*\* \[%{SPACE}%{NUMBER:elaspedms}\] mS \[%{URI:uri}\]",
              "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- %{GREEDYDATA:body}"
             ]
}

...这是有效的,但对于时序线,'body'的值不会被设置。理想情况下,我希望body始终包含条目的最后一部分,iff,条目是一个时间线,执行额外的elapsed和uri解析。

我有什么想法可以做到这一点?

有没有办法解析字段?这样我就可以尝试将'body'解析为elapsed / uri,如果失败,继续。或者有没有办法在grok表达式中嵌套字段匹配?

思考?

编辑:如果设置'elaspedms',我可以从'elaspedms'和'uri'创建body,而不是确保'body'始终设置好吗?

parsing logstash logstash-grok
3个回答
3
投票

这有效。有没有更好的办法?

grok {
   match => [ 
          "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- \*\*\*Request Completed\*\*\* \[%{SPACE}%{NUMBER:elaspedms}\] mS \[%{URI:uri}\]",
          "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- %{GREEDYDATA:body}"
         ]
}

# if body is NOT set (timing line) make one
if ![body] {
    mutate { 
        add_field => [ "body", "***Request Completed*** [%{elapsedms}] mS [%{uri}]"] 
    }
}

1
投票

这是一个更好的方法,已知在Logstash 1.5.3中工作:

grok {
   match => [ 
          "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- %{GREEDYDATA:body}"
         ]
}

# if body is set (which should always be true, but it's good to check anyway)
if [body] {
    grok {
       break_on_match => true
       match => [ 
          "body", "\*\*\*Request Completed\*\*\* \[%{SPACE}%{NUMBER:elaspedms}\] mS \[%{URI:uri}\]"
         ]
    }
}

这样,每个记录都有一个body字段,但只有包含"***Request Completed***"的行才会有elapsedmsuri字段。您可以使用子子字段和子子子字段继续使用此逻辑,直到您喜欢的杂草。

我还包括"break_on_match"语法,以防有用。您可以将其设置为truefalse

关键是使用body字段(或您正在解析的任何字段)作为匹配源而不是message


0
投票

我相信你需要在grok中使用break_on_match选项并将其设置为false:http://logstash.net/docs/1.4.2/filters/grok#break_on_match

© www.soinside.com 2019 - 2024. All rights reserved.