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要简单,而且占用资源还少。

 

posted @ 2020-04-28 16:48  区域管理员  阅读(646)  评论(0编辑  收藏  举报