grok 正則捕獲
grok 是 logstash 最重要的外掛程式。你可以在 grok 裡預定義好命名正規表示式,在稍後(grok引數或者其他正規表示式裡)引用它。
正規表示式語法
運維工程師多多少少都會一點正則。你可以在 grok 裡寫標準的正則,像下面這樣:
\s+(?\d+(?:\.\d+)?)\s+
小貼士:這個正規表示式寫法對於 perl 或者 ruby 程式設計師應該很熟悉了,python 程式設計師可能更習慣寫 (?ppattern),沒辦法,適應一下吧。
現在給我們的配置檔案新增第乙個過濾器區段配置。配置要新增在輸入和輸出區段之間(logstash 執行區段的時候並不依賴於次序,不過為了自己看得方便,還是按次序書寫吧):
input }
filter }
執行 logstash 程序然後輸入 "begin 123.456 end",你會看到類似下面這樣的輸出:
"message" => "begin 123.456 end",
"@version" => "1",
"@timestamp" => "2014-08-09t11:55:38.186z",
"host" => "raochenlindemacbook-air.local",
"request_time" => "123.456"
漂亮!不過資料型別好像不太滿意……request_time 應該是數值而不是字串。
我們已經提過稍後會學習用 logstash::filters::mutate 來轉換字段值型別,不過在 grok 裡,其實有自己的魔法來實現這個功能!
grok 表示式語法
注意:在新版本的logstash裡面,pattern目錄已經為空,最後乙個commit提示core patterns將會由logstash-patterns-core gem來提供,該目錄可供使用者存放自定義patterns
下面是從官方檔案中摘抄的最簡單但是足夠說明用法的示例:
username [a-za-z0-9._-]+
user %
第一行,用普通的正規表示式來定義乙個 grok 表示式;第二行,通過列印賦值格式,用前面定義好的 grok 表示式來定義另乙個 grok 表示式。
grok 表示式的列印複製格式的完整語法是下面這樣的:
%小貼士:data_type 目前只支援兩個值:int 和 float。
所以我們可以改進我們的配置成下面這樣:
filter % %"
重新執行程序然後可以得到如下結果:
"message" => "begin 123.456 end",
"@version" => "1",
"@timestamp" => "2014-08-09t12:23:36.634z",
"host" => "raochenlindemacbook-air.local",
"request_time" => 123.456
這次 request_time 變成數值型別了。
最佳實踐
實際運用中,我們需要處理各種各樣的日誌檔案,如果你都是在配置檔案裡各自寫一行自己的表示式,就完全不可管理了。所以,我們建議是把所有的 grok 表示式統一寫入到乙個地方。然後用 filter/grok 的 patterns_dir 選項來指明。
如果你把 "message" 裡所有的資訊都 grok 到不同的字段了,資料實質上就相當於是重複儲存了兩份。所以你可以用 remove_field 引數來刪除掉 message 字段,或者用 overwrite 引數來重寫預設的 message 字段,只保留最重要的部分。
重寫引數的示例如下:
filter %"
overwrite => ["message"]
小貼士多行匹配
在和 codec/multiline 搭配使用的時候,需要注意乙個問題,grok 正則和普通正則一樣,預設是不支援匹配回車換行的。就像你需要 =~ //m 一樣也需要單獨指定,具體寫法是在表示式開始位置加 (?m) 標記。如下所示:
match => %",
"message", "(?m)%"
logstash 會按照這個定義次序依次嘗試匹配,到匹配成功為止。雖說效果跟用 | 分割寫個大大的正則是一樣的,但是可閱讀性好了很多。
最後也是最關鍵的,我強烈建議每個人都要使用 grok debugger 來除錯自己的 grok 表示式。
Linux網路子系統中鏈路層中GRO的處理
根據上篇博文的介紹,gro需要支援gro的每種協議都要實現自己的報文匹配合併函式和合併完成函式。這裡我們先來看看鏈路層上 實現的自己的gro函式。鏈路層的接收匹配函式 napi gro receive napi,skb 該函式對報文進行匹配,並不合併報文。匹配規則 必須同時滿足以下兩個條件 1 兩個...
作業(判斷月份天數,判斷空,判斷季節)
1.輸入年 月,輸出本月有多少天 2004 2 29天2010 4 30天 coding utf 8 name 01 work.py date 1 12 19 author connect 971566031 qq.com desc year int input 請輸入年份 mon int inpu...
空值判斷 型別判斷
一 判斷乙個物件是不是空 4種方法 1.object.getownpropertynames 返回值是物件中屬性名組成的陣列 如果是空陣列,即為空 eg let obj console.log object.getownpropertynames obj name age 不是空 2.轉化成字串 s...