一、前言:
日志分析是我們運維解決系統故障、發現問題的主要手段。為了可以集中管理多台服務器的日志記錄,開源實時日志分析ELK平台應用而生,ELK由Elasticsearch、Logstash和Kibana三個開源工具組成,這三個工具可以分別部署在不同的服務器上,並且相互關聯,不過需要收集哪台服務器的日志,就須在該服務器上部署Logstash。更多相關介紹,請移步至Elastic官網。
ELK的工作原理如下(懂得其中原理,才可部署一個高可用的ELK平台):
Logstash收集APPServer(應用服務器)產生的log,並存放到Elasticsearch群集中,而Kibana則從Elasticsearch群集中查詢數據生成圖表,在返回給browser(瀏覽器)。簡單來說,進行日志處理分析,一般需要以下幾個步驟:
1、Logstash將日志進行集中化管理。
2、Logstash將日志進行集中化管理。
3、Elasticsearch對格式化后的數據進行索引和存儲。
4、Kibana對前端數據的展示。
二、搭建ELK平台:
操作系統 | 主機名/IP地址 | 軟件安裝 |
Centos 7.6 | lb01/192.168.11.61 | Elasticsearch Kibana |
Centos 7.6 | lb02/192.168.11.62 | Elasticsearch |
Centos 7.6 | lb/192.168.11.60 | Logstash/apache/nginx |
Centos 7.6 | lb03/192.168.11.63 | filebeat |
所有節點關閉防火牆、Selinux、配置java環境變量;
lb01 節點:
[root@lb01 ~]# hostname #查看主機名 lb01 [root@lb01 ~]# cat /etc/hosts #更改本地解析文件,添加如下兩行 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.11.61 lb01 # 添加 192.168.11.62 lb02 # 添加 [root@lb01 ~]# java -version #檢查Java環境 openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-b13) OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
lb01 節點:
[root@lb02 ~]# hostname #查看主機名 lb02 [root@lb02 ~]# cat /etc/hosts #更改本地解析文件,添加如下兩行 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.11.61 lb01 # 添加 192.168.11.62 lb02 # 添加 [root@lb02 ~]# java -version #檢查Java環境 openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-b13) OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
二、安裝Elasticsearch
lb01 節點配置:
[root@lb01 ~]# cd /usr/local/ [root@lb01 local]# rpm -ivh elasticsearch-6.4.0.rpm [root@lb01 local]# vim /etc/elasticsearch/elasticsearch.yml #修改如下,注意刪除注釋符號 cluster.name: my-elk-cluster #群集名字 node.name: lb01 #節點名字 path.data: /data/elk_data #數據存放路徑 path.logs: /var/log/elasticsearch/ #日志存放路徑 bootstrap.memory_lock: false #在啟動的時候不鎖定內存 network.host: 0.0.0.0 #提供服務綁定的IP地址,0.0.0.0代表所有地址 http.port: 9200 #偵聽端口 discovery.zen.ping.unicast.hosts: ["lb01", "lb02"] #群集發現通過單播實現 [root@lb01 local]# mkdir -p /data/elk_data #創建數據存放目錄 [root@lb01 local]# chown -R elasticsearch:elasticsearch /data/elk_data/ #更改屬主及屬組 [root@lb01 local]# chown -R elasticsearch:elasticsearch /var/log/elasticsearch/ [root@lb01 local]# systemctl start elasticsearch.service #啟動服務 [root@lb01 local]# netstat -tunlp | grep java tcp6 0 0 :::9200 :::* LISTEN 19296/java tcp6 0 0 :::9300 :::* LISTEN 19296/java
lb02 節點配置:
[root@lb02 ~]# cd /usr/local/ [root@lb02 local]# rpm -ivh elasticsearch-6.4.0.rpm [root@lb02 local]# vim /etc/elasticsearch/elasticsearch.yml #修改如下,注意刪除注釋符號 cluster.name: my-elk-cluster #群集名字 node.name: lb02 #節點名字 path.data: /data/elk_data #數據存放路徑 path.logs: /var/log/elasticsearch/ #日志存放路徑 bootstrap.memory_lock: false #在啟動的時候不鎖定內存 network.host: 0.0.0.0 #提供服務綁定的IP地址,0.0.0.0代表所有地址 http.port: 9200 #偵聽端口 discovery.zen.ping.unicast.hosts: ["lb01", "lb02"] #群集發現通過單播實現 [root@lb02 local]# mkdir -p /data/elk_data #創建數據存放目錄 [root@lb02 local]# chown -R elasticsearch:elasticsearch /data/elk_data/ #更改屬主及屬組 [root@lb02 local]# chown -R elasticsearch:elasticsearch /var/log/elasticsearch/ [root@lb02 local]# systemctl start elasticsearch.service #啟動服務 [root@lb02 local]# netstat -tunlp | grep java tcp6 0 0 :::9200 :::* LISTEN 19296/java tcp6 0 0 :::9300 :::* LISTEN 19296/java
3、查看節點信息:
lb01節點信息:
lb02節點信息:
訪問http://192.168.11.61:9200/_cluster/health?pretty 查看群集的健康狀態:
訪問http://192.168.11.61:9200/_cluster/state?pretty 查看群集的狀態信息:
通過以上方式查看群集狀體對我們顯示的並不友好,可以通過安裝Elasticsearch-head插件,可以更方便的管理群集:
在lb01安裝Elasticsearch-head插件:
方法一、
導入node-v8.2.1.tar.gz phantomjs-2.1.1-linux-x86_64.tar.bz2 安裝包
安裝node:
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure && make && make install
安裝phantomjs:
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/bin/
cp phantomjs /usr/local/bin/
導入es-head程序包並解壓:
unzip master.zip –d /usr/local/
cd elasticsearch-head/
npm install
npm run start &
查看端口狀態:(端口默認9100)
netstat –anpt | grep 9100
方法二、(本次采用此方法)
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start &
netstat –anpt | grep 9100
方法三、
拉取鏡像: docker push mobz/elasticsearch-head:5
啟動鏡像: docker run -p 9100:9100 mobz/elasticsearch-head:5
web訪問測試: http://IP:9100
[root@lb01 local]# cd /usr/local/elasticsearch-head [root@lb01 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml #編輯主配置文件,在任意位置添加如下兩行: http.cors.enabled: true #添加該行,開啟跨域訪問支持 http.cors.allow-origin: "*" #添加該行,跨域訪問允許的域名地址 [root@node1 elasticsearch-head]# systemctl restart elasticsearch #重啟服務 [root@node1 elasticsearch-head]# npm run start & #設置服務后台啟動,如果前台啟動,一旦關閉中斷,服務也將關閉。 #並且啟動服務時,必須在解壓后的elasticsearch-head下啟動服務, #進程會讀取該目錄下的一個文件,否則可能啟動失敗。 [root@lb01 elasticsearch-head]# netstat -tunlp | grep 9100 tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 25339/grunt
現在就可以通過瀏覽器訪問http://192.168.1.1:9100 去查看群集信息了,如下:
4、安裝Kibana(可單獨安裝在一台服務器上,此處安裝在lb01節點上面):
[root@lb01 local]# rpm -ivh kibana-6.4.0-x86_64.rpm [root@lb01 local]# systemctl enable kibana [root@lb01 local]# vim /etc/kibana/kibana.yml server.port: 5601 #Kibana打開的端口 server.host: "0.0.0.0" #Kibana偵聽的地址,0.0.0.0代表該主機上的所有地址 elasticsearch.url: "http://192.168.1.1:9200" #和Elasticsearch建立連接 kibana.index: ".kibana" #在Elasticsearch中添加.kibana索引 [root@lb01 local]# systemctl start kibana #啟動Kibana
5、配置apache、logstash服務
[root@lb ~]# yum -y install httpd [root@lb ~]# systemctl start httpd [root@lb ~]# cd /usr/local [root@lb local]# rpm -ivh logstash-6.4.0.rpm [root@lb ~]# systemctl enable logstash.service [root@lb ~]# cd /etc/logstash/conf.d/ #切換至指定路徑 [root@lb conf.d]# vim apache_log.conf #編輯采集apache日志文件和系統日志 #以下就以系統日志為例做解釋,其余的照着來就行,格式都差不多 input { file{ path => "/var/log/messages" #指定要收集的日志文件 type => "system" #指定類型為system,可以自定義,type值和output{ } 中的type對應即可 start_position => "beginning" #從開始處收集 } file{ path => "/etc/httpd/logs/access_log" type => "access" start_position => "beginning" } file{ path => "/etc/httpd/logs/error_log" type => "error" start_position => "beginning" } } output { if [type] == "system" { #如果type為system, elasticsearch { #就輸出到Elasticsearch服務器 hosts => ["192.168.11.61:9200"] #Elasticsearch監聽地址及端口 index => "system-%{+YYYY.MM.dd}" #指定索引格式 } } if [type] == "access" { elasticsearch { hosts => ["192.168.11.61:9200"] index => "apache_access-%{+YYYY.MM.dd}" } } if [type] == "error" { elasticsearch { hosts => ["192.168.11.61:9200"] index => "apache_error-%{+YYYY.MM.dd}" } } } #寫完保存退出即可。 [root@lb conf.d]# chmod o+r /var/log/messages #賦予該目錄其他人的讀權限 [root@lb conf.d]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ #創建命令軟連接 [root@lb conf.d]# systemctl start logstash #啟動服務 [root@lb conf.d]# logstash -f apache_log.conf & #指定剛才編寫文件為Logstash的配置文件,並且在后台運行
6、創建索引:
1、通過瀏覽器訪問 http://192.168.11.61:9100 查看索引是否創建:
關於索引,有幾個很重要的概念:
索引:類似於關系數據庫中的“庫”;
Type(編寫Logstash時指定的type):類似於關系數據庫中的“表”;
剛才創建的索引,在我標記紅框中,可以看到lb01和lb02對應的位置,都有綠色背景的0、1、2、3、4、5表示是該索引被分為了5個分片,其中因為在Logstash中指定的Elasticsearch服務器是lb01,所以lb01的分片是主分片,lb02會自動同步lb01的分片,lb02的分片為備份分片,稱為副本,用來提供數據冗余及負載分擔。默認情況下,Elasticsearch自動對索引請求進行負載分擔。
現在訪問http://192.168.11.61:5601 登錄到Kibana,添加索引:
7、下面講解如何收集syslog日志;
[root@lb ~]# vim /etc/logstash/conf.d/syslog.conf # 加入如下內容 input { # 定義日志源 syslog { type => "system-syslog" # 定義類型 port => 10514 # 定義監聽端口 } } output { # 定義日志輸出 stdout { codec => rubydebug # 將日志輸出到當前的終端上顯示 } }
檢測配置文件是否有錯:
[root@lb ~]# cd /etc/logstash/conf.d/ #進入安裝目錄 ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit Configuration OK # 為ok則代表配置文件沒有問題 命令說明: --path.settings 用於指定logstash的配置文件所在的目錄 -f 指定需要被檢測的配置文件的路徑 --config.test_and_exit 指定檢測完之后就退出,不然就會直接啟動了
配置kibana服務器的ip以及配置的監聽端口:
[root@lb conf.d]# vim /etc/rsyslog.conf #### RULES #### *.* @192.168.11.61:10514
重啟rsyslog,讓配置生效:
[root@lb conf.d]# systemctl restart rsyslog
配置logstash
以上只是測試的配置,這一步我們需要重新改一下配置文件,讓收集的日志信息輸出到es服務器中,而不是當前終端:
[root@lb conf.d]# vim /etc/logstash/conf.d/syslog.conf input { # 定義日志源 syslog { type => "system-syslog" # 定義類型 port => 10514 # 定義監聽端口 } } output { # 定義日志輸出 elasticsearch { hosts => ["192.168.11.61:9200"] # 定義es服務器的ip index => "system-syslog-%{+YYYY.MM}" # 定義索引 } }
同樣的需要檢測配置文件有沒有錯:
[root@lb conf.d]# cd /etc/logstash/conf.d/ [root@lb conf.d]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit Configuration OK #表示通過檢測正常
文件夾權限設置
[root@lb ~]# chown logstash /var/log/logstash/logstash-plain.log [root@lb ~]# chown -R logstash /var/lib/logstash/ [root@lb ~]# systemctl restart logstash
修改監聽端口
[root@lb ~]# vim /etc/logstash/logstash.yml http.host: "192.168.11.60" #改成本機IP地址 [root@lb ~]# systemctl restart logstash [root@lb ~]# netstat -tunlp | egrep "10514|9600" tcp6 0 0 :::10514 :::* LISTEN 9556/java tcp6 0 0 192.168.11.60:9600 :::* LISTEN 9556/java udp 0 0 0.0.0.0:10514 0.0.0.0:* 9556/java
kibana上查看日志
logstash服務器的搭建之后,回到kibana服務器上查看日志,執行以下命令可以獲取索引信息:
[root@lb01 ~]# curl '192.168.11.61:9200/_cat/indices?v' health status index green open .kibana -8Yy0C2GQWOgNQxnAdSlug 1 1 7 0 108.4kb 54.2kb green open system-2020.04.30 __WslC-GRxOxoXHFwuK5Mg 5 1 158982 0 29.9mb 14.9mb
如上,可以看到,在logstash配置文件中定義的system-syslog索引成功獲取到了,證明配置沒問題,logstash與es通信正常。
獲取指定索引詳細信息:
[root@lb01 ~]# curl -XGET '192.168.11.61:9200/system-syslog-2020.04?pretty'
如果日后需要刪除索引的話,使用以下命令可以刪除指定索引:
[root@lb01 ~]# curl -XDELETE 'localhost:9200/system-syslog-2020.04'
es與logstash能夠正常通信后就可以去配置kibana了,瀏覽器訪問192.168.77.128:5601,到kibana頁面上配置索引:
8、logstash收集nginx日志
和收集syslog一樣,首先需要編輯配置文件,這一步在logstash服務器上完成:
[root@lb ~]# vim /etc/logstash/conf.d/nginx.conf input { file { # 指定一個文件作為輸入源 path => "/tmp/elk_access.log" # 指定文件的路徑 start_position => "beginning" # 指定何時開始收集 type => "nginx" # 定義日志類型,可自定義 } } filter { # 配置過濾器 grok { match => { "message" => "%{IPORHOST:http_host} %{IPORHOST:clientip} - %{USERNAME:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:http_verb} %{NOTSPACE:http_request}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" %{NUMBER:response} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{QS:xforwardedfor} %{NUMBER:request_time:float}"} # 定義日志 的輸出格式 } geoip { source => "clientip" } } output { stdout { codec => rubydebug } elasticsearch { hosts => ["192.168.11.61:9200"] index => "nginx-test-%{+YYYY.MM.dd}" } }
同樣的編輯完配置文件之后,還需要檢測配置文件是否有錯:
[root@lb conf.d]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/nginx.conf --config.test_and_exit
檢查完畢之后,進入你的nginx虛擬主機配置文件所在的目錄中,新建一個虛擬主機配置文件:
[root@lb ~]# cd /usr/local/nginx/conf/vhost/ [root@lb ~]# vim elk.conf server { listen 80; server_name elk.test.com; location / { proxy_pass http://192.168.77.128:5601; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } access_log /tmp/elk_access.log main2; }
配置nginx的主配置文件,因為需要配置日志格式,在 log_format combined_realip
那一行的下面增加以下內容:
[root@lb ~]# vim /usr/local/nginx/conf/nginx.conf log_format main2 '$http_host $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$upstream_addr" $request_time';
完成以上配置文件的編輯之后,檢測配置文件有沒有錯誤,沒有的話就reload重新加載:
[root@lb ~]# nginx -t
[root@lb ~]# nginx -s reload
訪問成功后,查看生成的日志文件:
[root@lb ~]# ls /tmp/elk_access.log /tmp/elk_access.log [root@lb ~]# wc -l !$ wc -l /tmp/elk_access.log 60 /tmp/elk_access.log #nginx的訪問日志已經生成
[root@lb ~]# systemctl restart logstash
重啟完成后,在es服務器上檢查是否有nginx-test開頭的索引生成:
[root@lb01 ~]# curl '192.168.11.61:9200/_cat/indices?v' health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open .kibana -8Yy0C2GQWOgNQxnAdSlug 1 1 7 0 108.4kb 54.2kb green open nginx-test-2020.04.29 SAsQdgVPTkSI82OIr0jrYg 5 1 27458 0 6.2mb 3.1mb #可以看到,nginx-test索引已經生成了
這時候可以進入kibana的web頁面進行索引的配置;
9、使用beats采集日志
之前也介紹過beats是ELK體系中新增的一個工具,它屬於一個輕量的日志采集器,以上我們使用的日志采集工具是logstash,但是logstash占用的資源比較大,沒有beats輕量,所以官方也推薦使用beats來作為日志采集工具。而且beats可擴展,支持自定義構建。
在 192.168.11.63 上安裝filebeat,filebeat是beats體系中用於收集日志信息的工具
[root@lb03 ]# cd /usr/local [root@lb03 local]# rpm -ivh filebeat-6.4.0-x86_64.rpm
安裝完成之后編輯配置文件:
[root@lb03 local]# vim /etc/filebeat/filebeat.yml filebeat.prospectors: - type: log #enabled: false 這一句要注釋掉 paths: - /var/log/messages # 指定需要收集的日志文件的路徑 #output.elasticsearch: # 先將這幾句注釋掉 # Array of hosts to connect to. # hosts: ["localhost:9200"] output.console: # 指定在終端上輸出日志信息 enable: true
配置完成之后,執行以下命令,看看是否有在終端中打印日志數據,有打印則代表filebeat能夠正常收集日志數據:
[root@lb03 local]# filebeat -c /etc/filebeat/filebeat.yml
以上的配置只是為了測試filebeat能否正常收集日志數據,接下來我們需要再次修改配置文件,將filebeat作為一個服務啟動:
[root@lb03 local]# vim /etc/filebeat/filebeat.yml #output.console: 把這兩句注釋掉 # enable: true # 把這兩句的注釋去掉 output.elasticsearch: # Array of hosts to connect to. hosts: ["192.168.11.61:9200"] # 並配置es服務器的ip地址
修改完成后啟動filebeat服務
[root@lb03 local]# systemctl start filebeat
啟動成功后,到es服務器上查看索引,可以看到新增了一個以filebeat開頭的索引,這就代表filesbeat和es能夠正常通信了:
[root@lb01 ~]# curl '192.168.11.61:9200/_cat/indices?v' health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open filebeat-6.4.0-2020.04.30 Pj8aoYx0TS68g5CKMuOWwg 3 1 8411 0 2.5mb 1.2mb
現在可以通過kibana進行添加索引,查看日志
以上這就是如何使用filebeat進行日志的數據收集,可以看到配置起來比logstash要簡單,而且占用資源還少。