使用 GROK 建構非結構化數據
如果您使用 Elastic (ELK) 堆疊並且有興趣將自訂 Logstash 日誌對應到 Elasticsearch,那麼這篇文章適合您。
ELK 堆疊是三個開源專案的縮寫:Elasticsearch、Logstash 和 Kibana。 它們共同構成了一個日誌管理平台。
- Elasticsearch 是一個搜尋和分析系統。
- Logstash 是一個伺服器端資料處理管道,它同時從多個來源獲取數據,對其進行轉換,然後將其發送到“儲存”,例如 Elasticsearch。
- Kibana 允許使用者使用 Elasticsearch 中的圖表和圖形來視覺化資料。
節拍 後來出現的,是一個輕量級的資料傳送器。 Beats 的引入將 Elk Stack 轉變為 Elastic Stack,但這不是重點。
本文介紹的是 Grok,它是 Logstash 中的一項功能,可以在將日誌發送到儲存之前對其進行轉換。 出於我們的目的,我只會討論將 Logstash 中的資料處理到 Elasticsearch 中。
Grok 是 Logstash 中的一個篩選器,用於將非結構化資料解析為結構化且可查詢的資料。 它位於正規表示式 (regex) 之上,並使用文字模式來匹配日誌檔案中的字串。
正如我們將在以下幾節中看到的,使用 Grok 在高效的日誌管理方面會產生很大的不同。
沒有 Grok,您的日誌資料是非結構化的
如果沒有 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 模板語法如下: %{SYNTAX:SEMANTIC}
我嘗試做的第一件事就是轉到選項卡 瀏覽 在 Grok 調試器中。 我認為如果這個工具能夠自動產生 Grok 模式那就太酷了,但它並沒有太大用處,因為它只找到了兩個匹配項。
利用這項發現,我開始使用 Elastic Github 頁面上的語法在 Grok 偵錯器中建立自己的模板。
在嘗試了不同的語法之後,我終於能夠按照我想要的方式建立日誌資料。
Grok 調試器鏈接
原文:
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 索引!
有了 Grok,您的日誌資料就會結構化!
正如我們在上圖中看到的,Grok 能夠自動將日誌資料與 Elasticsearch 進行比對。 這使得管理日誌和快速查詢資訊變得更加容易。 您可以簡單地按您要尋找的內容(例如環境或 URL)進行過濾,而不是挖掘日誌檔案來進行偵錯。
試試 Grok 表達式! 如果您有其他方法來執行此操作或對上面的範例有任何問題,請在下面寫評論告訴我。
感謝您的閱讀,請在 Medium 上關注我,以獲取更多有趣的軟體工程文章!
Ресурсы
PS
電報頻道透過
來源: www.habr.com