2014-02-28 138 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