在 LogStash 中使用 GROK 將非結構化資料從日誌轉換為 ELK Stack 的提示和技巧

使用 GROK 建構非結構化數據

如果您使用 Elastic (ELK) 堆疊並且有興趣將自訂 Logstash 日誌對應到 Elasticsearch,那麼這篇文章適合您。

在 LogStash 中使用 GROK 將非結構化資料從日誌轉換為 ELK Stack 的提示和技巧

ELK 堆疊是三個開源專案的縮寫:Elasticsearch、Logstash 和 Kibana。 它們共同構成了一個日誌管理平台。

  • Elasticsearch 是一個搜尋和分析系統。
  • Logstash 是一個伺服器端資料處理管道,它同時從多個來源獲取數據,對其進行轉換,然後將其發送到“儲存”,例如 Elasticsearch。
  • Kibana 允許使用者使用 Elasticsearch 中的圖表和圖形來視覺化資料。

節拍 後來出現的,是一個輕量級的資料傳送器。 Beats 的引入將 Elk Stack 轉變為 Elastic Stack,但這不是重點。

本文介紹的是 Grok,它是 Logstash 中的一項功能,可以在將日誌發送到儲存之前對其進行轉換。 出於我們的目的,我只會討論將 Logstash 中的資料處理到 Elasticsearch 中。

在 LogStash 中使用 GROK 將非結構化資料從日誌轉換為 ELK Stack 的提示和技巧

Grok 是 Logstash 中的一個篩選器,用於將非結構化資料解析為結構化且可查詢的資料。 它位於正規表示式 (regex) 之上,並使用文字模式來匹配日誌檔案中的字串。

正如我們將在以下幾節中看到的,使用 Grok 在高效的日誌管理方面會產生很大的不同。

沒有 Grok,您的日誌資料是非結構化的

在 LogStash 中使用 GROK 將非結構化資料從日誌轉換為 ELK Stack 的提示和技巧

如果沒有 Grok,當日誌從 Logstash 發送到 Elasticsearch 並在 Kibana 中呈現時,它們僅出現在訊息值中。

在這種情況下查詢有意義的資訊很困難,因為所有日誌資料都儲存在單一鍵中。 如果日誌訊息能夠更好地組織起來就更好了。

來自日誌的非結構化數據

localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0

如果仔細查看原始數據,您會發現它實際上由不同的部分組成,每個部分之間用空格分隔。

對於更有經驗的開發人員,您可能可以從 API 呼叫中猜出每個部分的含義以及日誌訊息的含義。 每個項目的介紹概述如下。

我們資料的結構化視圖

  • 本地主機==環境
  • GET==方法
  • ​ /v2/applink/5c2f4bb3e9fda1234edc64d == url
  • 400==response_status
  • 46ms ==響應時間
  • ​ 5bc6e716b5d6cb35fc9687c0 == user_id

正如我們在結構化資料中看到的那樣,非結構化日誌是有順序的。 下一步是原始資料的軟體處理。 這就是 Grok 的閃光點。

格羅克模板

內建 Grok 模板

Logstash 隨附 100 多個內建模板,用於建立非結構化資料。 對於 apache、linux、haproxy、aws 等通用系統日誌,您絕對應該盡可能利用這一點。

但是,當您有如上例所示的自訂日誌時會發生什麼? 您必須建立自己的 Grok 模板。

自訂 Grok 模板

您必須嘗試建立自己的 Grok 模板。 我用了 Grok 偵錯工具 и 格洛克模式.

請注意,Grok 模板語法如下: %{SYNTAX:SEMANTIC}

我嘗試做的第一件事就是轉到選項卡 瀏覽 在 Grok 調試器中。 我認為如果這個工具能夠自動產生 Grok 模式那就太酷了,但它並沒有太大用處,因為它只找到了兩個匹配項。

在 LogStash 中使用 GROK 將非結構化資料從日誌轉換為 ELK Stack 的提示和技巧

利用這項發現,我開始使用 Elastic Github 頁面上的語法在 Grok 偵錯器中建立自己的模板。

在 LogStash 中使用 GROK 將非結構化資料從日誌轉換為 ELK Stack 的提示和技巧

在嘗試了不同的語法之後,我終於能夠按照我想要的方式建立日誌資料。

在 LogStash 中使用 GROK 將非結構化資料從日誌轉換為 ELK Stack 的提示和技巧

Grok 調試器鏈接 https://grokdebug.herokuapp.com/

原文:

localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0

模式:

%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}

最後發生了什麼事

{
  "environment": [
    [
      "localhost"
    ]
  ],
  "method": [
    [
      "GET"
    ]
  ],
  "url": [
    [
      "/v2/applink/5c2f4bb3e9fda1234edc64d"
    ]
  ],
  "response_status": [
    [
      "400"
    ]
  ],
  "BASE10NUM": [
    [
      "400"
    ]
  ],
  "response_time": [
    [
      "46ms"
    ]
  ],
  "user_id": [
    [
      "5bc6e716b5d6cb35fc9687c0"
    ]
  ]
}

有了 Grok 模板和映射數據,最後一步是將其新增至 Logstash。

更新Logstash.conf設定檔

在安裝了 ELK 堆疊的伺服器上,前往 Logstash 設定:

sudo vi /etc/logstash/conf.d/logstash.conf

貼上更改。

input { 
  file {
    path => "/your_logs/*.log"
  }
}
filter{
  grok {
    match => { "message" => "%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}"}
  }
}
output {
  elasticsearch {
    hosts => [ "localhost:9200" ]
  }
}

儲存變更後,重新啟動 Logstash 並檢查其狀態以確保其仍在運作。

sudo service logstash restart
sudo service logstash status

最後,為了確保變更已生效, 請務必在 Kibana 中更新 Logstash 的 Elasticsearch 索引!

在 LogStash 中使用 GROK 將非結構化資料從日誌轉換為 ELK Stack 的提示和技巧

有了 Grok,您的日誌資料就會結構化!

在 LogStash 中使用 GROK 將非結構化資料從日誌轉換為 ELK Stack 的提示和技巧

正如我們在上圖中看到的,Grok 能夠自動將日誌資料與 Elasticsearch 進行比對。 這使得管理日誌和快速查詢資訊變得更加容易。 您可以簡單地按您要尋找的內容(例如環境或 URL)進行過濾,而不是挖掘日誌檔案來進行偵錯。

試試 Grok 表達式! 如果您有其他方法來執行此操作或對上面的範例有任何問題,請在下面寫評論告​​訴我。

感謝您的閱讀,請在 Medium 上關注我,以獲取更多有趣的軟體工程文章!

Ресурсы

https://www.elastic.co/blog/do-you-grok-grok
https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
https://grokdebug.herokuapp.com/

PS 來源連結

電報頻道透過 Elasticsearch

來源: www.habr.com

添加評論