【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)

文章目录

  • 一、前言
  • 二、ELK
  • 三、使用层面:安装ELK三个软件
    • 3.1 安装ElasticSearch
      • 3.1.1 安装elasticsearch之前的配置
      • 3.1.2 安装ES + 启动ES服务
      • 3.1.3 三个注意事项
      • 3.1.4 通过浏览器请求下9200的端口,看下是否成功
      • 3.1.5 如何和elasticsearch交互
    • 3.2 LogStash的使用
      • 3.2.1 安装Logstash环境 + 启动Logstash标准输出 + 启动Logstash详细输出
        • 3.2.1.1 安装Logstash环境
        • 3.2.1.2 启动Logstash标准输出
        • 3.2.1.3 启动Logstash详细输出
      • 3.2.2 Logstash:标准输出 + 输出到ElasticSearch
      • 3.2.3 logstash使用配置文件(标准输出 + 输出到ElasticSearch)
      • 3.2.4 logstash的数据库类型
      • 3.2.5 logstash按类型做存放
    • 3.3 Kibana的安装及使用
      • 3.3.1 安装kibana环境
      • 3.3.2 启动Kibana 5601端口
  • 四、实践:使用ELK完成日志收集
    • 4.1 开发实践:输出nginx、apache、message、secrue的日志到前台展示
    • 4.2 MySQL慢日志
  • 五、加上Redis,架构:Logstash-->Redis-->ES-->Kibana
    • 5.1 认识Redis
      • 5.1.1 安装Redis并启动
      • 5.1.2 测试:logstash中的标准输入,输出到redis中
      • 5.1.3 测试:logstash从redis中输入,输出到elasticsearch
    • 5.2 实践:Redis加入到ELK中,做日志收集
      • 5.2.1 logstash从四个文件中输入,输出到redis中
      • 5.2.2 将redis中的数据读取出来,写入到elasticsearch中(需要另外一台主机做实验)
    • 5.3 上线ELK(日志汇总 + ES定期删除日志)
  • 六、面试金手指
  • 七、小结

一、前言

二、ELK

ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部。

Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。

Logstash是一个用来搜集、分析、过滤日志的工具。
日志类型:它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。
日志来源:它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX;
日志输出:它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。

Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第1张图片

三、使用层面:安装ELK三个软件

环境
Centos6.5 两台
IP:192.168.1.202 安装: elasticsearch、logstash、Kibana、Nginx、Http、Redis
192.168.1.201 安装: logstash
解释:

3.1 安装ElasticSearch

3.1.1 安装elasticsearch之前的配置

安装elasticsearch的yum源的密钥(这个需要在所有服务器上都配置)
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

配置elasticsearch的yum源
# vim /etc/yum.repos.d/elasticsearch.repo

在elasticsearch.repo文件中添加如下内容
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

3.1.2 安装ES + 启动ES服务

安装elasticsearch的环境

安装elasticsearch
# yum install -y elasticsearch

安装java环境(java环境必须是1.8版本以上的)

wget http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm

rpm -ivh jdk-8u131-linux-x64.rpm 

验证java安装成功
java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

创建elasticsearch data的存放目录,并修改该目录的属主属组

# mkdir -p /data/es-data   (自定义用于存放data数据的目录)
# chown -R elasticsearch:elasticsearch /data/es-data

修改elasticsearch的日志属主属组

# chown -R elasticsearch:elasticsearch /var/log/elasticsearch/

修改elasticsearch的配置文件

# vim /etc/elasticsearch/elasticsearch.yml

找到配置文件中的cluster.name,打开该配置并设置集群名称
cluster.name: demon

找到配置文件中的node.name,打开该配置并设置节点名称
node.name: elk-1

修改data存放的路径
path.data: /data/es-data

修改logs日志的路径
path.logs: /var/log/elasticsearch/

配置内存使用用交换分区
bootstrap.memory_lock: true

监听的网络地址
network.host: 0.0.0.0

开启监听的端口
http.port: 9200

增加新的参数,这样head插件可以访问es (5.x版本,如果没有可以自己手动加)
http.cors.enabled: true
http.cors.allow-origin: "*"
启动elasticsearch服务

启动ElasticSearch的服务

 /etc/init.d/elasticsearch start

Starting elasticsearch: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 2060255232 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /tmp/hs_err_pid2616.log
                                                           [FAILED]
这个报错是因为默认使用的内存大小为2G,虚拟机没有那么多的空间

修改参数:
vim /etc/elasticsearch/jvm.options
-Xms512m
-Xmx512m

再次启动
/etc/init.d/elasticsearch start

查看服务状态,如果有报错可以去看错误日志 less /var/log/elasticsearch/demon.log(日志的名称是以集群名称命名的)

创建开机自启动服务
# chkconfig elasticsearch on

3.1.3 三个注意事项

需要修改几个参数,不然启动会报错

第一,需要修改几个参数
vim /etc/security/limits.conf
在末尾追加以下内容(elk为启动用户,当然也可以指定为*)
elk soft nofile 65536
elk hard nofile 65536
elk soft nproc 2048
elk hard nproc 2048
elk soft memlock unlimited
elk hard memlock unlimited
第二,继续再修改一个参数
vim /etc/security/limits.d/90-nproc.conf
将里面的1024改为2048(ES最少要求为2048)
*          soft    nproc     2048
第三,另外还需注意一个问题(在日志发现如下内容,这样也会导致启动失败,这一问题困扰了很久)
[2017-06-14T19:19:01,641][INFO ][o.e.b.BootstrapChecks    ] [elk-1] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
[2017-06-14T19:19:01,658][ERROR][o.e.b.Bootstrap          ] [elk-1] node validation exception
[1] bootstrap checks failed
[1]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
    
第三问题的解决:修改配置文件,在配置文件添加一项参数(目前还没明白此参数的作用)
vim /etc/elasticsearch/elasticsearch.yml 
bootstrap.system_call_filter: false

3.1.4 通过浏览器请求下9200的端口,看下是否成功

先检查9200端口是否起来
netstat -antp |grep 9200
tcp        0      0 :::9200                     :::*                        LISTEN      2934/java

浏览器访问测试是否正常(以下为正常)
# curl http://127.0.0.1:9200/
{
     
  "name" : "linux-node1",
  "cluster_name" : "demon",
  "cluster_uuid" : "kM0GMFrsQ8K_cl5Fn7BF-g",
  "version" : {
     
    "number" : "5.4.0",
    "build_hash" : "780f8c4",
    "build_date" : "2017-04-28T17:43:27.229Z",
    "build_snapshot" : false,
    "lucene_version" : "6.5.0"
  },
  "tagline" : "You Know, for Search"
}

3.1.5 如何和elasticsearch交互

第一,利用API查看状态

利用API查看状态
# curl -i -XGET 'localhost:9200/_count?pretty' 
    HTTP/1.1 200 OK
    content-type: application/json; charset=UTF-8
    content-length: 95

    {
     
      "count" : 0,
      "_shards" : {
     
        "total" : 0,
        "successful" : 0,
        "failed" : 0
      }
    }

第二,安装elasticsearch-head插件


安装docker镜像或者通过github下载elasticsearch-head项目都是可以的,1或者2两种方式选择一种安装使用即可

1. 使用docker的集成好的elasticsearch-head
    # docker run -p 9100:9100 mobz/elasticsearch-head:5
    
    docker容器下载成功并启动以后,运行浏览器打开http://localhost:9100/

2. 使用git安装elasticsearch-head,并运行起来
    # yum install -y npm
    # git clone git://github.com/mobz/elasticsearch-head.git
    # cd elasticsearch-head
    # npm install
    # npm run start
    检查端口是否起来
    netstat -antp |grep 9100
    浏览器访问测试是否正常
    http://IP:9100/

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第2张图片

做日志收集分析系统的时候,es-head组件和ES的关系:
es-head 端口 9100,ES实体 端口 9200 ,es-head是用来导航到es的,浏览器中输入指定ip:9100就知道了

3.2 LogStash的使用

3.2.1 安装Logstash环境 + 启动Logstash标准输出 + 启动Logstash详细输出

3.2.1.1 安装Logstash环境

下载yum源的密钥认证:
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

利用yum安装logstash
# yum install -y logstash

查看下logstash的安装目录
# rpm -ql logstash

3.2.1.2 启动Logstash标准输出

创建一个软连接,每次执行命令的时候不用在写安装路劲(默认安装在/usr/share下)
ln -s /usr/share/logstash/bin/logstash /bin/

执行logstash的命令
# logstash -e 'input { stdin { } } output { stdout {} }'

运行成功以后输入:
nihao

stdout返回的结果:

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第3张图片

3.2.1.3 启动Logstash详细输出

注:
-e 执行操作
input 标准输入
{ input } 插件
output 标准输出
{ stdout } 插件

通过rubydebug来输出下更详细的信息
# logstash -e 'input { stdin { } } output { stdout {codec => rubydebug} }'

执行成功输入:
nihao

stdout输出的结果:

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第4张图片

3.2.2 Logstash:标准输出 + 输出到ElasticSearch

解释:
input { stdin { } } // 这里表示命令行输入
output {
elasticsearch { hosts => [“192.168.1.202:9200”] } // 这里表示输出到elasticsearch
stdout { codec => rubydebug } // 这里表示输出到命令行
}

# /usr/share/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["192.168.1.202:9200"] } stdout { codec => rubydebug }}'

运行成功以后输入:
I am elk

返回的结果(标准输出中的结果):

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第5张图片

3.2.3 logstash使用配置文件(标准输出 + 输出到ElasticSearch)

解释:下面代码,
第一行,新建一个文本文件
第二行,文件中写入输入和输出
第三行,执行配置文件
第四行,查看配置结果

创建配置文件01-logstash.conf
# vim /etc/logstash/conf.d/elk.conf

文件中添加以下内容
input {
      stdin {
      } }
output {
     
  elasticsearch {
      hosts => ["192.168.1.202:9200"] }
  stdout {
      codec => rubydebug }
}

使用配置文件运行logstash
# logstash -f ./elk.conf

运行成功以后输入以及标准输出结果

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第6张图片

3.2.4 logstash的数据库类型

logstash输入时,涉及input插件和file插件
解释代码:
第一行,新建或编辑文本文件
第二行,文件中写入输入(file输入)和输出(输出到elasticsearch)
第三行,执行配置文件
第四行,查看配置结果
小结:之前的输入是命令行中输入,现在的输入是读取指定路径path下的输入

    
    file插件的使用
    # vim /etc/logstash/conf.d/elk.conf

    添加如下配置
    input {
     
        file {
     
            path => "/var/log/messages"
            type => "system"
            start_position => "beginning"
            }
    }
    output {
         
             elasticsearch {
     
                    hosts => ["192.168.1.202:9200"]
                    index => "system-%{+YYYY.MM.dd}"
                }
    }


运行logstash指定elk.conf配置文件,进行过滤匹配
#logstash -f /etc/logstash/conf.d/elk.conf

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第7张图片

3.2.5 logstash按类型做存放

配置安全日志并且把日志的索引按类型做存放,继续编辑elk.conf文件

解释代码:
第一行,新建或编辑文本文件
第二行,文件中写入输入(file输入)和输出(输出到elasticsearch),输出的时候,按照输入类型type来输出,将type作为if判断条件
第三行,执行配置文件
第四行,查看配置结果
小结:之前的输入是命令行中输入,现在的输入是读取指定路径path下的输入

# vim /etc/logstash/conf.d/elk.conf

添加secure日志的路径
input {
     
    file {
     
        path => "/var/log/messages"
        type => "system"
        start_position => "beginning"
    }

    file {
     
        path => "/var/log/secure"
        type => "secure"
        start_position => "beginning"
    }
}

output {
     

    if [type] == "system" {
     

        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-system-%{+YYYY.MM.dd}"
        }
    }

    if [type] == "secure" {
     

        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-secure-%{+YYYY.MM.dd}"
        }
    }
}

运行logstash指定elk.conf配置文件,进行过滤匹配
# logstash -f ./elk.conf 

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第8张图片

这些设置都没有问题之后,接下来安装下kibana,可以让在前台可视化展示

3.3 Kibana的安装及使用

3.3.1 安装kibana环境

安装kibana环境

官方安装手册:https://www.elastic.co/guide/en/kibana/current/install.html

下载kibana的tar.gz的软件包
# wget https://artifacts.elastic.co/downloads/kibana/kibana-5.4.0-linux-x86_64.tar.gz

解压kibana的tar包
# tar -xzf kibana-5.4.0-linux-x86_64.tar.gz

进入解压好的kibana
# mv kibana-5.4.0-linux-x86_64 /usr/local

创建kibana的软连接
# ln -s /usr/local/kibana-5.4.0-linux-x86_64/ /usr/local/kibana 

编辑kibana的配置文件
# vim /usr/local/kibana/config/kibana.yml

修改配置文件如下,开启以下的配置
server.port: 5601

server.host: "0.0.0.0"

elasticsearch.url: "http://192.168.1.202:9200"

kibana.index: ".kibana" 

3.3.2 启动Kibana 5601端口

安装screen,以便于kibana在后台运行(当然也可以不用安装,用其他方式进行后台启动)
# yum -y install screen

# screen
# /usr/local/kibana/bin/kibana
netstat -antp |grep 5601
tcp        0      0 0.0.0.0:5601                0.0.0.0:*                   LISTEN      17007/node 

打开浏览器并设置对应的index
http://IP:5601

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第9张图片
【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第10张图片

四、实践:使用ELK完成日志收集

4.1 开发实践:输出nginx、apache、message、secrue的日志到前台展示

解释下面代码(第一段代码):
1、编辑nginx配置文件,将日志格式定义为一个名为json的文件
2、修改access_log的输出格式为刚才定义的json

解释下面代码(第二段代码):
1、修改apache的配置文件,将日志格式定义为一个名为ls_apache_json的文件;
2、修改CustomLog的输出格式为刚才定义的ls_apache_json

ps:message、secrue,之前就弄好了,现在不用弄了

解释下面代码(第三段代码):
1、新建或编辑logstash的配置文件full.conf;
2、配置文件中确定:logstash的输入包括:http类型的文件输入、nginx类型的文件输入、secure类型的文件输入、system类型的文件输入,logstash的输出都是输出到elasticsearch中;
3、运行logstash指定full.conf的配置文件;
4、查看结果,logstash从四个文件中输入,输出到elasticsearch中。
5、用kibana可视化展现出来

利用上面的类型索引,现在可以来输出nginx、apache、message、secrue的日志到前台展示(Nginx有的话直接修改,没有自行安装)

编辑nginx配置文件,将日志格式定义为一个名为json的文件

log_format json '{"@timestamp":"$time_iso8601",'
             '"@version":"1",'
             '"client":"$remote_addr",'
             '"url":"$uri",'
             '"status":"$status",'
             '"domian":"$host",'
             '"host":"$server_addr",'
             '"size":"$body_bytes_sent",'
             '"responsetime":"$request_time",'
             '"referer":"$http_referer",'
             '"ua":"$http_user_agent"'
          '}';

修改access_log的输出格式为刚才定义的json 
access_log  logs/elk.access.log  json;

修改apache的配置文件,将日志格式定义为一个名为ls_apache_json的文件

LogFormat "{ \
        \"@timestamp\": \"%{%Y-%m-%dT%H:%M:%S%z}t\", \
        \"@version\": \"1\", \
        \"tags\":[\"apache\"], \
        \"message\": \"%h %l %u %t \\\"%r\\\" %>s %b\", \
        \"clientip\": \"%a\", \
        \"duration\": %D, \
        \"status\": %>s, \
        \"request\": \"%U%q\", \
        \"urlpath\": \"%U\", \
        \"urlquery\": \"%q\", \
        \"bytes\": %B, \
        \"method\": \"%m\", \
        \"site\": \"%{Host}i\", \
        \"referer\": \"%{Referer}i\", \
        \"useragent\": \"%{User-agent}i\" \
       }" ls_apache_json

修改CustomLog的输出格式为刚才定义的ls_apache_json
CustomLog logs/access_log ls_apache_json
编辑logstash配置文件,进行日志收集
vim /etc/logstash/conf.d/full.conf

    input {
     
    file {
     
        path => "/var/log/messages"
        type => "system"
        start_position => "beginning"
    }   

    file {
     
        path => "/var/log/secure"
        type => "secure"
        start_position => "beginning"
    }   

    file {
     
        path => "/var/log/httpd/access_log"
        type => "http"
        start_position => "beginning"
    }   

    file {
     
        path => "/usr/local/nginx/logs/elk.access.log"
        type => "nginx"
        start_position => "beginning"
    }   

}
    
output {
     

    if [type] == "system" {
      

        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-system-%{+YYYY.MM.dd}"
        }       
    }   

    if [type] == "secure" {
     

        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-secure-%{+YYYY.MM.dd}"
        }
    }

    if [type] == "http" {
     

        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-http-%{+YYYY.MM.dd}"
        }
    }

    if [type] == "nginx" {
     

        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-nginx-%{+YYYY.MM.dd}"
        }
    }

}

运行看看效果如何
logstash -f /etc/logstash/conf.d/full.conf

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第11张图片

可以发现所有创建日志的索引都已存在,接下来就去Kibana创建日志索引,进行展示(按照上面的方法进行创建索引即可),看下展示的效果

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第12张图片

4.2 MySQL慢日志

解释下面代码(第三段代码):
1、新建或编辑logstash的配置文件full.conf;
2、配置文件中确定:logstash的输入包括:http类型的文件输入、nginx类型的文件输入、secure类型的文件输入、system类型的文件输入、mysql类型的文件输入,logstash的输出都是输出到elasticsearch中;
3、运行logstash指定full.conf的配置文件;
4、查看结果,logstash从五个文件中输入,输出到elasticsearch中。
5、用kibana可视化展现出来

接下来再来一发MySQL慢日志的展示

由于MySQL的慢日志查询格式比较特殊,所以需要用正则进行匹配,并使用multiline能够进行多行匹配(看具体配置)
input {
     
    file {
     
        path => "/var/log/messages"
        type => "system"
        start_position => "beginning"
    }   

    file {
     
        path => "/var/log/secure"
        type => "secure"
        start_position => "beginning"
    }   

    file {
     
        path => "/var/log/httpd/access_log"
        type => "http"
        start_position => "beginning"
    }   

    file {
     
        path => "/usr/local/nginx/logs/elk.access.log"
        type => "nginx"
        start_position => "beginning"
    }   
    
    file {
     
        path => "/var/log/mysql/mysql.slow.log"
        type => "mysql"
        start_position => "beginning"   
    codec => multiline {
     
            pattern => "^# User@Host:"
            negate => true
            what => "previous"
        }
    }
}

filter {
     
 
    grok {
     
        match => {
      "message" => "SELECT SLEEP" }
            add_tag => [ "sleep_drop" ]
            tag_on_failure => []
    }
 
 
    if "sleep_drop" in [tags] {
     
            drop {
     }
    }
    
    grok {
     
        match => {
      "message" => "(?m)^# User@Host: %{USER:User}\[[^\]]+\] @ (?:(?\S*) )?\[(?:%{IP:Client_IP})?\]\s.*# Query_time: %{NUMBER:Query_Time:float}\s+Lock_time: %{NUMBER:Lock_Time:float}\s+Rows_sent: %{NUMBER:Rows_Sent:int}\s+Rows_examined: %{NUMBER:Rows_Examined:int}\s*(?:use %{DATA:Database};\s*)?SET timestamp=%{NUMBER:timestamp};\s*(?(?\w+)\s+.*)\n# Time:.*$" }
        }
     date {
     
            match => [ "timestamp", "UNIX" ]
            remove_field => [ "timestamp" ]
    }
}
output {
     
    if [type] == "system" {
      
        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-system-%{+YYYY.MM.dd}"
        }       
    }   
    if [type] == "secure" {
     
        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-secure-%{+YYYY.MM.dd}"
        }
    }
    if [type] == "http" {
     
        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-http-%{+YYYY.MM.dd}"
        }
    }
    if [type] == "nginx" {
     
        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-nginx-%{+YYYY.MM.dd}"
        }
    }
    if [type] == "mysql" {
     
        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-mysql-slow-%{+YYYY.MM.dd}"
        }
    }
}

查看效果(一条慢日志查询会显示一条,如果不进行正则匹配,那么一行就会显示一条)
【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第13张图片

具体的日志输出需求,进行具体的分析

五、加上Redis,架构:Logstash–>Redis–>ES–>Kibana

5.1 认识Redis

5.1.1 安装Redis并启动

安装reids 
# yum install -y redis

修改redis的配置文件
# vim /etc/redis.conf

修改内容如下
daemonize yes

bind 192.168.1.202

启动redis服务
# /etc/init.d/redis restart

测试redis的是否启用成功
# redis-cli -h 192.168.1.202

输入info如果有不报错即可
redis 192.168.1.202:6379> info

redis_version:2.4.10

5.1.2 测试:logstash中的标准输入,输出到redis中

解释下面代码:
1、新建或编辑logstash的配置文件redis-out.conf
2、配置文件中确定:logstash的输入为标准输入,logstash的输出为指定ip:port的redis
3、运行logstash指定redis-out.conf的配置文件
4、查看结果,logstash中的标准输入,已经出现在redis中了

编辑配置redis-out.conf配置文件,把标准输入的数据存储到redis中
# vim /etc/logstash/conf.d/redis-out.conf

添加如下内容

input {
     
      stdin {
     }
}

output {
     
        redis {
     
                host => "192.168.1.202"
                port => "6379"
                password => 'test'
                db => '1'
                data_type => "list"
                key => 'elk-test'
        }
}   

运行logstash指定redis-out.conf的配置文件
# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis-out.conf

运行成功以后,在logstash中输入内容(查看下效果)

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第14张图片

5.1.3 测试:logstash从redis中输入,输出到elasticsearch

解释下面代码:
1、新建或编辑logstash的配置文件redis-out.conf
2、配置文件中确定:logstash的输入为指定ip:port的redis,logstash的输出为elasticsearch
3、运行logstash指定redis-out.conf的配置文件
4、查看结果,logstash从redis中输入,输出到elasticsearch

编辑配置redis-in.conf配置文件,把reids的存储的数据输出到elasticsearch中
# vim /etc/logstash/conf.d/redis-out.conf

添加如下内容
input{
     
    redis {
     
                    host => "192.168.1.202"
                    port => "6379"
                    password => 'test'
                    db => '1'
                    data_type => "list"
                    key => 'elk-test'
                    batch_count => 1 #这个值是指从队列中读取数据时,一次性取出多少条,默认125条(如果redis中没有125条,就会报错,所以在测试期间加上这个值)
            }

}

output {
     
        elasticsearch {
     
                hosts => ['192.168.1.202:9200']
                index => 'redis-test-%{+YYYY.MM.dd}'
        }
}

运行logstash指定redis-in.conf的配置文件
# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis-out.conf

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第15张图片

5.2 实践:Redis加入到ELK中,做日志收集

5.2.1 logstash从四个文件中输入,输出到redis中

解释下面代码:
1、新建或编辑logstash的配置文件full.conf;
2、配置文件中确定:logstash的输入包括:http类型的文件输入、nginx类型的文件输入、secure类型的文件输入、system类型的文件输入,logstash的输出都是输出到redis中;
3、运行logstash指定full.conf的配置文件;
4、查看结果,logstash从四个文件中输入,输出到redis中。

把之前的配置文件修改一下,变成所有的日志监控的来源文件都存放到redis中,然后通过redis输出到elasticsearch中

更改为如下,编辑full.conf
input {
     
    file {
     
            path => "/var/log/httpd/access_log"
            type => "http"
            start_position => "beginning"
    }

    file {
     
            path => "/usr/local/nginx/logs/elk.access.log"
            type => "nginx"
            start_position => "beginning"
    }

    file {
     
            path => "/var/log/secure"
            type => "secure"
            start_position => "beginning"
    }

    file {
     
            path => "/var/log/messages"
            type => "system"
            start_position => "beginning"
    }
}


output {
     
    if [type] == "http" {
     
        redis {
     
            host => "192.168.1.202"
            password => 'test'
            port => "6379"
            db => "6"
            data_type => "list"
            key => 'nagios_http' 
        }
    }

    if [type] == "nginx" {
     
        redis {
     
            host => "192.168.1.202"
            password => 'test'
            port => "6379"
            db => "6"
            data_type => "list"
            key => 'nagios_nginx' 
        }
    }

    if [type] == "secure" {
     
        redis {
     
            host => "192.168.1.202"
            password => 'test'
            port => "6379"
            db => "6"
            data_type => "list"
            key => 'nagios_secure' 
        }
    }

    if [type] == "system" {
     
        redis {
     
            host => "192.168.1.202"
            password => 'test'
            port => "6379"
            db => "6"
            data_type => "list"
            key => 'nagios_system' 
        }
    }
} 


运行logstash指定full.conf的配置文件
# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/full.conf

在redis中查看是否已经将数据写到里面(有时候输入的日志文件不产生日志,会导致redis里面也没有写入日志)

【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第16张图片

5.2.2 将redis中的数据读取出来,写入到elasticsearch中(需要另外一台主机做实验)

解释下面代码:
1、新建或编辑logstash的配置文件redis-out.conf;
2、配置文件中确定:logstash的输入全部都是redis,输出全部都是elasticsearch
3、运行logstash指定redis-out.conf的配置文件;
4、查看结果,logstash从redis中输入,输出到elasticsearch中。

将redis中的数据读取出来,写入到elasticsearch中(需要另外一台主机做实验)

编辑配置文件
# vim /etc/logstash/conf.d/redis-out.conf

添加如下内容
input {
     
    redis {
     
        type => "system"
        host => "192.168.1.202"
        password => 'test'
        port => "6379"
        db => "6"
        data_type => "list"
        key => 'nagios_system' 
    batch_count => 1
     }
    
    redis {
     
        type => "http"
        host => "192.168.1.202"
        password => 'test'
        port => "6379"
        db => "6"
        data_type => "list"
        key => 'nagios_http' 
    batch_count => 1
     }

    redis {
     
        type => "nginx"
        host => "192.168.1.202"
        password => 'test'
        port => "6379"
        db => "6"
        data_type => "list"
        key => 'nagios_nginx'
    batch_count => 1
     }
    
    redis {
     
        type => "secure"
        host => "192.168.1.202"
        password => 'test'
        port => "6379"
        db => "6"
        data_type => "list"
        key => 'nagios_secure' 
    batch_count => 1
    }
}
    
output {
     
    
    if [type] == "system" {
     
        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-system-%{+YYYY.MM.dd}"
        }
    }   

    if [type] == "http" {
     
        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-http-%{+YYYY.MM.dd}"
        }   
    }   

    if [type] == "nginx" {
     
        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-nginx-%{+YYYY.MM.dd}"
        }   
    }  

    if [type] == "secure" {
     
        elasticsearch {
     
            hosts => ["192.168.1.202:9200"]
            index => "nagios-secure-%{+YYYY.MM.dd}"
        }   
    }  
}


注意:
input是从客户端收集的
output是同样也保存到192.168.1.202中的elasticsearch中,如果要保存到当前的主机上,可以把output中的hosts修改成localhost,如果还需要在kibana中显示,需要在本机上部署kabana,为何要这样做,起到一个松耦合的目的
说白了,就是在客户端收集日志,写到服务端的redis里或是本地的redis里面,输出的时候对接ES服务器即可


运行命令看看效果
# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis-out.conf

效果是和直接往ES服务器输出一样的(这样是先将日志存到redis数据库,然后再从redis数据库里取出日志)
【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第17张图片

5.3 上线ELK(日志汇总 + ES定期删除日志)

日志汇总

1. 日志分类
        系统日志        rsyslog     logstash    syslog插件
        访问日志        nginx       logstash    codec   json
        错误日志        file        logstash    mulitline
        运行日志        file        logstash    codec   json
        设备日志        syslog      logstash    syslog插件
        Debug日志      file         logstash   json 或者 mulitline  

2.  日志标准化
        路径      固定
        格式      尽量json

3.   系统个日志开始-->错误日志-->运行日志-->访问日志

ES定期删除一些日志

因为ES保存日志是永久保存,所以需要定期删除一下日志,下面命令为删除指定时间前的日志

curl -X DELETE http://xx.xx.com:9200/logstash-*-`date +%Y-%m-%d -d "-$n days"`

六、面试金手指

ES两个作用:
1、组成成为ELK,用来收集和处理日志,nginx、apache、message、secrue、mysql的日志;
2、ES单独使用,用来做搜索引擎,特别是数据量比较大的,不用直接查库的,电商网站的搜索,Solr也可以

金手指,记住三个(都是使用层面的,面试问不到什么,记住架构就好,不使用Redis的ELK和使用Redis的ELK):
金手指1:Logstash
Logstash是一个用来搜集、分析、过滤日志的工具。
日志类型:它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。
日志来源:它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX;
日志输出:它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
金手指2:不使用Redis:LogStash – ElasticSearch – Kibana
金手指3:使用Redis:LogStash – Redis – ElasticSearch – Kibana

做日志收集分析系统的时候,es-head组件和ES的关系:
es-head 端口 9100,ES实体 端口 9200 ,es-head是用来导航到es的,浏览器中输入指定ip:9100就知道了

问题:详细描述一下 Elasticsearch 索引文档的过程(想了解 ES 的底层原理,不再只关注业务层面了)?
解答:这里的索引文档应该理解为文档写入 ES,创建索引的过程。文档写入包含:单文档写入和批量 bulk 写入,这里只解释一下:单文档写入流程。记住官方文档中的这个图。
【搜索引擎】使用层面:后端开发日志收集ELK(LogStash + ES + ES-head + Kibana)_第18张图片
第一步:客户写集群某节点写入数据,发送请求。(如果没有指定路由/协调节点,请求的节点扮演路由节点的角色。)
第二步:节点 1 接受到请求后,使用文档_id 来确定文档属于分片 0。请求会被转到另外的节点,假定节点 3。因此分片 0 的主分片分配到节点 3 上。
第三步:节点 3 在主分片上执行写操作,如果成功,则将请求并行转发到节点 1和节点 2 的副本分片上,等待结果返回。所有的副本分片都报告成功,节点 3 将向协调节点(节点 1)报告成功,节点 1 向请求客户端报告写入成功。

问题:接上面,第二步中的文档获取分片的过程?
回答:借助路由算法获取,路由算法就是根据路由和文档 id 计算目标的分片 id 的过程。
shard = hash(_routing) % (num_of_primary_shards)

其他:
elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。
elasticsearch 的倒排索引是什么
elasticsearch 索引数据多了怎么办,如何调优,部署
elasticsearch 是如何实现 master 选举的
详细描述一下 Elasticsearch 搜索的过程?
Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法
lucence 内部结构是什么?

七、小结

后端开发日志收集ELK,完成了。

天天打码,天天进步!!!

你可能感兴趣的