2022年2月6日 星期日

Logstash Grok 分析語法教學 + Nginx Access Log 分析


語法說明

Grok 語法的格式如下,SYNTAX 為 grok 欄位的資料判斷型別,SEMANTIC 為對應日誌的欄位名稱,而 SEMANTIC 對應日誌的內容即為 value ,可以想像成 key & value 的關係,這樣在之後後送給 ElasticSearch 時可以方便 Kibana 做資料的檢索與圖形的繪製。

%{SYNTAX:SEMANTIC}

假設我們日誌中有一列資料如下

localhost GET /v2/applink/5c2f4bb3e9fda12 400 46ms 5bc6e716b5d687c0

Grok 分析語法將會如下

%{WORD:hostname} %{WORD:method} %{URIPATH:urlpath} %{NUMBER:status_code} %{WORD:response_time} %{USERNAME:userid}

依據不同日誌規格寫出不同的 Grok 語法,問題是這種幾乎非人類能閱讀的語法該怎麼寫出來呢?參照 logstash 於 github 上的 sample 來對照就容易多了

雖然被分析過後的日誌資料型別基本預設為 string,但在 grok 的理解層面來說我們可以想像 WORD 為字串型別的資料、URIPATH 為網址路徑型別的資料、NUMBER 為 INT 型別的資料,以此類推。

Grok 實際上是 Regular expression(正規表示式)的簡易版,類似幫我們建立好了簡單易用的函式 Function 以避免我們為了分析日誌內容而需要編寫大量的 Regular expression 語法,若日誌本身的格式超出了 Grok 所能定義與分析的範圍,那麼還是可以全面或輔以 Regular expression 的語法於 Filter 區塊中的 Grok 區塊去定義 input 日誌的分析方法



語法驗證工具

Kibana 功能選單中的 management 大項裡有 Dev Tools,其內含的 Grok Debugger 就可以幫我們做到語法的驗證與除錯

於 Sample Data 中輸入日誌的樣式,於 Grok 中輸入我們參照 grok-patterns 的 sample 所寫出的 Grok 語法,按下 Simulate 後,若語法正確則會顯示最下方被分析的 Key & Value 資料



實戰Nginx Access Log分析語法

此範例的 nginx 為 upstream 反向代理角色,負責將前端 client 的請求 forward 給後端的 web 服務器,其所設置的 log_format 如下

log_format ssl_web_upstream '$remote_addr - $remote_user [$time_local] $http_host $request_method "$uri" "$query_string" '
          '$status $body_bytes_sent "$http_referer" $upstream_status $upstream_addr $request_time $upstream_response_time '
          '"$http_user_agent" "$http_x_forwarded_for"' ;

nginx 實際的 log 檔內容如下

211.249.246.115 - - [27/Jun/2021:13:40:59 +0800] web.tomy168.com GET "/index.php" "sid=8c546ec147c1cafd0459566733cbba1g" 200 164916 "-" 200 192.168.88.88:80 0.253 0.067 "Mozilla/5.0 (compatible; Daum/4.1; +http://cs.daum.net/faq/15/4118.html?faqId=28966)" "-"

Grok 分析語法如下

%{IP:ClientIP} - %{USERNAME:RemoteUser} \[%{HTTPDATE:LocalTime}\] %{IPORHOST:UrlHost} %{WORD:method} "%{URIPATHPARAM:UrlPath}" "%{DATA:QueryString}" %{NUMBER:StatusCode} %{NUMBER:BodyByteSent} %{QS:HttpRefer} %{NUMBER:UpstreamStatusCode} %{HOSTPORT:UpstreamAddr} %{NUMBER:request_time} %{NUMBER:UpstreamResponseTime} %{QS:UserAgent} %{QS:http_x_forwarded_for}

透過 Grok Debugger 驗證結果如下



本文內容參閱以下連結:
簡易 Regular Expression 入門指南

Previous Post
Next Post

0 comments: