2014-02-28 88 views
4

我有一个看起来像这样的日志条目...Logstash:嵌套Grok搜索?将字段解析为多个字段?

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 { 
    match => [ "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- %{GREEDYDATA:body}" ] 
} 

我想解析附加数据如果“身体”以“***请求已完成***”开始,则从“身体”出来。即“elaspsedms”和“uri”。我怎样才能做到这一点?

在其他地方有人建议我添加另一条消息进入这样的神交过滤器...

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

...这个工程,但对于时间线,“体”的价值确实不得到设置。理想情况下,我希望身体总是包含条目的最后部分和iff,条目是一个时间线,执行额外的elapsedms和uri分析。

任何想法,我可以做到这一点?

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

想法?

编辑:如果'elaspedms'被设置,我可以只从'elaspedms'和'uri'创建主体而不是确保'body'总是被设置?

回答

3

This Works。有没有更好的办法?

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