Centos7.6搭建ELK日志分析系統


一、前言:

日志分析是我們運維解決系統故障、發現問題的主要手段。為了可以集中管理多台服務器的日志記錄,開源實時日志分析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要簡單,而且占用資源還少。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM