1. 程式人生 > 其它 >【ES】基於Elastic Stack搭建ELK

【ES】基於Elastic Stack搭建ELK

基於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日誌。

總結

最終的架構圖如下: