天天看点

ELK日志分析平台

什么是ELK呢?

ELK是三个组件的缩写, 分别是elasticsearch, logstash, kibana. ELK平台可以用于实现日志收集、日志搜索和日志分析

1.elasticsearch(es): 它是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

2.logstash: 简单说是一个日志收集工具, 可以定义从哪里获取数据, 并且可以简单处理数据, 最后可以定义将数据输出到哪里, 一般输出到es.

3.kibana: 其实就是一个数据展示界面, 并且可以分析数据, 例如从es中读取数据进行展示分析. es自己也带有简单的展示dashboard: http://127.0.0.1:9200/_plugin/head/, 当然 前提是你安装了head插件

如何搭建一个ELK日志分析平台呢?

一.单机安装elasticsearch

1.利用安装elasticsearch的rpm包安装

yum install elasticsearch-..rpm
           

2.配置elasticsearch的配置文件

cd /etc/elasticsearch/
vim elasticsearch.yml                     # 主配置文件
 cluster.name: my-es                    # 集群的名称my-es
 node.name: server1                     # 当前节点的主机名
 path.data: /var/lib/elasticsearch/     # 数据目录
 path.logs: /var/log/elasticsearch/     # 日志目录
 network.host:                # 当前主机的IP
 http.port:                         # 对外端口号
           
ELK日志分析平台
ELK日志分析平台
ELK日志分析平台

3.安装java环境(因为Elasticsearch是用Java开发的)

rpm -ivh jdk-u121-linux-x64.rpm
           

4.启动elasticsearch服务

ELK日志分析平台

打开服务后可以在浏览器中输入当前主机的IP和端口号查看(只有简单的数据,没有图形界面也没有分析等,所以我们选择安装相应图形界面的插件,方便分析处理数据)

ELK日志分析平台

5.安装插件:

cd /usr/share/elasticsearch/
cd /bin
./plugin list     # 查看已经安装的插件
/usr/share/elasticsearch/bin/plugin install file:/root/elk/elasticsearch-head-master.zip
           
ELK日志分析平台

6.安装插件以后,我们在浏览器中查看,得到的就是比较便于观察和分析的web界面

ELK日志分析平台

7.在该web界面下建立索引尝试查询

ELK日志分析平台

二 . 集群Elasticsearch的安装和配置

Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。
           

1.在server2和server3上安装elasticsearch-2.3.3.rpm和jdk-8u121-linux-x64.rpm

rpm -ivh jdk-u121-linux-x64.rpm
yum install elasticsearch-.rpm
           

2.编辑sevre1上的配置文件elasticsearch.yml

行 discovery.zen.ping.unicast.hosts: ["server1", "server2","server3"]
# 表示该集群由三台主机构成,主机名分别是server1,server2和server3
           

将修改好的配置文件发送给server2和server3上,在server2上和server3上修改配置文件中的sevrername和ip

3.启动server2和sevrer3上的服务

/etc/init.d/elasticsearch start

4.为了将集群中三台主机所负责的功能模块分开,我们在配置文件中设定:

server1:

#server1是主节点,同时承担http查询任务
vim elasticsearch.yml
  node.name: server1
  node.master: true      
  node.data: false
  http.enabled: true
           
ELK日志分析平台

server2:

# server2负责存储数据和http查询任务
vim elasticsearch.yml
 node.name: server2     
 node.master: false
 node.data: true
 http.enabled: true
           

server3:

# server3和server2相同
vim elasticsearch.yml
 node.name: server2  
 node.master: false
 node.data: true
 http.enabled: true
           
ELK日志分析平台

5.重启所有节点上的服务,在浏览器中查看web界面

ELK日志分析平台

6.查询集群的状态

ELK日志分析平台

数据查询(三个节点上的node.data均为true)

curl /_nodes/_local
           
ELK日志分析平台

删除demo索引

ELK日志分析平台
ELK日志分析平台

三.logstash的安装与配置

Logstash是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您喜欢的“存储库”中。(我们的存储当然是Elasticsearch。)

1.安装logstash工具

添加不同的模块:

1.标准终端输入stdin和输出stdout模块

/opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout { } }'
# input输入是从终端标准输出
Settings: Default pipeline workers: 
Pipeline main started
hello   # 标准输入hello
-08-T02::Z server1 hello    # 标准输出hello
world
-08-T02::Z server1 world
^CSIGINT received. Shutting down the agent. {:level=>:warn}   # ctrl+c中断
stopping pipeline {:id=>"main"}

Pipeline main has been shutdown
           
ELK日志分析平台

2.在标准终端输出的时候选择输出数据格式codec => rubydebug

/opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }'
Settings: Default pipeline workers: 
Pipeline main started
hello          # 标准输入
{
       "message" => "hello",             # 输出
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:38:09.060Z",
          "host" => "server1"
}
world
{
       "message" => "world",
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:38:12.447Z",
          "host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}

Pipeline main has been shutdown
           
ELK日志分析平台

3.标准终端输出,输出到提供elasticsearch的主机(server1)中

/opt/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["172.25.1.1"] index => "logstash-%{+YYYY.MM.dd}" } }'
Settings: Default pipeline workers: 
Pipeline main started
hello
hello world
hello jay        # 无终端输出,是因为将数据输出到了elasticsearch中
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}


Pipeline main has been shutdown
           

在浏览器中查看:

ELK日志分析平台

4.上边几种情况的集合,标准终端输入,输出分为两部分,一部分输出到elasticsearch ,另一种是输出到终端…

/opt/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["172.25.1.1"] index => "logstash-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } }'
Settings: Default pipeline workers: 
Pipeline main started
hello world
{
       "message" => "hello world",
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:42:38.615Z",
          "host" => "server1"
}
hello linux
{
       "message" => "hello linux",
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:42:42.556Z",
          "host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}

Pipeline main has been shutdown
           
ELK日志分析平台
ELK日志分析平台

5.上边的各种模块都是直接在命令行选择模块,输入或者输出。我们也可以在文件中编写使用的模块,选择输入和输出,

cd /etc/logstash/conf.d/
vim es.conf                # 文件名,可以随意取   
input {
        stdin {}           # 输入是标准终端输入standard  input
}

output {
        elasticsearch {                  # 第一个输出是到elasticsearch
                hosts => ["172.25.1.1"]  # elasticsearch所在的主机
                index => "logstash-%{+YYYY.MM.dd}"
        }

        stdout {                         # 第二个输出是标准终端输出
                codec => rubydebug       # 输出的风格是rubydebug
        }
}
           

在终端的运行情况:

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf   # 在终端利用logstash运行此文件
Settings: Default pipeline workers: 
Pipeline main started
hello qzy        # 标准终端输入
{
       "message" => "hello qzy",    # 输出的一部分,在终端标准输出
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:46:38.949Z",
          "host" => "server1"
}
hello jay
{
       "message" => "hello jay",
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:46:43.771Z",
          "host" => "server1"
}
nice to meet you
{
       "message" => "nice to meet you",
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:46:58.730Z",
          "host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}


Pipeline main has been shutdown
           
ELK日志分析平台

在浏览器中的数据输出:

ELK日志分析平台

6.rsyslog模块:

将server1当作一个日志收集服务器

(1).编辑一个使用模块的文件

vim message.conf
input {
        syslog {
                port =>     # 输入是server2的日志,同步日志端口为/udp
        }
}


output {
#       elasticsearch {
#               hosts => ["172.25.1.1"]      # 输出到server1的elasticsearch
#               index => "message-%{+YYYY.MM.dd}"
#       }

        stdout {
                codec => rubydebug     # 输出到标准屏幕输出
        }
}
           

(2).在sevrer2中编辑同步日志的文件

vim /etc/rsyslog.conf
*.*     @@172:
/etc/init.d/rsyslog restart    # 重新打开rsyslog服务
           

(3).查看rsyslog的端口和运行该模式的结果

在server1上netstat -antulp | grep 514

ELK日志分析平台

在server1以终端占用的方式执行

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/message.conf

ELK日志分析平台

在server1上可以收集到server2上的日志信息

(4).在server上执行logger tigger,在server1上立即可以看到trigger的输出

ELK日志分析平台

7.利用logstash中的模块将日志记录中的多行输出变为一行:

(1).在elasticsearch的日志记录文件中

cd /var/log/elasticsearch
cat my-es.log
           

看到以[]为界线的日志有时候并不在一行

ELK日志分析平台

(2).利用filter对输入进行过滤处理再指定输出

vim  /etc/logstash/conf.d/message.conf
input {
        file {
                path => "/var/log/elasticsearch/my-es.log"       # 待处理日志所在位置
                start_position => "beginning"                    # 从日志的开始处处理
        }
}

filter {
        multiline {
        pattern => "^\["
        negate => true
        what => "previous"
        }
}


output {
        elasticsearch {
                hosts => ["172.25.1.1"]
                index => "es-%{+YYYY.MM.dd}"
        }

        stdout {
                codec => rubydebug
        }
}
           
ELK日志分析平台

(3).在终端执行操作

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/message.conf
# 因为在终端出有大量的java日志,所以就不再展示
           
  1. 这里有一个需要注意的点:我们在message.conf中写的是从日志文件的beginning开始,但是,此时我们接着往日志中写东西,我们发现是从上次结束的地方开始,看起来好像与我们的设置出现差异,但是不然,如果又从头开始记录,必然会造成信息的重复。

    在linux中,我们有文件专门记录日志的编号:

    cat /root/.sincedb_452905a167cf4509fd08acb964fdb20c

    913943 0 64768 32581

    ls -i /var/log/messages

    913943 /var/log/messages

    ELK日志分析平台

这两个数字是一样的,最后一个日志表示此时日志的位置为32581,当我们在日志中接着写点东西的时候,该数字会发生变化,即表示下次记录的时候从此位置开始

logger cat

cat .sincedb_452905a167cf4509fd08acb964fdb20c (该文件不发生变更,是不会重复读的)

913943 0 64768 32751

ELK日志分析平台

9.利用filter使httpd的日志按照规定格式输出:

1.编辑一个处理httpd日志的文件test.conf

vim test.conf
input {
        stdin {}       # 输入是终端标准输入
}
filter {
        grok {
                match => { "message" => "%IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
                # 利用filter对输入的数据进行过滤,转换为指定格式指定
        }
}

output {
        stdout {
                codec => rubydebug    # 标准终端输出
        }
}
           

在终端中

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
  GET /index.html        # 标准输入
           
ELK日志分析平台

2.引用系统中的变量对httpd服务的输出日志进行处理,按照指定格式输出

vim message.conf
input {
        file {
                path => ["/var/log/httpd/access_log","/var/log/httpd/error_log"]    # 日志文件所在的位置
                start_position => "beginning"   # 开始同步的位置=>文件开始处
        }
}

filter {
        grok {
                match => { "message" => "%{COMBINEDAPACHELOG}" }     
                # 引用变量COMBINEDAPACHELOG
        }

}


output {
        elasticsearch {
                hosts => ["172.25.1.1"]
                index => "apache-%{+YYYY.MM.dd}"
        }

        stdout {
                codec => rubydebug
        }
}
           

3.在httpd的默认发布目录写默认发布文件,在主配置文件中可以看到默认的日志输出格式

ELK日志分析平台
ELK日志分析平台

引用变量的位置在

/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/

vim grok-patterns

ELK日志分析平台

在终端执行输出:

ELK日志分析平台

四.在server3上安装kibana

Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的

1.安装rpm包

2.编辑其主配置文件,写

cd /opt/kibana/config/
vim   kibana.yml
           
ELK日志分析平台

3.打开服务并查看端倪口

/etc/init.d/kibana start
netstat -antlp
           
ELK日志分析平台

五.ELK日志分析工具之间的解耦

思路:从nginx的日志文件中得到数据放在logstash中,由logstash将数据存在redis中,再由logstash将数据从redis中拿出来交给kibana,这样下来,数据经过redis,保证了数据的安全性也使得logstash和kibana之间得数据不是直接关联,降低了耦合性。

(一).基本服务的配置

1.在server1上安装nginx

2.在server2上安装redis

tar zxf redis-.tar.gz
cd redis-
make                # 来一波简单的源码编译
make install 
           

3.打开redis

cd /root/redis-./src/utils/
./install_server.sh
查看redis的端口netstat -antlp
           
ELK日志分析平台

(二).nginx的安装

1.在server1上安装nginx

2.查看nginx的日志格式,nginx的配置文件

cd /etc/nginx/
vim nginx.conf
           
ELK日志分析平台

3.引用apache的日志格式变量

cd /opt/logstash/vendor/bundle/jruby//gems/logstash-patterns-core-/patterns/
vim grok-patterns
           

4.编辑nginx.conf来对nginx的日志做处理

vim nginx.conf
input {
        file {
                path => "/var/log/nginx/access.log"  # nginx的日志
                start_position => "beginning"
        }
}

filter {
        grok {
                match => { "message" => "%{COMBINEDAPACHELOG} %{QS:x_forwarded_for}" }     # 在apache日志的前提下再加上自己的日志输出
        }
}
output {
        redis {
                host => ["172.25.1.2"]
                port =>     # 输出到server2的redis端口
                data_type => "list"   # 在redis中以列表形式存储
                key => "logstash:redis"  # 定义列表形式的键值对
        }
        stdout {
                codec => rubydebug
        }
}
           
ELK日志分析平台

修改nginx的日志权限

5.在终端执行处理nginx日志的文件

6.在物理机进行压测ab -c 1 -n 10 http://172.25.1.1/index.html在server1上看日志输出

(三).在server2上安装noarch

rpm -ivh logstash--noarch.rpm
cd /etc/logstash/conf.d/
vim es.conf
input {           
    redis {   # 从redis中拿数据
        host => "172.25.1.2"
                port => 
                data_type => "list"
                key => "logstash:redis"       # 格式和上边的保持一致
    }
}

output {
    elasticsearch {                      # 输出是将数据输出到elasticsearch中
                hosts => ["172.25.1.1"]
                index => "nginx-%{+YYYY.MM.dd}"
        }
}
           
ELK日志分析平台

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf

在网页中刷新,出现nginx

ELK日志分析平台

(四).在server3上配置kibana对获得的数据进行分析

选择要创建视图的项目:

ELK日志分析平台

创建反映信息的试图:

ELK日志分析平台

创建联系人或者时间(根据需要选择)

ELK日志分析平台

将创建的视图添加到视图框中:

ELK日志分析平台
ELK日志分析平台

根据自己的需要添加相应的模块来对数据进行分析,最终展现出来:

ELK日志分析平台

继续阅读