我的日志条目看起来像这样......
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'始终设置好吗?
这有效。有没有更好的办法?
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}]"]
}
}
这是一个更好的方法,已知在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***"
的行才会有elapsedms
和uri
字段。您可以使用子子字段和子子子字段继续使用此逻辑,直到您喜欢的杂草。
我还包括"break_on_match"
语法,以防有用。您可以将其设置为true
或false
。
关键是使用body
字段(或您正在解析的任何字段)作为匹配源而不是message
。
我相信你需要在grok中使用break_on_match
选项并将其设置为false:http://logstash.net/docs/1.4.2/filters/grok#break_on_match