<b>簡單介紹:</b><b></b>
ELK是三個開源工具組成,簡單解釋如下:
Elasticsearch是個開源分布式搜尋引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多資料源,自動搜尋負載等。
Logstash是一個完全開源的工具,它可以對你的日志進行收集、過濾,并将其存儲供以後使用(如,搜尋)。
Kibana 也是一個開源和免費的工具,它可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助您彙總、分析和搜尋重要資料日志。
<b>場景分析:</b><b></b>
日志主要包括系統日志、應用程式日志和安全日志等等。運維人員和開發人員可以通過日志了解伺服器軟硬體資訊、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日志可以了解伺服器的負荷,性能安全性,進而及時采取措施糾正錯誤。
通常,日志被分散的儲存不同的裝置上。如果你管理數十上百台伺服器,你還在使用依次登入每台機器的傳統方法查閱日志。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日志管理,例如:開源的syslog,将所有伺服器上的日志收集彙總。
集中化管理日志後,日志的統計和檢索又成為一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux指令能實作檢索和統計,但是對于要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。
這裡采用開源實時日志分析ELK平台能夠完美的解決我們上述的問題,當然也還有别的平台或者工具可以使用,這裡隻讨論ELK,官方網站:https://www.elastic.co
截止目前elk官網提供最新穩定版本為5.4.0
<b>需要實作效果:</b><b></b>
1、系統messages日志通過本地beat方式(資料不做任何處理)導入到elasticsearch中,最後通過kibana可以查詢。
2、Apache通路日志通過遠端beat方式(資料經過處理)導入到elasticsearch中,通過kibana可以搜尋日志中任何一個字段展示,也可以組合模糊查詢索。 也就是說将apache日志按json格式存儲到elasticsearch中。
3、不同用戶端的Nginx通路日志、Apache通路日志、系統日志均通過不同的比對條件正則處理導入到elasticsearch中。Nginx和系統日志需要編寫簡單對應的正規表達式。
<b>主要注意事項:</b>
1、Elk版本号保持一緻。
2、所有節點作業系統版本最好保持一緻,盡可能使用目前centos7.3穩定版本。Elk三個節點的配置需要比其它節點都要高一點,為2C4G,其它均為2C2G。記憶體太低這都是我踩過的坑。要求所有節點均能通外網,需要安裝軟體包。
3、關閉防火牆和selinux。
4、elk為了統一都使用tar包安裝所有軟體。用yum安裝特别是logstash會遇到很多坑。
5、搭建過程不難,難的是各個項目互相調試,難的是elk的進階使用方法。
<b>說明:</b><b></b>
本文目的隻帶你入門,至于elk更進階的應用和使用方法請檢視官網或者其它技術文檔。這裡把所有的應用都單獨分開部署是為了以後部署到docker容器中。當然你也可以都部署在一台伺服器上。
詳細資訊:
IP位址
主機名
用途
安裝軟體
192.168.2.25
apache
用戶端
httpd、filebeat
192.168.2.26
nginx
nginx、filebeat
192.168.2.27
logstash
日志分析處理
logstash、filebeat
192.168.2.28
elasticsearch
存儲資料
192.168.2.30
kibana
查詢資料
<b>安裝步驟:</b><b></b>
1、Elk三個節點安裝jdk,jdk可以去oracle官方網站下載下傳,版本号可以和我的不一樣
點選(此處)折疊或打開
rpm -ivh jdk-8u102-linux-x64.rpm

