【ES】基於Elastic Stack搭建ELK
什麼是ELK Stack
“ELK”是三個開源專案的首字母縮寫:Elasticsearch,Logstash和Kibana。
- Elasticsearch是一個搜尋和分析引擎。
- Logstash是一個伺服器端資料處理管道,它同時從多個源中提取資料,對其進行轉換,然後將其傳送到比如Elasticsearch這樣的“資料庫”中進行儲存。
- Kibana可以對Elasticsearch中的資料進行資料視覺化。
什麼是Elastic Stack
Elastic Stack比ELK Stack更加靈活且強大
Elastic Stack發展歷程
- Elasticsearch是核心
- LogStash負責資料的收集與傳送、Kibana負責展示資料
- 社群越來越大,使用案例也越來越多
- 2015年,社群在ELK Stack中引入了一系列輕量級,單用途的資料傳送器,叫做Beats
- 那麼這個階段的Stack,我們到底應該叫BELK? BLEK? ELKB? 首字母縮寫並不重要
- 如此簡單易用開源的產品,不應該只侷限於首字母縮寫,所以有了Elastic Stack
從零搭建ELK,快速收集Mysql日誌並實現視覺化
目前官網的ELK教程使用的是ElasticSearch+Filebeat+Kibana,所以我們也先使用這三個元件來從零搭建ELK,關於Logstash後文會用到。
Filebeat是一個輕量級的收集與傳送日誌資料的元件,將它安裝在你的伺服器上,類似一個代理,它將監控你指定路徑下的日誌檔案,然後將日誌資訊傳送給ElasticSearch或LogStash
下載並解壓
請自行選擇自己的作業系統進行安裝,並找到對應的安裝目錄,比如我現在使用的是Mac系統,下載下來的為gzip的壓縮包,然後直接解壓即可,如下圖:
所在目錄為/ekl。
執行
啟動ElasticSearch
./elasticsearch-7.1.0/bin/elasticsearch
啟動Kibana
./kibana-7.1.0-darwin-x86_64/bin/kibana
啟動Filebeat
cd filebeat-7.1.1-darwin-x86_64 ./filebeat modules enable mysql ./filebeat -e -c filebeat.yml
使用Kibana
1. 訪問Kibana
瀏覽器開啟 http://localhost:5601
2. 進入dashboard
Collapse預設是收起來的,展開後可找到Dashboard,點選即可
3.初始化
Dashboard頁面的展示出來了filebeat幫我們建立的索引,如下圖:
在Index pattern輸入filebeat*即可匹配到filebeat所建立的索引:
點選Next step,表示我們現在想將filebeat*所匹配到的索引資料在kibana中進行檢視。
第二步需要我們選擇一個時間欄位,時間過濾器將使用此欄位按時間過濾資料。您可以選擇不包含時間欄位,但無法按時間範圍縮小資料範圍。不太明白這個時間欄位意思,我們選擇下拉列表的最後一個可選值I don't want to use the Time Filter,然後點選Create index pattern。建立後進入到的頁面展示出了索引所包含的欄位以及欄位型別,並且你也是可以去修改欄位型別的,這裡就不演示了。
4.使用
點選進入到Discover就可以進行檢視和搜尋日誌,如下下圖:
可以使用KQL語法來搜尋日誌,關於KQL語法我們用另外一篇文章來介紹吧,現在你只需要知道它是使用Kibana時進行快速搜尋的語法。
收集自己的應用日誌
Filebeat配置檔案
Filebeat是負責收集日誌以及傳輸的,Filebeat預設的配置檔案精簡後如下:
#=========================== Filebeat inputs ============================= filebeat.inputs: - type: log enabled: false paths: - /var/log/*.log #- c:\programdata\elasticsearch\logs\* #================================ Outputs ===================================== #-------------------------- Elasticsearch output ------------------------------ output.elasticsearch: # Array of hosts to connect to. hosts: ["localhost:9200"] #----------------------------- Logstash output -------------------------------- #output.logstash: # The Logstash hosts #hosts: ["localhost:5044"]
Filebeat分為資料輸入配置與資料輸出配置。
預設配置檔案中資料輸入配置表示從/var/log/這個目錄下獲取.log的檔案內容,但是暫時沒有開啟。
預設配置檔案中資料輸出配置表示輸出到localhost:9200這個主機的elasticsearch中。
建立自己的應用日誌
所以如果我們想獲取我們自己應用的日誌資訊,我們需要將應用日誌存在某個檔案中,然後修改FileBeat的配置檔案。
在GitHub上我建立了一個專案,大家可以自由克隆使用,這個專案在列印日誌的時候會將日誌輸出到/var/log/elk/app.log檔案中。
修改Filebeat的配置檔案並重啟
然後我們修改Filebeat的配置檔案,修改部分為:
filebeat.inputs: - type: log enabled: true paths: - /var/log/elk/*.log
然後重啟Filebeat。
產生並檢視應用日誌
執行一下專案中的Main方法,就會產生一條日誌並存儲到/var/log/elk/app.log中,比如我目前這個檔案中的內容為:
回到Kibana進行查詢我們就可以查詢到這條日誌了,當然這中間可能需要等個幾秒鐘,因為Filebeat需要時間需發現你新增的日誌並傳輸到ElasticSearch中。你可以在Kibana的Filters輸入框中輸入log.file.path : /var/log/elk/app.log表示利用KQL來精確的查詢內容,查詢結果為:
日誌檔案中的內容對應為ElasticSearch中的message欄位,我這裡是因為手動修改過檔案內容,所以這裡查出來的message內容不太正確,相信你按我上面的步驟來操作會得到你想要的結果的。
總結
事實上通過上面的步驟就實現了收集你自己應用的日誌了。
整合LogStash
利用ElasticSearch、Kibana、Filebeat已經搭建了一套日誌系統,似乎滿足了需求,但是要注意Filebeat的特點是輕量級的收集日誌器,功能比較單一,並且通常會從多個渠道收集日誌,比如mysql、系統日誌、應用日誌等等,那麼如果我們想對這些日誌進行統一加工的話,就需要用到LogStash。
下載與解壓
修改配置檔案
LogStash預設的配置檔案是config/logstash.yml。
配置檔案的基本格式是:
# This is a comment. You should use comments to describe # parts of your configuration. input { ... } filter { ... } output { ... }
也有輸入、輸出,還有一個過濾器,這個過濾器就是LogStash的特別之處,也需要另外一篇部落格進行詳細的講解。那麼我們這裡列一個簡單的配置檔案,檔名稱為elk-conf:
# 表示監聽5044埠,Filebeat將把日誌資料傳送給此埠 input { beats { port => 5044 } } # 將接收到的日誌在控制檯進行輸出並且傳輸到elasticsearch中 output { elasticsearch { hosts => ["localhost:9200"] } stdout { } }
先按上面的配置測試一下,在這之前需要將Filebeat中的日誌資料輸出配置改一下:
#-------------------------- Elasticsearch output ------------------------------ #output.elasticsearch: # Array of hosts to connect to. # hosts: ["localhost:9200"] #----------------------------- Logstash output -------------------------------- output.logstash: # The Logstash hosts hosts: ["localhost:5044"]
改好之後可以先啟動LogStash,再重啟Filebeat,不然在啟動Filebeat的時候會連不上5044埠而報錯,使用一下命令啟動LogStash:
bin/logstash -f config/elk-conf.yml
如果啟動LogStash出現“Logstash stopped processing because of an error: (ArgumentError) invalid byte sequence in US-ASCII”錯誤,是因為配置檔案的全路徑中有中文,改成英文吧...
如果你是其他系統遇到了其他錯誤,可以在留言區進行反饋。
測試LogStash
啟動LogStash成功後,我們手動改變以下app.log中的內容,為了以後講LogStash方便大家複製以下內容到app.log檔案中吧:
83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
正常的話會在LogStash的控制檯看見該日誌內容,這裡就不貼圖了,因為控制檯列印的資訊其實比較多,為什麼會這麼多?這個都跟LogStash有關係,這裡就不多解釋了。
控制檯看到到了日誌後,我們現在去Kibana中看看,Kibana目前所匹配的索引是filebeat*,這個匹配模式是查不到我們剛剛新增的資訊的,因為現在這條日誌是通過LogStash傳送到ElasticSearch中的,建立的索引是logstash-2019.06.12-000001,所以我們之前在Kibana建立的Index Pattern是查不到這條日誌的,我們可以在Kibana中按照上文的步驟再來建立一個Index Pattern以匹配logstash所傳送的日誌,建立成功後,我們回到Kibana中的Discover模組就會如下圖,並且可以切換Index Pattern以檢視日誌,同時也能看到我們上面建立的logstash日誌。
總結
最終的架構圖如下: