這禮拜恰好修的一門叫做企業電腦網路的課,正要報告ELK。恰好上個禮拜台積電IT來我們學校徵才,給出了一張GG IT 進入會用到的工具一覽圖,那碩士期間這些應該就是我們碩班的必修了。
那今天先來講圖片中間的ELK,這篇會講解ELK的安裝、配置文件、使用方法。
ELK 組成
ELK 是由三個工具組成,Elasticsearch (E) 、Logstash (L) 、Kibana (K) 組成的Log 過濾、儲存、分析、視覺化系統,另外我們還需要一個叫Beat的工具來擔任Log的採集工具。
- ElasticSearch 是整體系統的核心部分,是一個非關聯式資料庫以JSON格式儲存資料,擁有一個非常厲害的索引功能,默認為9200 port
- Logstash是一個過濾器(不過其實本身也可以作為採集器),會把所有採集到的Log傳遞到logstash中。logstash可以依照規則將Log分割並傳遞到ElasticSearch (文章之後用ES表示),默認是5044 port。
- Kibana 是圖形化展示工具,將儲存在ES內的資料用各式各樣圖表呈現出來,默認是5601 port。
- Beats 是Log採集工具,負責將本台電腦的Log檔取出傳遞到logstash做過濾,或是直接傳遞到ES儲存器起來。
整體流程如下:
為何用ELK
那為什麼會需要ELK來採集Log呢? 過去系統不優嗎? 來看看過去怎麼做,假如我今天想要採集Nginx的成功access的 log,那通常會放在 /var/log/nginx/access.log
。如果我們想要查詢baidu是否有來爬我們網站,那麼可以通過簡單的 grep
來達成。
但是用在現今的大型系統會發現三個問題,一個是一旦流量過大會使log檔爆量,當log檔爆量後會自動壓縮成 gz
檔這使得查找困難。另一個是在現代的分散式系統,所有的log檔散布在各個分散式機台中,當我們需要查找特定Log時會很費力。最後是爬取出來都是文字資料,要轉成老闆看得懂的圖表還要自己寫,很不方便。
知道ELK的好處後我們來說說如何安裝吧!
一、ELK 的安裝
其實ELK安裝都大同小異,就是去官方網站下載。
進入官網你可以選擇使用deb安裝或是直接下載linux_x86_64壓縮包解壓縮。把ES、logstash、Kibana、beats都安裝下來,要注意的是beats分成很多種beats,如果想要採集log檔那麼應該選擇filebeat,因為log本質就是file。
在安裝ES之前,ES是基於JRE來撰寫的所以要確保系統內有JAVA並加入了系統變數,安裝JAVA。
# 檢查有沒有java
java -version
# 安裝java
sudo apt install default-jre
# 安裝JDK
sudo apt install default-jdk
# 確認JDK
javac -version
具體安裝方式我寫完後發現篇幅太長了,所以我就放在這裡給大家看吧
二、 ELK+Filebeat 配置文件
我們舉一個實際的分散式系統的例子,今天我有兩台伺服器一台是在140.127開頭(高雄大學的),一台是140.115開頭(中央大學的)。我想將中央大學與高雄大學的log檔都抓進中央大學的logstash並保存在中央大學的ES中。詳細流程如下:
1. Filebeat
首先先來看filebeat的配置文件,如果你是用deb安裝那應該可以在 /etc/filebeat/filebeat.yml
上看到他,如果你是用解壓縮方式那文件應該在解壓縮後資料夾底下,修改yml。
記得開啟enable,還有你的paths是爬取log的目標支援使用通配符,比如你想匹配所有nginx 下的access log檔,你可以寫 /var/log/nginx/access.*
。然後tags是為了在傳送到logstash後這個log檔是從哪裡來的。
接著是output,output默認是直接輸出到ES中,不過我們這裡要改成output到中央的logstash中(默認5044 port),因此將ES output都註解掉並在logstash中改為output host
完成後就開始執行吧,執行指令如果你是deb安裝那就 /usr/share/filebeat/filebeat -e -c /etc/filebeat/filebeat.yml
,如果你用解壓縮方式,那麼filebeat執行檔與yml配置檔都在同一個資料夾內,直行即可 <beat_dir>/filebeat -e -c <beat_dir>/filebeat.yml
。
2. logstash
logstash就是過濾beats進來的東西,過濾規則遵循grok清理規則,具體是如何清理的可以看這一篇:
修改 /etc/logstash/logstash-sample.conf
,如果你是解壓縮方式安裝則在 <logstash_dir>/config/logstash-sample.conf
。logstash-sample.conf
包含了logstash的input、filter、output。
舉個例子,假如今天beat爬取log檔為 Alice|HELLO WORLD|33
,我想經過清理將Alice放在name欄位、HELLO WORLD放在talk欄位、33放在age欄位。
依據grok規則在name欄位接受.*的正則表達,其他也相同。最後會得到 {name:"ALICE",talk:"HELLO WORLD",age:"33"}
。
接著我們要輸出到ES (默認為9200 port),ES本質是一個資料庫,因此我們需要建立table,只是要注意的是,ES的TABLE被稱作index。我們需要對index取名字如下就是filebeat-2020.11.6-demo1,作為資料庫的表。
接著要將logstash打開,如果你是用解壓縮的方式安裝,開啟logstash的方式就是 <logstash_dir>/bin/logstash -f <logstash>/config/logstash-sample.conf
,如果你是用deb安裝則指令為 /usr/share/logstash/bin/logstash -f /etc/logstash/logstash-sample.conf
3. ElasticSearch 與Kibana
ElasticSearch與Kibana沒什麼配置文件,如果Kibana需要遠端開啟可以參考安裝說明中的調整server.host。ES、Kibana如果你是用deb安裝則開啟方式就是 service elasticsearch start 、 service kibana start
。如果你是解壓縮安裝則 <ES_dir>/bin/elasticsearch 、 <Kibana_dir>/bin/kibana
。
你可以用 localhost:5601
來開啟kibana,或是如果你有調整service.host那就使用那個IP host的5601來開啟kibana吧。
三、 Kibana視覺化
如果以上配置文件與安裝都成功,現在對目標log append一些資料應該能夠在kibana上發現了。不果你一進去肯定是發現什麼都看不到的,那是因為你尚未將ES內的index匯入進kibana。方法如下,進入stack management:
這麼一來就可以在Discover看到傳入的清理過的log檔了。記住要調整右上角的時間區間喔。
接下來是圖表,打開Visualize,隨便選一張圖,在bucket的aggregration選擇terms作為聚合方式。
大致上ELK的過程就算是完成了。