2、安裝elasticsearch節點
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.0.tar.gz
tar zxvf elasticsearch-5.4.0.tar.gz
mv elasticsearch-5.4.0 /usr/local/elasticsearch
cd /usr/local/elasticsearch/config
備份elasticsearch預設配置檔案,以防修改出錯
cp elasticsearch.yml elasticsearch.yml.default
編輯後如下:
添加elasticsearch使用者,tar包啟動必須使用普通使用者運作
useradd elasticsearch
chown -R elasticsearch:elasticsearch /usr/local/elasticsearch
打開sysctl.conf檔案,添加如下内容:
vm.max_map_count = 655360
sysctl -p /etc/sysctl.conf
打開/etc/security/limits.conf檔案,修改打開檔案句柄數
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
su - elasticsearch
cd /usr/local/elasticsearch
bin/elasticsearch
第一次啟動需要一些時間,因為需要做一些初始化動作,如果沒啟動成功請查系elasticsearch的相關日志解決。注意上面隻是前台啟動調試,在背景需要加&,需要重新啟動。
檢視端口是否開啟
curl簡單的測試
3、安裝logstash節點
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.0.tar.gz
tar zxvf logstash-5.4.0.tar.gz
mv logstash-5.4.0 /usr/local/logstash
在logstash上面下載下傳filebeat并啟動,通過它來監聽資料源檔案的新增内容經過logstash處理後上傳到es裡面。
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.0-linux-x86_64.tar.gz
tar zxvf filebeat-5.4.0-linux-x86_64.tar.gz
mv filebeat-5.4.0-linux-x86_64 /usr/local/filebeat
cd /usr/local/filebeat
cp filebeat.yml filebeat.yml.default
編輯filebeat.yml檔案,内容如下:
啟動filebeat服務
./filebeat &
注意filebeat沒有監聽端口,主要看日志和程序
建立一個本地檔案messages-log,可以取幾條本機系統的messages檔案,内容如下:
注意filebeat監聽的檔案記錄資訊在/usr/local/filebeat/data/registry
最後建立一個logstash的啟動指定test.conf配置檔案,内容如下:
Logstash預設有input、filter、output三個區域,一般最少需要配置input和output即可!
logstash的本身預設的logstash.yml配置檔案選擇不修改即可!
cd /usr/local/logstash
首先簡單的測試一下logstash不指定配置檔案啟動
bin/logstash -e 'input { stdin { } } output { stdout {} }'
我們手動輸入hello world它也會輸出hello world
然後指定配置檔案test.conf啟動,注意這是在前台啟動,友善調試
檢視5044端口和9600端口是否開啟
等待一會後應該會出現如下資訊輸出,這也就是test.conf裡面最後一行定義輸出到螢幕上。
但是配置檔案中也輸入到elasticsearch當中,我們驗證一下:
注意下圖隻截了一條資料,如果想看完整的資料,我們用kibana檢視。
4、安裝kibana節點
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.4.0-linux-x86_64.tar.gz
tar zxvf kibana-5.4.0-linux-x86_64.tar.gz
mv kibana-5.4.0-linux-x86_64 /usr/local/kibana
cd /usr/local/kibana/config
cp kibana.yml kibana.yml.default
編輯kibana.yml配置檔案
啟動kibana服務
bin/kibana
打開浏覽器輸入http://192.168.2.30:5601
點選create按鈕後,然後點選上面的discover按鈕,注意如果沒資料的話,注意看看導入的時間@timestamp和現在的時間對比一下,kibana預設隻顯示最近15分鐘的資料,如果超出15分鐘請選擇适當的時間,從kibana可以看到messages-log裡面的4條資料都正常導入了。這就也完成我們的實作的第一個效果。但是這僅僅是把流程跑通了,接下來我們需要做的事情還有更多。注意隻能先導入資料到es後才能在kibana建立索引。
現在需要實作第二個效果,我們首先清除elasticsearch中的資料,其實删不删除無所謂,這裡隻是為了示範一下es中資料存儲的位置。
rm -rf /usr/local/elasticsearch/data/nodes
關閉elasticsearch服務然後重新啟動,剛剛删除的nodes目錄又會重新被初始化建立,再次重新整理kibana頁面的discover按鈕,把時間軸修改成最近5年的資料,确實報找不到資料了。
5、安裝apache節點,為了簡單測試我就直接yum安裝
yum install httpd -y
systemctl start httpd
apache節點作為用戶端安裝filebeat
安裝步驟參考上面
配置檔案如下所示:
停止logstash服務,然後重新指定一個test02.conf配置檔案,多了一個filter區域,這裡就是按照grok正則比對apache日志,将日志中的每一個字段按json格式導入,内容如下:
上圖中的的%{COMBINEDAPACHELOG}正則是預設logstash自帶的,具體位置參考如下:
/usr/local/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns/grok-patterns
上圖中grok-patterns檔案裡面有兩處COMMONAPACHELOG參數,上面一個是COMMONAPACHELOG參數,是apache作為nginx後端伺服器使用的日志格式,而下面一個COMBINEDAPACHELOG參數是直接調用上面COMMONAPACHELOG的參數再加兩個參數作為web伺服器使用的日志格式,這裡我将apache作為web伺服器使用,是以用COMBINEDAPACHELOG參數即可!如果是作為nginx後端的web伺服器使用就用COMMONAPACHELOG參數即可!每個參數裡面格式都是以冒号分割,前面是grok-pattrens中定義的變量,後面可以自定義變量的名稱,每個%代表一個比對的參數
啟動logstash前檢查配置檔案test02.conf是否有文法錯誤
正式啟動logstash,這裡因為資料比較多,就隻截取一條資料的圖
從上圖中我們可以看到已經将apache日志的每個字段按json格式導入到elasticsearch中,另外還多了一些字段,比如最讓人弄混淆的是timestamp和@timestamp這兩個,前者就是apache的通路時間,後者你可以了解為logstash處理的時間,比我們中原標準時間晚8小時,我覺得這個時間基本很少使用,我們再從kibana裡查詢資料條數的準确性,6hits表示有6條資料,跟我們上面access_log裡面的數量正好對上。
點選任意一條資料的箭頭,然後點選json,我們看到apache日志的所有字段都已經按照json格式存儲,比如請求、狀态碼、請求大小等等。
試一試模糊搜尋,搜尋某一通路時間内狀态碼為404
搜尋狀态碼大于400小于499
從上圖我們基本知道當搜尋條件變得越來越嚴謹的時候,我們唯一的方法就是将我們的資料按字段拆分存儲到elasticsearch裡面。這樣搜尋後就是我們需要的内容。這基本完成了我們要實作的第二個效果。
接着往下走,我們需要将apache、nginx、系統日志根據不同的日志格式存儲到elasticsearch裡面,首先每台機器都需要收集系統日志、然後根據不同的業務收集不同業務的伺服器日志。這裡apache收集apache和系統日志、nginx也收集nginx和系統日志。
6、安裝nginx節點,nginx作為前端反向代理伺服器使用
點選(此處)折疊或打開
. yum install epel-release -y
. yum install nginx -y
首先我們看一下nginx預設的日志格式
一般我們會在日志後面增加三個轉發參數,後端伺服器傳回的位址、後端程式傳回狀态碼、後端程式響應時間
注意nginx日志格式在logstash的grok裡面預設是沒有的,但是和apache一樣基本都是作為web伺服器使用,很多字段參數都可以共用,這裡直接在grok-patterns檔案增加一個COMMONNGINX參數
COMMONNGINXLOG
%{COMBINEDAPACHELOG} %{QS:x_forwarded_for} (?:%{HOSTPORT1:upstream_addr}|-)
(%{STATUS:upstream_status}|-) (%{BASE16FLOAT:upstream_response_time}|-)
前面到$http_x_forwarded_for參數可以直接調用apache的,後面四個自己定義,注意冒号前面的變量一定要定義,比如HOSTPORT1和STATUS就是logstash預設沒有的變量名,是以我們需要用正則比對,在grok-patterns檔案的上面加上如下内容:
儲存退出,然後直接調用COMMONNGINXLOG參數即可!
現在到了定義系統日志了,雖然預設裡面有但是不能很好的滿足我們的需求,我們手動編寫一個正則添加到grok-patterns檔案裡面
SYSLOG
%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname}
%{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?:
%{GREEDYDATA:syslog_message}
patterns”。
現在需要調試一下nginx轉發請求到apache伺服器處理。也就是nginx是前端反向代理,apache是後端伺服器。
編輯nginx主配置檔案nginx.conf,将location /修改為如下所示:
啟動nginx服務
systemctl start nginx
nginx上安裝filebeat(步驟參考上面即可)
nginx的filebeat配置檔案如下:
nginx的建立messages_log檔案内容如下:
修改apache主配置檔案httpd.conf檔案,将日志的格式修改一下,因為現在是作為後端web伺服器使用,不需要記錄agent等資訊。
将這行注釋去掉
CustomLog
"logs/access_log" common
将這行前加上注釋
"logs/access_log" combined
在apache伺服器預設根目錄下面/var/www/html目錄下建立一個test.html檔案,内容随便寫點什麼都行:
重新開機apache服務
Systemctl
restart httpd
通路nginx服務
nginx日志出現如下界面說明正常
192.168.9.106 - - [10/May/2017:09:14:28 +0800] "GET /test.html HTTP/1.1" 200 14 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36" "-" 192.168.2.25:80 200 0.002
192.168.9.106 - - [10/May/2017:09:14:28 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://192.168.2.26/test.html" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36" "-" 192.168.2.25:80 404 0.001
apache日志出現如下界面說明正常
192.168.2.26 - - [10/May/2017:09:14:31 +0800] "GET /test.html HTTP/1.0" 200 14
192.168.2.26 - - [10/May/2017:09:14:31 +0800] "GET /favicon.ico HTTP/1.0" 404 209
apache的filebeat配置檔案如下:
apache的建立messages_log檔案内容如下:
這裡所有的配置和測試檔案都準備齊了,nginx和apache伺服器日志各2條資料,系統日志各2條,也就是8條資料。
最後就是我們的重頭戲了,logstash的test03.conf配置檔案如下:
注意這次apache的正則比對被我修改了,因為是作為後端伺服器使用,為了驗證資料導入的正确性,清除elastucsearch中的資料和nginx、apache用戶端上filebeat導入的記錄點資訊,注意清除記錄點資訊要先停止filebeat服務,然後再删除registry檔案再啟動filebeat服務。elasticsearch清除資料參考上面步驟。
啟動logstash,隻截圖一個系統的通路日志導入,可以看到系統日志也按日志格式字段導入到elasticsearch中存儲了。
從kibana可以看到資料正好是8條
我們随便看一條系統日志導入後的json格式,主要按照SYSLOG正則分成了4個字段顯示,syslog_timestamp、syslog_hostname、syslog_program、syslog_message
我們再看一下nginx日志導入後的json格式,這裡nginx的字段就不一一解釋了。
這樣就實作了我們最開始需要展示的三個效果,當然這也隻是很基礎的搭建和配置,一些關于ELK更進階的使用方法請查詢官方文檔。
<b>常見問題彙總:</b><b></b>
1、監聽檔案新增内容重複導入
一般是直接編輯檔案新增内容導緻,正确的做法是echo “xxx” >> filename
2、Kibana裡面查詢沒資料但是elasticsearch裡面有
可能是查詢資料的時間沒選正确
3、Logstash啟動巨慢
安裝epel源然後安裝haveged并啟動,重新開機logstash
4、Yum安裝的logstash能啟動,但是無法導入資料到elasticsearch裡面
一般情況下yum安裝的elasticsearch和kibana沒什麼大問題,但是logstash不行,好像不太好指定配置檔案,會遇到很多坑
5、資料導入後沒有按照規定的正則以json方式展現
一般是資料的格式和正則對不上