filter grok 判斷 Grok 正則捕獲

2021-10-13 11:38:26 字數 2152 閱讀 9152

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...