一、背景
筆者所在專案組的專案由多個子專案所組成,每一個子專案都存在一定的日誌,有時候想排查一些問題,需要到各個地方去檢視,極為不方便,此前聽說有ELK
這種神器,搜尋了一下,發現利用docker搭建似乎並不麻煩,於是進行了一番嘗試,結果還比較順利,將此過程完整記錄下來,希望留給有需要的讀者進行參考。
筆者這次實踐的過程當中參考了較多的文件與筆記,參考的連結地址有: Docker ElK安裝部署使用教程 、 Docker Hub官網、 Docker ELK使用文件
二、操作概要
- 服務安裝與執行
- 資料匯入與校驗
- 繪圖配置與展示
三、服務安裝與執行
安裝ELK有很多種方式,比如原始碼、rpm包,或docker;不過docker又分為了單個安裝與ELK打包安裝,筆者這裡是通過docker打包安裝,因為這樣的方式相比來說最為簡單,因為只需要下載映象,然後執行起來就可以了
3.1 映象下載
ELK映象已經被docker官方收錄,因此只需要簡單的命令即可拉取到映象;但考慮到ELK映象比較大,在拉取過程當中存在比較慢的情況,因此筆者使用了阿里雲的加速器來提速;筆者使用的是MAC版本的docker,參考配置方法如下:
3.1.1 映象加速
右鍵點選桌面頂欄的 docker
圖示,選擇 Preferences
,在 Daemon
標籤下的 Registry mirrors
列表中將 https://k0pf39f8.mirror.aliyuncs.com
加到registry-mirrors
的陣列裡,點選 Apply & Restart
按鈕,等待Docker重啟並應用配置的映象加速器,如下截圖
3.1.2 映象獲取
設定好加速地址之後,筆者就可以開始拉取ELK映象,參考命令如下:
docker pull sebp/elk
複製程式碼
筆者當前映象laster對應的版本為6.2.4,如果讀者以後看到此文章,在搭建的時候遇到一些問題,可以在命令後面加上
:6.2.4
來指定該版本,減少意外產生;
下載映象之後可以使用docker的命令來驗證是否成功,參考命令如下:
docker images
複製程式碼
筆者執行後docker返回結果如下
REPOSITORY TAG IMAGE ID CREATED SIZE
sebp/elk latest c916150705cc 2 weeks ago 1.49GB
複製程式碼
在結果當中可以看出,ELK映象已經下載下來,佔用了將近1.5GB空間
3.2 容器執行
執行此容器的時候,需要將宿主機的埠轉發到該容器,其中ES埠為9200,kibana埠為5601,logbate埠為5044;另外筆者建議將配置檔案和資料存放在宿主機,便於後期維護,因此還需要將宿主機目錄掛載到容器/data
當中;最後構造的命令如下:
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -v /Users/song/dockerFile:/data -it -d --name elk sebp/elk
複製程式碼
筆者在執行容器的引數當中加入了後臺執行-d
引數,這樣筆者就不怕誤操作突然把容器停止了,但放置於後臺執行,ELK的伺服器啟動過程是不可見的,這個啟動時間根據你機器的效能所決定,筆者電腦大約在10秒鐘左右;如果覺得啟動失敗,也可以將該容器刪除,然後重新建立一個容器,上述命令中的-d
刪除即可看到啟動過程。
3.3 資料匯入與校驗
容器執行之後,筆者需要驗證是否啟動成功,可以通過瀏覽器訪問kibana和ES的頁面是否成功來判斷。
3.3.1 檢查Kibana
通過瀏覽器訪問kibana,如果正常出現介面,則代表啟動成功,URL地址如下:
http://localhost:5601/
複製程式碼
當瀏覽器訪問成功之後,參考如下圖所示:
3.3.2 ES服務檢查
驗證kibana啟動成功之後,接著繼續驗證ES服務是否啟動成功,URL地址如下
http://localhost:9200/_search?pretty
複製程式碼
訪問之後,此時ES裡面應該是沒有資料的,出現的介面如下
四、配置與驗證
在保證es和kibana服務啟動完成之後,筆者還需要進行一些資料匯入步驟
4.1 logstash配置
logstash配置主要有三個地方要處理,首先是輸入源在什麼位置,然後是對資料進行過濾或者格式化,最後是需要將資料輸出到什麼地方;筆者在下方的配置只做了其中兩項,因為在nginx日誌當中已經將日誌格式化了,編輯配置檔案命令參考如下:
vim /Users/song/dockerFile/config/logstash.yml
複製程式碼
配置檔案內容參考如下
input {
file {
path => "/data/logs/access.log"
codec => "json"
}
}
output {
elasticsearch { hosts => ["127.0.0.1:9200"] }
stdout { codec => rubydebug }
}
複製程式碼
在配置檔案當中,可以看到日誌檔案存放的位置在 "/data/logs/access.log"當中,輸出的地址是127.0.0.1:9200
,這是本機的ES服務
4.2 nginx日誌格式
因為筆者對logstash的配置檔案語法不太熟悉,在裡面寫過濾器和篩選項比較費時間,所以選擇直接更改nginx中的日誌格式,將nginx的日誌檔案設定為json格式,在更改nginx配置檔案之前,需要獲取nginx配置檔案路徑,參考如下命令
sudo nginx -t
複製程式碼
返回結果
Password:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
複製程式碼
在返回的結果當中已經可以看到配置檔案所在的位置,使用vim編輯配置檔案,參考命令
vim /usr/local/etc/nginx/nginx.conf
複製程式碼
在http級別下增加自定義日誌格式,和日誌路徑,參考配置如下:
log_format json '{"@timestamp":"$time_iso8601",
"@version":"1","host":"$server_addr",
"client":"$remote_addr", "size":"$body_bytes_sent",
"responsetime":"$request_time",
"domain":"$host","url":"$uri","status":"$status"}';
access_log /data/logs/access.log json;
複製程式碼
筆者配置截圖如下所示
4.3 啟動logstash
前面已經將日誌格式與logstash配置好,現在筆者需要啟動logstash開始收集日誌,啟動logstash之前需要先進入容器裡面,進入容器參考命令如下:
docker exec -it elk bash
複製程式碼
進入容器之後,筆者需要啟動logstash來收集資料,啟動的時候需要帶兩個引數進去,第一個是logstash的資料暫存位置,第二個是使用的配置檔案,因此構造的命令如下所示:
/opt/logstash/bin/logstash --path.data /tmp/logstash/data -f /data/config/logstash.conf
複製程式碼
4.4 新增資料
現在只要nginx產生日誌,logstash就會實時將日誌傳送到ES服務當中,在傳送資料時,終端視窗也會發生變化,如下圖所示
五、 繪圖配置與展示
當資料匯入之後,筆者才可以使用kibana的圖形化來檢視資料了,所以首先確認一下ES中是否有資料,確認有資料後就可以進行繪圖配置,配置完成之後就可以進行篩選日誌等操作了。
5.1 ES資料檢查
當資料新增到ES伺服器當中後,筆者可以通過ES服務提供的URL來檢視其中的資料,URL地址如下所示:
http://localhost:9200/_search?pretty
複製程式碼
就會看到筆者剛剛輸入的日誌內容,如下圖所示
當看到total數量變大,並在下面的資料項中看到了nginx日誌資訊時,則代表筆者匯入資料成功了。
5.2 kibana索引配置
通過瀏覽器訪問kibana,URL地址如下
http://127.0.0.1:5601/app/kibana#/management/kibana/index?_g=()
複製程式碼
點選左側導航欄的Discover
連結,便可進入建立索引模式介面,如下圖所示
點選頁面右下方的next
按鈕,會跳轉到下一個頁面,在此頁面還需要選擇一個時間維度,如下圖所示
在此點選下一步,便建立kibana的索引完成,此時再次點選左側導航欄的Discover
連結,便可以看到剛才建立索引的一些檢視,如下圖所示
在圖中有一個input輸入框,筆者可以在裡面填寫篩選所需要的關鍵詞;如果沒有篩選出結果,也可檢查左側的時間篩選項是否設定正確,如筆者的時間篩選項設定的是Today
,也就代表篩選當天的資料。
ELK的整體操作流程比較簡單,首先是logstash收集各種日誌並進行過濾,然後將過濾後的內容傳送到ES服務中,最後使用者通過Kibana的頁面檢視ES中的日誌資料;
作者:湯青松
微信:songboy8888
日期:2018-08-25