我們的公共號(hào)
來自隊(duì)員 諄諄 擬寫
簡單介紹:
ELK是三個(gè)開源工具組成,簡單解釋如下:
Elasticsearch是個(gè)開源分布式搜索引擎,它的特點(diǎn)有:分布式,零配置,自動(dòng)發(fā)現(xiàn),索引自動(dòng)分片,索引副本機(jī)制,restful風(fēng)格接口,多數(shù)據(jù)源,自動(dòng)搜索負(fù)載等。
Logstash是一個(gè)完全開源的工具,它可以對(duì)你的日志進(jìn)行收集、過濾,并將其存儲(chǔ)供以后使用(如,搜索)。
Kibana 也是一個(gè)開源和免費(fèi)的工具,它可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助您匯總、分析和搜索重要數(shù)據(jù)日志。
場景分析:
日志主要包括系統(tǒng)日志、應(yīng)用程序日志和安全日志等等。運(yùn)維人員和開發(fā)人員可以通過日志了解服務(wù)器軟硬件信息、檢查配置過程中的錯(cuò)誤及錯(cuò)誤發(fā)生的原因。經(jīng)常分析日志可以了解服務(wù)器的負(fù)荷,性能安全性,從而及時(shí)采取措施糾正錯(cuò)誤。
通常,日志被分散的儲(chǔ)存不同的設(shè)備上。如果你管理數(shù)十上百臺(tái)服務(wù)器,你還在使用依次登錄每臺(tái)機(jī)器的傳統(tǒng)方法查閱日志。這樣是不是感覺很繁瑣和效率低下。當(dāng)務(wù)之急我們使用集中化的日志管理,例如:開源的syslog,將所有服務(wù)器上的日志收集匯總。
集中化管理日志后,日志的統(tǒng)計(jì)和檢索又成為一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實(shí)現(xiàn)檢索和統(tǒng)計(jì),但是對(duì)于要求更高的查詢、排序和統(tǒng)計(jì)等要求和龐大的機(jī)器數(shù)量依然使用這樣的方法難免有點(diǎn)力不從心。
這里采用開源實(shí)時(shí)日志分析ELK平臺(tái)能夠完美的解決我們上述的問題,當(dāng)然也還有別的平臺(tái)或者工具可以使用,這里只討論ELK,官方網(wǎng)站:https://www.elastic.co
截止目前elk官網(wǎng)提供最新穩(wěn)定版本為5.4.0
需要實(shí)現(xiàn)效果:
1、系統(tǒng)messages日志通過本地beat方式(數(shù)據(jù)不做任何處理)導(dǎo)入到elasticsearch中,最后通過kibana可以查詢。
2、Apache訪問日志通過遠(yuǎn)程beat方式(數(shù)據(jù)經(jīng)過處理)導(dǎo)入到elasticsearch中,通過kibana可以搜索日志中任何一個(gè)字段展示,也可以組合模糊查詢索。 也就是說將apache日志按json格式存儲(chǔ)到elasticsearch中。
3、不同客戶端的Nginx訪問日志、Apache訪問日志、系統(tǒng)日志均通過不同的匹配條件正則處理導(dǎo)入到elasticsearch中。Nginx和系統(tǒng)日志需要編寫簡單對(duì)應(yīng)的正則表達(dá)式。
主要注意事項(xiàng):
1、Elk版本號(hào)保持一致。
2、所有節(jié)點(diǎn)操作系統(tǒng)版本最好保持一致,盡可能使用目前centos7.3穩(wěn)定版本。Elk三個(gè)節(jié)點(diǎn)的配置需要比其它節(jié)點(diǎn)都要高一點(diǎn),為2C4G,其它均為2C2G。內(nèi)存太低這都是我踩過的坑。要求所有節(jié)點(diǎn)均能通外網(wǎng),需要安裝軟件包。
3、關(guān)閉防火墻和selinux。
4、elk為了統(tǒng)一都使用tar包安裝所有軟件。用yum安裝特別是logstash會(huì)遇到很多坑。
5、搭建過程不難,難的是各個(gè)項(xiàng)目互相調(diào)試,難的是elk的高級(jí)使用方法。
說明:
本文目的只帶你入門,至于elk更高級(jí)的應(yīng)用和使用方法請查看官網(wǎng)或者其它技術(shù)文檔。這里把所有的應(yīng)用都單獨(dú)分開部署是為了以后部署到docker容器中。當(dāng)然你也可以都部署在一臺(tái)服務(wù)器上。
詳細(xì)信息:
IP地址 | 主機(jī)名 | 用途 | 安裝軟件 |
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 | 存儲(chǔ)數(shù)據(jù) | elasticsearch |
192.168.2.30 | kibana | 查詢數(shù)據(jù) | kibana |
安裝步驟:
1、Elk三個(gè)節(jié)點(diǎn)安裝jdk,jdk可以去oracle官方網(wǎng)站下載,版本號(hào)可以和我的不一樣
點(diǎn)擊(此處)折疊或打開
rpm -ivh jdk-8u102-linux-x64.rpm
2、安裝elasticsearch節(jié)點(diǎn)
點(diǎn)擊(此處)折疊或打開
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默認(rèn)配置文件,以防修改出錯(cuò)
cp elasticsearch.yml elasticsearch.yml.default
編輯后如下:
添加elasticsearch用戶,tar包啟動(dòng)必須使用普通用戶運(yùn)行
點(diǎn)擊(此處)折疊或打開
useradd elasticsearch
chown -R elasticsearch:elasticsearch /usr/local/elasticsearch
打開sysctl.conf文件,添加如下內(nèi)容:
點(diǎn)擊(此處)折疊或打開
vm.max_map_count = 655360
sysctl -p /etc/sysctl.conf
打開/etc/security/limits.conf文件,修改打開文件句柄數(shù)
點(diǎn)擊(此處)折疊或打開
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
su – elasticsearch
cd /usr/local/elasticsearch
bin/elasticsearch
第一次啟動(dòng)需要一些時(shí)間,因?yàn)樾枰鲆恍┏跏蓟瘎?dòng)作,如果沒啟動(dòng)成功請查系elasticsearch的相關(guān)日志解決。注意上面只是前臺(tái)啟動(dòng)調(diào)試,在后臺(tái)需要加&,需要重新啟動(dòng)。
查看端口是否開啟
curl簡單的測試
3、安裝logstash節(jié)點(diǎn)
點(diǎn)擊(此處)折疊或打開
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并啟動(dòng),通過它來監(jiān)聽數(shù)據(jù)源文件的新增內(nèi)容經(jīng)過logstash處理后上傳到es里面。
點(diǎn)擊(此處)折疊或打開
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文件,內(nèi)容如下:
啟動(dòng)filebeat服務(wù)
點(diǎn)擊(此處)折疊或打開
cd /usr/local/filebeat
./filebeat &
注意filebeat沒有監(jiān)聽端口,主要看日志和進(jìn)程
新建一個(gè)本地文件messages-log,可以取幾條本機(jī)系統(tǒng)的messages文件,內(nèi)容如下:
注意filebeat監(jiān)聽的文件記錄信息在/usr/local/filebeat/data/registry
最后新建一個(gè)logstash的啟動(dòng)指定test.conf配置文件,內(nèi)容如下:
Logstash默認(rèn)有input、filter、output三個(gè)區(qū)域,一般最少需要配置input和output即可!
logstash的本身默認(rèn)的logstash.yml配置文件選擇不修改即可!
cd /usr/local/logstash
首先簡單的測試一下logstash不指定配置文件啟動(dòng)
點(diǎn)擊(此處)折疊或打開
bin/logstash -e ‘input { stdin { } } output { stdout {} }’
我們手動(dòng)輸入hello world它也會(huì)輸出hello world
然后指定配置文件test.conf啟動(dòng),注意這是在前臺(tái)啟動(dòng),方便調(diào)試
查看5044端口和9600端口是否開啟
等待一會(huì)后應(yīng)該會(huì)出現(xiàn)如下信息輸出,這也就是test.conf里面最后一行定義輸出到屏幕上。
但是配置文件中也輸入到elasticsearch當(dāng)中,我們驗(yàn)證一下:
注意下圖只截了一條數(shù)據(jù),如果想看完整的數(shù)據(jù),我們用kibana查看。
4、安裝kibana節(jié)點(diǎn)
點(diǎn)擊(此處)折疊或打開
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配置文件
啟動(dòng)kibana服務(wù)
點(diǎn)擊(此處)折疊或打開
bin/kibana
查看端口是否開啟
打開瀏覽器輸入http://192.168.2.30:5601
點(diǎn)擊create按鈕后,然后點(diǎn)擊上面的discover按鈕,注意如果沒數(shù)據(jù)的話,注意看看導(dǎo)入的時(shí)間@timestamp和現(xiàn)在的時(shí)間對(duì)比一下,kibana默認(rèn)只顯示最近15分鐘的數(shù)據(jù),如果超出15分鐘請選擇適當(dāng)?shù)臅r(shí)間,從kibana可以看到messages-log里面的4條數(shù)據(jù)都正常導(dǎo)入了。這就也完成我們的實(shí)現(xiàn)的第一個(gè)效果。但是這僅僅是把流程跑通了,接下來我們需要做的事情還有更多。注意只能先導(dǎo)入數(shù)據(jù)到es后才能在kibana創(chuàng)建索引。
現(xiàn)在需要實(shí)現(xiàn)第二個(gè)效果,我們首先清除elasticsearch中的數(shù)據(jù),其實(shí)刪不刪除無所謂,這里只是為了演示一下es中數(shù)據(jù)存儲(chǔ)的位置。
rm -rf /usr/local/elasticsearch/data/nodes
關(guān)閉elasticsearch服務(wù)然后重新啟動(dòng),剛剛刪除的nodes目錄又會(huì)重新被初始化創(chuàng)建,再次刷新kibana頁面的discover按鈕,把時(shí)間軸修改成最近5年的數(shù)據(jù),確實(shí)報(bào)找不到數(shù)據(jù)了。
5、安裝apache節(jié)點(diǎn),為了簡單測試我就直接yum安裝
點(diǎn)擊(此處)折疊或打開
yum install httpd -y
systemctl start httpd
用瀏覽器訪問http://192.168.2.25出現(xiàn)apache主界面,查看日志顯示如下,為了方便演示我這里只取6條數(shù)據(jù),4條狀態(tài)碼為“200”,一條“403”,一條“404”,現(xiàn)在我們需要將這幾條數(shù)據(jù)也通過logstash導(dǎo)入到elasticsearch中,然后通過kibana查詢。
apache節(jié)點(diǎn)作為客戶端安裝filebeat
安裝步驟參考上面
配置文件如下所示:
啟動(dòng)filebeat服務(wù)
點(diǎn)擊(此處)折疊或打開
./filebeat &
停止logstash服務(wù),然后重新指定一個(gè)test02.conf配置文件,多了一個(gè)filter區(qū)域,這里就是按照grok正則匹配apache日志,將日志中的每一個(gè)字段按json格式導(dǎo)入,內(nèi)容如下:
上圖中的的%{COMBINEDAPACHELOG}正則是默認(rèn)logstash自帶的,具體位置參考如下:
/usr/local/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns/grok-patterns
上圖中g(shù)rok-patterns文件里面有兩處COMMONAPACHELOG參數(shù),上面一個(gè)是COMMONAPACHELOG參數(shù),是apache作為nginx后端服務(wù)器使用的日志格式,而下面一個(gè)COMBINEDAPACHELOG參數(shù)是直接調(diào)用上面COMMONAPACHELOG的參數(shù)再加兩個(gè)參數(shù)作為web服務(wù)器使用的日志格式,這里我將apache作為web服務(wù)器使用,所以用COMBINEDAPACHELOG參數(shù)即可!如果是作為nginx后端的web服務(wù)器使用就用COMMONAPACHELOG參數(shù)即可!每個(gè)參數(shù)里面格式都是以冒號(hào)分割,前面是grok-pattrens中定義的變量,后面可以自定義變量的名稱,每個(gè)%代表一個(gè)匹配的參數(shù)
啟動(dòng)logstash前檢查配置文件test02.conf是否有語法錯(cuò)誤
正式啟動(dòng)logstash,這里因?yàn)閿?shù)據(jù)比較多,就只截取一條數(shù)據(jù)的圖
從上圖中我們可以看到已經(jīng)將apache日志的每個(gè)字段按json格式導(dǎo)入到elasticsearch中,另外還多了一些字段,比如最讓人弄混淆的是timestamp和@timestamp這兩個(gè),前者就是apache的訪問時(shí)間,后者你可以理解為logstash處理的時(shí)間,比我們北京時(shí)間晚8小時(shí),我覺得這個(gè)時(shí)間基本很少使用,我們再從kibana里查詢數(shù)據(jù)條數(shù)的準(zhǔn)確性,6hits表示有6條數(shù)據(jù),跟我們上面access_log里面的數(shù)量正好對(duì)上。
點(diǎn)擊任意一條數(shù)據(jù)的箭頭,然后點(diǎn)擊json,我們看到apache日志的所有字段都已經(jīng)按照json格式存儲(chǔ),比如請求、狀態(tài)碼、請求大小等等。
試一試模糊搜索,搜索某一訪問時(shí)間內(nèi)狀態(tài)碼為404
搜索狀態(tài)碼大于400小于499
從上圖我們基本知道當(dāng)搜索條件變得越來越嚴(yán)謹(jǐn)?shù)臅r(shí)候,我們唯一的方法就是將我們的數(shù)據(jù)按字段拆分存儲(chǔ)到elasticsearch里面。這樣搜索后就是我們需要的內(nèi)容。這基本完成了我們要實(shí)現(xiàn)的第二個(gè)效果。
接著往下走,我們需要將apache、nginx、系統(tǒng)日志根據(jù)不同的日志格式存儲(chǔ)到elasticsearch里面,首先每臺(tái)機(jī)器都需要收集系統(tǒng)日志、然后根據(jù)不同的業(yè)務(wù)收集不同業(yè)務(wù)的服務(wù)器日志。這里apache收集apache和系統(tǒng)日志、nginx也收集nginx和系統(tǒng)日志。
6、安裝nginx節(jié)點(diǎn),nginx作為前端反向代理服務(wù)器使用
點(diǎn)擊(此處)折疊或打開
. yum install epel-release -y
. yum install nginx -y
首先我們看一下nginx默認(rèn)的日志格式
一般我們會(huì)在日志后面增加三個(gè)轉(zhuǎn)發(fā)參數(shù),后端服務(wù)器返回的地址、后端程序返回狀態(tài)碼、后端程序響應(yīng)時(shí)間
注意nginx日志格式在logstash的grok里面默認(rèn)是沒有的,但是和apache一樣基本都是作為web服務(wù)器使用,很多字段參數(shù)都可以共用,這里直接在grok-patterns文件增加一個(gè)COMMONNGINX參數(shù)
COMMONNGINXLOG %{COMBINEDAPACHELOG} %{QS:x_forwarded_for} (?:%{HOSTPORT1:upstream_addr}|-) (%{STATUS:upstream_status}|-) (%{BASE16FLOAT:upstream_response_time}|-)
前面到$http_x_forwarded_for參數(shù)可以直接調(diào)用apache的,后面四個(gè)自己定義,注意冒號(hào)前面的變量一定要定義,比如HOSTPORT1和STATUS就是logstash默認(rèn)沒有的變量名,所以我們需要用正則匹配,在grok-patterns文件的上面加上如下內(nèi)容:
保存退出,然后直接調(diào)用COMMONNGINXLOG參數(shù)即可!
現(xiàn)在到了定義系統(tǒng)日志了,雖然默認(rèn)里面有但是不能很好的滿足我們的需求,我們手動(dòng)編寫一個(gè)正則添加到grok-patterns文件里面
SYSLOG %{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}
當(dāng)然也可借助于Grok Debugger或者Grok Comstructor工具來測試。添加自定義正則的時(shí)候,在Grok Debugger中可以勾選“Add custom patterns”。
現(xiàn)在需要調(diào)試一下nginx轉(zhuǎn)發(fā)請求到apache服務(wù)器處理。也就是nginx是前端反向代理,apache是后端服務(wù)器。
編輯nginx主配置文件nginx.conf,將location /修改為如下所示:
啟動(dòng)nginx服務(wù)
點(diǎn)擊(此處)折疊或打開
systemctl start nginx
nginx上安裝filebeat(步驟參考上面即可)
nginx的filebeat配置文件如下:
nginx的新建messages_log文件內(nèi)容如下:
修改apache主配置文件httpd.conf文件,將日志的格式修改一下,因?yàn)楝F(xiàn)在是作為后端web服務(wù)器使用,不需要記錄agent等信息。
將這行注釋去掉
CustomLog “l(fā)ogs/access_log” common
將這行前加上注釋
CustomLog “l(fā)ogs/access_log” combined
在apache服務(wù)器默認(rèn)根目錄下面/var/www/html目錄下創(chuàng)建一個(gè)test.html文件,內(nèi)容隨便寫點(diǎn)什么都行:
重啟apache服務(wù)
Systemctl restart httpd
訪問nginx服務(wù)
nginx日志出現(xiàn)如下界面說明正常
點(diǎn)擊(此處)折疊或打開
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日志出現(xiàn)如下界面說明正常
點(diǎn)擊(此處)折疊或打開
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文件內(nèi)容如下:
這里所有的配置和測試文件都準(zhǔn)備齊了,nginx和apache服務(wù)器日志各2條數(shù)據(jù),系統(tǒng)日志各2條,也就是8條數(shù)據(jù)。
最后就是我們的重頭戲了,logstash的test03.conf配置文件如下:
注意這次apache的正則匹配被我修改了,因?yàn)槭亲鳛楹蠖朔?wù)器使用,為了驗(yàn)證數(shù)據(jù)導(dǎo)入的正確性,清除elastucsearch中的數(shù)據(jù)和nginx、apache客戶端上filebeat導(dǎo)入的記錄點(diǎn)信息,注意清除記錄點(diǎn)信息要先停止filebeat服務(wù),然后再刪除registry文件再啟動(dòng)filebeat服務(wù)。elasticsearch清除數(shù)據(jù)參考上面步驟。
啟動(dòng)logstash,只截圖一個(gè)系統(tǒng)的訪問日志導(dǎo)入,可以看到系統(tǒng)日志也按日志格式字段導(dǎo)入到elasticsearch中存儲(chǔ)了。
從kibana可以看到數(shù)據(jù)正好是8條
我們隨便看一條系統(tǒng)日志導(dǎo)入后的json格式,主要按照SYSLOG正則分成了4個(gè)字段顯示,syslog_timestamp、syslog_hostname、syslog_program、syslog_message
我們再看一下nginx日志導(dǎo)入后的json格式,這里nginx的字段就不一一解釋了。
這樣就實(shí)現(xiàn)了我們最開始需要展示的三個(gè)效果,當(dāng)然這也只是很基礎(chǔ)的搭建和配置,一些關(guān)于ELK更高級(jí)的使用方法請查詢官方文檔。
常見問題匯總:
1、監(jiān)聽文件新增內(nèi)容重復(fù)導(dǎo)入
一般是直接編輯文件新增內(nèi)容導(dǎo)致,正確的做法是echo “xxx” >> filename
2、Kibana里面查詢沒數(shù)據(jù)但是elasticsearch里面有
可能是查詢數(shù)據(jù)的時(shí)間沒選正確
3、Logstash啟動(dòng)巨慢
安裝epel源然后安裝haveged并啟動(dòng),重啟logstash
4、Yum安裝的logstash能啟動(dòng),但是無法導(dǎo)入數(shù)據(jù)到elasticsearch里面
一般情況下yum安裝的elasticsearch和kibana沒什么大問題,但是logstash不行,好像不太好指定配置文件,會(huì)遇到很多坑
5、數(shù)據(jù)導(dǎo)入后沒有按照規(guī)定的正則以json方式展現(xiàn)
一般是數(shù)據(jù)的格式和正則對(duì)不上
高清原文 烏龜運(yùn)維 wuguiyunwei.com
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。