2013-12-11 25 views
1

我的日誌事件是這樣的:groking在logstash嵌套信息

WARN 12 Dec 00:11:12 slow:[Task[Task-Name 20 ms],Task[Task-Name 30 ms]], time = 1234 

這意味着它可以被嵌套有些慢任務記錄。

是否有機會通過Grok過濾器創建任意數量的字段(=記錄每個事件時不同的任務數量)?

或者我應該寫我自己的過濾器,至少我如何訪問這些字段?

回答

1

我發現Logstash在解析像這樣的較少結構的日誌時會遇到麻煩。

您可以提取使用grok with a custom capture pattern串的任務,然後將其轉換爲字符串數組與mutate's split option

filter { 
    grok { 
     match => ["message", "slow:\[(?<tasks>(?:Task\[%{USER} %{NUMBER} ms\],?)+)\]"] 
    } 
    mutate { 
     split => ["tasks", ","] 
    } 
} 

麻煩之後是,有通過所產生的任務的數組沒有直接的辦法grok。根據你需要的數據,這可能是好的。

如果你真的想分析的領域進行這些任務,我能想到的唯一的事情就是提供grok具有多個匹配的候選人,像這樣:

filter { 
    grok { 
     match => [ 
      "message", "slow:\[Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\]\]", 
      "message", "slow:\[Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\]\]", 
      "message", "slow:\[Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\]\]", 
      "message", "slow:\[Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\]\]",    
      "message", "slow:\[Task\[%{USER:name} %{NUMBER:time} ms\]\]" 
     ] 
    } 
} 

由於grok通常會break on match,它將在匹配的第一個模式後停止處理。這會給你平行陣列,nametime