「視訊小課堂」Logstash如何成為鎮得住場面的資料管道(文字版)

讀位元組發表於2021-03-14

視訊地址

B站視訊地址:Logstash如何成為鎮得住場面的資料管道

公眾號視訊地址:Logstash如何成為鎮得住場面的資料管道

知乎視訊地址:Logstash如何成為鎮得住場面的資料管道

內容

首先我們延續上一期視訊中日誌採集架構的案例,Filebeat採集日誌並推送Kafka訊息佇列進行分發,再由Logstash消費日誌訊息,並將日誌資料最終落地在Elasticsearch叢集索引當中,Kafka作為訊息佇列分發服務需要將收集到的日誌訊息繼續分發下去,最終資料落地在Elasticsearch叢集索引當中。

那麼連線整個過程的主角Logstash是如何工作的,就是我們今天講解的重點。

Logstash工作過程分為三個部分:Input輸入、Filter過濾、Output輸出,它們共同協作形成了完整的Logstash資料管道傳輸機制

我們先從一個最簡單的例子演示開始,看看Logstash是怎麼輸入和輸出的,這一次先跳過filter過濾環節。

下面檢視已經預置好的一個配置檔案01-kafka-elastic-nginx.conf

首先是input輸入配置點,從Kafka訂閱訊息,Kafka叢集地址與filebeat中都指向了一個地址,其他配置我們先略過,後續Kafka專題再說

下來看到要訂閱的Topic主題TestT3,我們先不用json格式解碼訊息,預設就是純文字的方式

一樣的,這一步先略過過濾環節,直接看看output輸出配置點,目標是給Elasticsearch輸出資料,並指定了elasticsearch叢集的三個節點

輸出環節建立需要寫入的elasticsearch日誌索引,我們先按照預設的filebeat採集時間,進行日期格式化,按照每個小時建立一個索引,這塊會有時間問題,一會兒再說。

讓資料輸出到終端,方便我們除錯結果。

通過演示中最簡單的配置方式,這時候的Logstash已經成為連線Kafka和Elastisearch之間的資料管道了!

好,接下來我們將所有系統執行起來,並生成一條nginx請求日誌,看看管道各個階段的資料變化。

首先nginx日誌資料被filebeat採集,是一條典型的無結構的文字日誌資料,大家注意紅色標註的時間是2021年2月21日13時

接著這條日誌資料通過Kafka進入到了Logstash管道的輸入階段,

Logstash為這條日誌生成了更為非常龐大的Json資料,裡面包括了所有被採集主機的資訊,以及nginx日誌,實際上這些原始資訊並沒有被良好的進行資料清洗與結構化

最後資料被寫入到Elastisearch一個按小時劃分的索引當中,對應時間為2021年2月21日5時

我們發現Logstash對原始資料在沒有任何處理的情況下,會很不方便將來資料的使用;

這次我們利用Logstash json解碼器讓管道重新再來一次,

接下來我們進入Logstash中對應的配置檔案,並找到input輸入點的codec配置,刪掉註釋,開啟Logstash對輸入資料的json解碼方式·。

我們看看再次進入管道中的日誌資料,Logstash首先對原始日誌資料進行Json解析

這時候我們再看Json解析後的資料,是不是就清晰多了,filebeat採集到的本地機器資料、以及紅色框中Nginx HTTP日誌資料、以及其他標籤資料都進行了欄位分離

做到這一步其實還是不夠好,為什麼呢?一方面因為我們依然希望將Nginx HTTP的日誌資料也進行結構化處理,

另一個方面,Filebeat傳遞給Logstash的系統時間是慢了8個小時的UTC時間標準,反而Nginx日誌中的時間是我們本地的北京時間標準,因此我們希望用Nginx日誌時間作為建立Elasticsearch日誌索引的唯一依據

這時候我們就要使用Logstash的過濾機制了,我們繼續進入Logstash對應的配置中,刪掉過濾配置中的註釋,讓Logstash過濾最常用外掛grok、date、ruby、mutate起作用

grok外掛是專業處理非結構化資料的能手,通過自定義的Nginx日誌正規表示式,就能實現Nginx日誌的結構化解析

date外掛用於處理時間問題,我們通過date外掛將nginx日誌中的時間轉換成Logstash時間物件,並賦給一個新的臨時時間欄位indextime

ruby就是在過濾過程中可以插入ruby指令碼語言來進行程式級處理,我們通過ruby語言對indextime時間格式化,生成一個精確到小時的字串欄位index.date,用於elasticsearch索引名稱

mutate是最常用的可以對管道中資料欄位進行操作的外掛了,我們的目的是刪除臨時時間欄位indextime

最後我們還需要將output輸出中的索引生成方式修改一下,註釋掉原來用filebeat生預設時間生成的索引,改成nginx日誌時間生成的索引。

我們重新執行Logstash,資料經過了Input解碼、日誌grok結構化處理、本地時間物件建立,並進行日期格式化,為了生成新的Elasticsearch索引欄位,並對臨時欄位進行刪除,最終經過Output輸出階段,建立Elasticsearch索引或寫入日誌資料

讓我們看看Elasticsearch最終儲存的資料效果,index索引對應的時間來自過濾器建立的index.date欄位,index.date欄位又來自nginx日誌中分離出的本地時間。這樣我們就不用再去修改Logstash的系統時間了

我們看到菱形標註的欄位資料就是由過濾器對nginx http日誌進行結構化抽取的結果,

同樣elasticsearch依然儲存著nginx日誌的原始資料以備不時之需

前往讀位元組的知乎——瞭解更多關於大資料的知識

公眾號 "讀位元組" 大資料(技術、架構、應用)的深度,專業解讀
file

相關文章