一、使用说明:


ELK 不是一款软件,而是 Elasticsearch、Logstash 和 Kibana 三种软件产品的首字母缩写。这三者都是开源软件,通常配合使用,而且又先后归于 Elastic.co 公司名下,所以被简称为 ELK Stack。根据 Google Trend 的信息显示,ELK Stack 已经成为目前最流行的集中式日志解决方案。

  • Elasticsearch:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具有复杂的搜索功能;

  • Logstash:数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;

  • Kibana:数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示;

  • Filebeat:ELK 协议栈的新成员,一个轻量级开源日志文件数据搜集器,基于 Logstash-Forwarder 源代码开发,是对它的替代。在需要采集日志数据的 server 上安装 Filebeat,并指定日志目录或日志文件后,Filebeat 就能读取数据,迅速发送到 Logstash 进行解析,亦或直接发送到 Elasticsearch 进行集中式存储和分析。



二、实验环境:


架构图:

ELK+Filebeat+Nginx集中式日志解决方案(一)_第1张图片


4台服务器(centos 6.5 final版本):

192.168.1.194 (filebeat收集日志,nginx做为web服务器)
192.168.1.195 (filebeat收集日志,nginx做为web服务器)
192.168.1.196 (logstash)
192.168.1.198(elasticsearch,kibana,nginx做方向代理)


使用版本:

java-1.8.0-openjdk
filebeat-5.2.2
logstash-5.2.2
elasticsearch-5.2.2
kibana-5.2.2
nginx-1.6.1


三、安装配置:

 1、在192.168.1.194和192.168.1.195上面分别安装filebeat和nginx

 先安装java-1.8.0-openjdk,并关闭防火墙。

 安装之前可以删除之前的java版本:

for jdk_list in `rpm -qa | grep -E '^java'`
do
    rpm -e --nodeps ${jdk_list}
done

 再安装java。

yum install -y java-1.8.0-openjdk



 再安装filebeat:

    在elk官网上说明了很多中安装方法,具体详见https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html

 笔者这边选用最便捷的方式,yum源安装。操作方式如下:

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
 
vim /etc/yum.repos.d/elk.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

 

 然后就可以安装filebeat了,这里是用了官方提供的yum源安装的。

yum install filebeat -y

 配置filebeat:

vim /etc/filebeat/filebeat.yml

内容为:
filebeat.prospectors:
- input_type: log
  paths:
    - /usr/local/apps/nginx/logs/test_access.log
  tags: ["nginx-accesslog"]
  document_type: nginxaccess
- input_type: log
  paths:
    - /var/log/messages
  tags: ["sys-messages"]
  document_type: sysmessages
tags: ["nginx-test-194"]
output.logstash:
  hosts: ["192.168.1.196:5044"]

 

 其中path选项为filebeat发送给logstash的路径, 多个日志可以使用*.log通配. file不会自动递归日志目录下的子目录, 如果需要递归子目录可以使用类似 /var/log/*/*.log 的结构. tags选项会向log中添加一个标签, 此标签可以提供给logstash用于区分不同客户端不同业务的log. document_type作用相当于搞个标记一样,跟tags作用差不多,这里用于区别不通的日志来源,后面会用到。
 output指定发送log到哪台服务器的哪个服务, 默认输出到elasticsearch. 本例使用logstash, 所以需要注释掉发送到elasticsearch的配置, 并启用发送到logstash的配置.

 nginx的安装我就不说了,我是用ansible自动化安装的。very easy!而且这里也只是用作一个web服务器的作用,这里需要提一下的是,在配置nginx的时候,要统一一下所有nginx服务器的日志格式。我这里设定的nginx访问日志格式为:

log_format  main  $time_local | $remote_addr | $http_host | $http_x_forwarded_for | $request_method | $request_uri | $server_protocol | $status | $body_bytes_sent | $http_referer | $http_user_agent | $request_time |;

 大家可以借鉴一下,然后自由发挥。

 

 都安装好了之后,就可以启动nginx和filebeat了,启动filebeat的方法可以使用

service filebeat start



 2、在192.168.1.196上面安装logstash。

 现将jdk升级1.8.0,方法如上。关闭防火墙。

 yum源还是按照上面的方式安装,那么安装logstash,直接用命令:

yum install -y logstash

 配置:

vim /etc/logstash/conf.d/test.conf

内容为:
input {
    beats {
            port => 5044
    }
}

filter {
	if "nginx-accesslog" in [tags] {
        grok {
    			match => { "message" => "%{HTTPDATE:timestamp}\|%{IP:remote_addr}\|%{IPORHOST:http_host}\|(?:%{DATA:http_x_forwarded_for}|-)\|%{DATA:request_method}\|%{DATA:request_uri}\|%{DATA:server_protocol}\|%{NUMBER:status}\|(?:%{NUMBER:body_bytes_sent}|-)\|(?:%{DATA:http_referer}|-)\|%{DATA:http_user_agent}\|(?:%{DATA:request_time}|-)\|"}
        }
        mutate {
                convert => ["status","integer"]
                convert => ["body_bytes_sent","integer"]
                convert => ["request_time","float"]
        }
        geoip {
                source=>"remote_addr"
        }
        date {
                match => [ "timestamp","dd/MMM/YYYY:HH:mm:ss Z"]
        }
        useragent {
                source=>"http_user_agent"
        }
}
	if "sys-messages"  in [tags] {
        grok {          
                        match => { "message" => "%{SYSLOGLINE}" }
                        add_field => [ "received_at", "%{@timestamp}" ]
                        add_field => [ "received_from", "%{host}" ]
        }
        date {  
                match => [ "timestamp", "MMM  d HH:mm:ss" ]
        }
        #ruby {
        #        code => "event['@timestamp'] = event['@timestamp'].getlocal"
        #}
}
}

output {
    elasticsearch {
      hosts => ["192.168.1.198:9200"]
	    index => "logstash-%{type}-%{+YYYY.MM.dd}"
	    document_type => "%{type}"
    }
    stdout { codec => rubydebug }
}


这个配置文件涉及到的内容比较多,值得讲的为一下几点:

  1. 在用正则匹配日志内容,并分割时,可以利用一下工具Grok Debugger ,logstash中grok定义好的正则,这个会大大简便你的匹配过程。

  2. index => "logstash-%{type}-%{+YYYY.MM.dd}" 这里的所以没有用logstash默认的索引模式(默认为这种格式logstash--%{+YYYY.MM.dd}),中间加了个%{type}变量,这样可以让不同的日志拥有不同的索引文件名,更好区分,这个在使用后面的kibana的时候,大家都好感觉出来了。


 logstash做下软连接,要不然找不到logstash这个命令:

ln -s /usr/share/logstash/bin/logstash /usr/bin/logstash

 

 关于logstash命令的用法,请参照logstash -h

 值得说的几点:

 logstash -e 该参数允许Logstash直接通过命令行接受设置。这点尤其快速的帮助我们反复的测试配置是否正确而不用写配置文件。 如:

logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }'


 logstash -f 从单个配置文件里面读取配置,并启动logstash:

logstash -f /etc/logstash/conf.d/nginx-test.conf

 以这样的方式来启动logstash。

logstash  -t -f /etc/logstash/conf.d/nginx-test.conf

 -t可以检查配置文件是否有错误,而无需启动logstash。


 从/etc/logstash目录中读取logstash.yml,并启动logstash:

logstash --path.settings /etc/logstash


nohup后台启动logstash,并使用nginx-test.conf的规则,和/etc/logstash/目录下的logstash.yml的配置:

nohup logstash -f /etc/logstash/conf.d/nginx-test.conf --path.settings /etc/logstash &




 3、在192.168.1.196上面安装Elasticsearch,Kibana和nginx反向代理

 先将jdk升级1.8.0,方法如上。关闭防火墙。

 yum源还是按照上面的方式安装,那么安装Elasticsearch,Kibana,就直接用yum安装好了:

yum install -y elasticsearch kibana

 nginx的安装还是用ansible自动化安装的。


 安装好elasticsearch,其他不需要改,因为logstash需要穿数据过来,所以需要修改一下监听的ip,

vim /etc/elasticsearch/elasticsearch.yml

network.host: 0.0.0.0 #修改一下这个监听地址

然后就可以启动elasticsearch:

service elasticsearch start

 

 因为kibana,也不需要配置什么,保持默认值就可以启动kibana了:

service kibaka start


 配置nginx方向代理,因为kibana监听的是127.0.0.1:5601端口,所以nginx配置文件如下。

upstream kinaba {
                keepalive      400;
                #ip_hash;
                server  127.0.0.1:5601 max_fails=3  fail_timeout=30s;
        }
server  {
                    listen          8088;
                    server_name     192.168.1.198;
                    if (-d $request_filename) {
                        rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
                    }
                    location / {
                        proxy_pass              http://kinaba;
                        proxy_http_version 1.1;
                        proxy_set_header Connection "";
                        proxy_set_header        X-Real-IP  $remote_addr;
                        proxy_set_header        Host             $host;
                        proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
                    }
                    error_log           logs/kinaba._route_error.log;
                    access_log          logs/kinaba._route_access.log main;
}


 然后启动nginx,就可以通过地址http://192.168.1.198:8088/ 来访问了。具体kibana怎么玩,这里就不说了,kibana只是从elasticsearch检索数据然后显示出来而已,让数据库可视化。

 

 ok!到这里“ELK+Filebeat+Nginx集中式日志解决方案”就告一段落了,后续文章会加入Filebeat 与 Logstash 安全通信,elasticsearch集群,Kafka实时信息队列技术,还会加入zookeeper分布式服务框架等敬请关注。