4

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

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”中解析更多数据。即“esaspsedms”和“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' 的值没有设置。理想情况下,我希望正文始终包含条目的最后一部分,并且当条目是时间线时,执行 elapsedms 和 uri 的附加解析。

任何想法我怎么能做到这一点?

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

想法?

编辑:如果设置了“elaspedms”,我是否可以只从“elaspedms”和“uri”创建主体,而不是确保始终设置“body”?

4

3 回答 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}]"] 
    }
}
于 2014-02-28T14:25:38.897 回答
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.

于 2015-12-01T19:11:15.417 回答
0

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

于 2014-12-05T11:22:17.190 回答