筆者所在項目組的項目由多個子項目所組成,每個子項目都存在必定的日誌,有時候想排查一些問題,須要到各個地方去查看,極爲不方便,此前據說有ELK
這種神器,搜索了一下,發現利用docker搭建彷佛並不麻煩,因而進行了一番嘗試,結果還比較順利,將此過程完整記錄下來,但願留給有須要的讀者進行參考。html
筆者此次實踐的過程中參考了較多的文檔與筆記,參考的連接地址有:
Docker ElK安裝部署使用教程 、
Docker Hub官網、
Docker ELK使用文檔nginx
安裝ELK有不少種方式,好比源碼、rpm包,或docker;不過docker又分爲了單個安裝與ELK打包安裝,筆者這裏是經過docker打包安裝,由於這樣的方式相比來講最爲簡單,由於只須要下載鏡像,而後運行起來就能夠了docker
ELK鏡像已經被docker官方收錄,所以只須要簡單的命令便可拉取到鏡像;但考慮到ELK鏡像比較大,在拉取過程中存在比較慢的狀況,所以筆者使用了阿里雲的加速器來提速;筆者使用的是MAC版本的docker,參考配置方法以下:json
右鍵點擊桌面頂欄的 docker
圖標,選擇 Preferences
,在 Daemon
標籤下的 Registry mirrors
列表中將 https://k0pf39f8.mirror.aliyuncs.com
加到registry-mirrors
的數組裏,點擊 Apply & Restart
按鈕,等待Docker重啓並應用配置的鏡像加速器,以下截圖vim
設置好加速地址以後,筆者就能夠開始拉取ELK鏡像,參考命令以下:數組
docker pull sebp/elk
筆者當前鏡像laster對應的版本爲6.2.4,若是讀者之後看到此文章,在搭建的時候遇到一些問題,能夠在命令後面加上
:6.2.4
來指定該版本,減小意外產生;
下載鏡像以後可使用docker的命令來驗證是否成功,參考命令以下:瀏覽器
docker images
筆者執行後docker返回結果以下ruby
REPOSITORY TAG IMAGE ID CREATED SIZE sebp/elk latest c916150705cc 2 weeks ago 1.49GB
在結果當中能夠看出,ELK鏡像已經下載下來,佔用了將近1.5GB空間bash
運行此容器的時候,須要將宿主機的端口轉發到該容器,其中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
刪除便可看到啓動過程。
容器運行以後,筆者須要驗證是否啓動成功,能夠經過瀏覽器訪問kibana和ES的頁面是否成功來判斷。
經過瀏覽器訪問kibana,若是正常出現界面,則表明啓動成功,URL地址以下:
http://localhost:5601/
當瀏覽器訪問成功以後,參考以下圖所示:
驗證kibana啓動成功以後,接着繼續驗證ES服務是否啓動成功,URL地址以下
http://localhost:9200/_search?pretty
訪問以後,此時ES裏面應該是沒有數據的,出現的界面以下
在保證es和kibana服務啓動完成以後,筆者還須要進行一些數據導入步驟
logstash配置主要有三個地方要處理,首先是輸入源在什麼位置,而後是對數據進行過濾或者格式化,最後是須要將數據輸出到什麼地方;筆者在下方的配置只作了其中兩項,由於在nginx日誌當中已經將日誌格式化了,編輯配置文件命令參考以下:
vim /Users/song/dockerFile/config/logstash.conf
配置文件內容參考以下
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服務
由於筆者對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;
筆者配置截圖以下所示
前面已經將日誌格式與logstash配置好,如今筆者須要啓動logstash開始收集日誌,啓動logstash以前須要先進入容器裏面,進入容器參考命令以下:
docker exec -it elk bash
進入容器以後,筆者須要啓動logstash來收集數據,啓動的時候須要帶兩個參數進去,第一個是logstash的數據暫存位置,第二個是使用的配置文件,所以構造的命令以下所示:
/opt/logstash/bin/logstash --path.data /tmp/logstash/data -f /data/config/logstash.conf
如今只要nginx產生日誌,logstash就會實時將日誌發送到ES服務當中,在發送數據時,終端窗口也會發生變化,以下圖所示
當數據導入以後,筆者纔可使用kibana的圖形化來查看數據了,因此首先確認一下ES中是否有數據,確認有數據後就能夠進行繪圖配置,配置完成以後就能夠進行篩選日誌等操做了。
當數據添加到ES服務器當中後,筆者能夠經過ES服務提供的URL來查看其中的數據,URL地址以下所示:
http://localhost:9200/_search?pretty
就會看到筆者剛剛輸入的日誌內容,以下圖所示
當看到total數量變大,並在下面的數據項中看到了nginx日誌信息時,則表明筆者導入數據成功了。
經過瀏覽器訪問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