Logstash-資料收集、解析和轉存
本文作者:羅海鵬,叩丁狼高階講師。原創文章,轉載請註明出處。
前言
最近這幾年,大資料一直都是很熱門的話題,很多人會顧名思義的覺得,大資料就是你現在手上有大量的資料。從某個層面上來看,這確實是這樣的,但是所謂的大資料不僅僅只是有一堆的資料在這,更重要的是我們要如何解析這堆資料,讓它變成有意義或者說有參考價值的資料。而我們知道,在我們應用執行的過程中會產生大量的日誌檔案,做開發的人都知道,這些日誌檔案有系統日誌,有錯誤日誌,有警告日誌還有正常的訊息日誌,這些日誌長年累日的堆積,就成了大資料了。然而,做運維的人都知道,這些日誌是雜亂無章的存放著的,一個日誌檔案又密密麻麻的資訊,就算是天天閒著沒事幹也不想開啟這些日誌檔案來看,甚至是恨不得把這些日誌檔案刪掉。除非等應用出現了問題後,才會去看看日誌到底是什麼問題。那這樣的話,這些日誌就成了一堆沒用的大資料了。其實,這些日誌如果利用的好的話,是很有價值的資料,因為我們可以對這些日誌進行各種分析和各個維度的歸類,然後以類似報表或圖形化的方式展現這些資料,從而快速和直觀的瞭解我們應用的各個指標資訊,達到效能監控、問題預警、快速響應和處理及時的目的。
資料的轉存
然後理想很豐滿,現實很骨感,我們希望分析這些日誌檔案,但如何分析才是重點!不過這個問題很快就有解決方案了。我們先來思考一下,我們為什麼不想看這些日誌檔案?那不就是因為這些日誌檔案存放資料非常不直觀,看起來很費勁,並且在這茫茫字海中也很難找到我們想要關注的資料。那既然這樣的話,我們是否可以把這些存在檔案中的日誌資料轉存到一個可以按各個維度結構化歸類的資料庫中。同時該資料庫必須具備高效能的全文檢索能力,因為這些日誌通常來說都是文件型別的資料,並且搜尋我們想要關注的某些資料,這個操作是很關鍵的。最後,該資料庫還必須支援儲存海量資料,並且不會隨著資料量增加而導致搜尋速度下降。那麼有什麼樣的資料庫是有我以上提到的這些能力的呢?答案就是我們現在研究的elasticsearch這個搜尋伺服器了,elasticsearch具備的這些能力,在我們之前章節已經有了解了。所以要對這些資料進行分析,解決方案很明顯,就是把這些資料轉儲到elasticsearch中。
Logstash介紹
那現在我們希望把日誌檔案轉存到elasticsearch中,首先得收集這些日誌檔案,然後在解析這些日誌檔案中的資料,把它們變成elasticsearch支援的資料格式,最後再匯入到elasticsearch中,那這些操作肯定得寫個自動化的程式來完成的,而市面上已經有第三方的工具專門做這些資料的收集、解析和轉存了,這個工具就是我們接下來要講的Logstash。
Logstash是什麼
Logstash 是一個開源的資料收集引擎,它具有實時的資料傳輸能力,可以按照我們定製的規範來做資料的收集、解析和儲存。
所以,Logstash有3個核心組成部分,就是資料收集、資料解析和資料轉存。這3個核心組成部分組成了一個類似管道的資料流,由輸入端進行資料的採集,管道本身做資料的過濾和解析,輸出端把過濾和解析後的資料輸出到目標資料庫中:
資料收集
上面提到,我們可以使用Logstash收集這些雜亂無章的日誌檔案,但實際上,日誌的這種資料來源只是Logstash的其中一種,如下圖所示:
通過以上示意圖我們可以發現:Logstash的資料來源可以有很多的來源,除了可以收集日誌之外,還可以收集redis、kafka等熱門分散式技術的資料,並且還可以收集實現了java的JMS規範的訊息中心的資料,如:ActiveMQ等,和使用JDBC收集關係型資料庫的資料,甚至是可以用shell編輯指令碼把標準輸出作為Logstash的資料輸入。
資料過濾和解析
我們通過資料輸入端從各種資料來源收集到的資料可能會有很多不是我們想要的,這時我們可以給Logstash定義過濾器,過濾器可以定義多個,它們依次執行,最終把我們想要的資料過濾出來,然後把這些資料解析成目標資料庫,如elasticsearch能支援的資料格式。
資料轉存
在經過管道的過濾後,最終得到我們想要的資料了,此時需要把這些資料轉存到我們的目標資料庫上,而這個目標資料庫就是我們現在學的elasticsearch了,當然,Logstash開源的資料處理引擎,肯定不止於elasticsearch,我們來看看Logstash能支援的轉存資料的目標資料庫有哪些:
通過上圖我們可以發現,Logstash支援的資料轉存資料庫除了有elasticsearch外,還有solr、Redis、Kafka、RabbitMQ、MongoDB,甚至是可以存為一個普通的磁碟檔案或者CSV格式的檔案。
Logstash安裝
那接下來我們把Logstash安裝使用起來,安裝步驟如下:
準備安裝包
1、下載安裝包
以上地址為Logstash官網下載的地址,目前最新版為6.3.2,Logstash版本和Elasticsearch版本同步更新,所以我們最好使用一致的版本,而我們Elasticsearch使用的版本是6.2.4,所以我們Logstash也需要下載6.2.4。確定好版本後,我們下載tar格式的壓縮包,包的全名為:logstash-6.2.4.tar.gz。注意:Logstash需要Java 8.不支援Java 9
2、解壓安裝$ tar -zxvf logstash-6.2.4.tar.gz 解壓安裝包,得到新的目錄logstash-6.2.4
$ mv logstash-6.2.4 /usr/local/logstash 移動到到/usr/local目錄,並重命名為logstash
測試Logstash
$ cd /usr/local/logstash/bin 進入logstash的bin目錄
$ ./logstash -e 'input { stdin {} } output { stdout {} }' 執行該命令
命令解析:我們在進入bin目錄後,該目錄有一個指令碼檔案叫logstash,執行該檔案並傳入-e引數,表示立即啟動例項,並使用命令列裡的配置引數啟動,給的配置是資料輸入端使用標準輸入,資料輸出端使用標準輸出(標準輸入和標準輸出是shell程式設計的概念),沒有配置資料過濾器。
看到如下列印資訊說明啟動成功:
Sending Logstash's logs to /usr/local/logstash/logs which is now configured via log4j2.properties
[2018-08-14T01:22:45,465][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"fb_apache", :directory=>"/usr/local/logstash/modules/fb_apache/configuration"}
[2018-08-14T01:22:45,518][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"netflow", :directory=>"/usr/local/logstash/modules/netflow/configuration"}
[2018-08-14T01:22:46,532][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2018-08-14T01:22:47,861][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.2.4"}
[2018-08-14T01:22:48,900][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
[2018-08-14T01:22:53,071][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2018-08-14T01:22:53,318][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x3d51afc2 run>"}
The stdin plugin is now waiting for input:
[2018-08-14T01:22:53,494][INFO ][logstash.agent ] Pipelines running {:count=>1, :pipelines=>["main"]}
此時,命令視窗停留在等待輸入狀態,鍵盤鍵入任意字元:hello logstash
下方是Logstash在接受到輸入資料後,再把資料輸出的效果:
{
"message" => "hello logstash",
"@version" => "1",
"@timestamp" => 2018-08-13T17:32:01.122Z,
"host" => "localhost.localdomain"
}
完成了以上步驟說明logstash已經安裝上去了,只不過我們現在執行的測試例子比較簡單,只是做了個標準輸入和標準輸出,但這已經夠了,我們接著往下深入學習Logstash,肯定是可以做更復雜的資料輸入和解析,並最終轉存到elasticsearch中。