前言:

        ELK Stack 是 Elasticsearch、Logstash、Kibana 三个开源软件的组合。ELK Stac可以用于实时日志处理,数据分析等领域,目前了解该领域应该是开源界的第一选择。实践中,可跟对具体使用场景选择不同的软件组合,如下是快速安装部署,同样也适合生产环境。

实践环境

名称
版本 备注
OS centos6.4以上 7.x未测试,5.x不适用
Elasticsearch
2.4.0以上 适用JDK8.x,采用最新稳定版
Logstash 2.4.0以上
同上
Kibana 4.6.1以上
同上


各种包的资源准备好,可以去官网下载(www.elasticsearch.co),或者去国内的大型源里面,比如阿里源,清华源等等,这里就不详细说明了

由于这里下载的都是rpm包,安装很简单,JDK的安装配置也不说明了,这个大家应该都没什么问题了

  1. 安装配置elasticsearch

    rpm -ivh ela*.rpm

  2. 安装插件

    /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head

  3. 添加系统服务并启动

    chkconfig --add elasticsearch  &&  /etc/inin.d/elasticsearch  start

  4. 修改一下配置文件中的network参数,可以让其绑定在每个网卡设备上

  5. 测试

    curl 'http://172.16.200.108:9200/?pretty'

  6. #自定义配置文件(/etc/elasticsearch/elasticsearch.yml)

    #组播组播自动发现配置

    cluster.name: my-test     (集群名称,组播自动发现)

    node.name: node-01

    node.master: true

    node.data:true

    index.number_of_shards: 5   (默认分片数)

    index.number_of_replicas: 1  (默认分片副本)

    path.conf:/path/to/conf    (配置文件目录)

    path.data:/usr/local/ver01/elasticsearch/data    (数据存储目录)

    path.work:/                (临时文件目录)

    path.logs:/usr/local/ver01/elasticsearch/logs               (日志文件目录)

    path.plugins:/            (插件目录)

    bootstrap.mlockall:true   (锁住内存,不交换内存数据到swap上)

    network.host:0.0.0.0

    #集群单播配置

    cluster.name: mytest

    node.name: "node-01"

    node.data: true

    bootstrap.mlockall: true

    network.host: 172.16.200.108

    network.publish_host: 172.16.200.108

    discovery.zen.ping.multicast.enabled: false

    discovery.zen.ping.unicast.hosts: ["172.16.200.108","172.16.200.109"]



  1. 安装logstach

    rpm -ivh log*.rpm

  2. 相关配置文件,管理脚本

    #logstash配置文件默认存放目录

    /etc/logstash/conf.d

    #logstash bin文件

    /opt/logstash/bin/logstash

    #logstash管理脚本

    /etc/init.d/logstash start  #start/stop/restart

    #测试配置文件

    /opt/logstash/bin/logstash agent -f /etc/logstash/conf.d/logstash.conf -t

  3. 一个简单收集Nginx访问日志的配置文件


    input {

            file {

                    type => "nginx-messages"

                    path => ["/home/wwwlogs/access.log"]

                    start_position => "beginning"

            }

    }

    output {

            if [type] == "nginx-messages" {

            elasticsearch {

                    hosts => ["172.16.200.108:9200"]

                    index => "nginx-messages-%{+YYYY-MM}"

                    }

            }

    }


  1. 安装kibana

    rpm -ivh kibana*.rpm

  2. 相关配置

    #修改配置文件指定elasticsearch服务器地址:例如

    vim /opt/kibana/config/kibana.yml

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

    server.host: "172.16.200.108"

    #启动

    /etc/init.d/kibana start

    #默认访问地址:http://172.16.200.108:5601


### 注意以上用rpm包安装的配置文件,数据目录的默认配置,需要请修改 ###


安装配置无误的话,可以登录http://172.16.200.108:5601访问玩一下了


针对目前elk中前端展现的kiabna来说,权限的划分对企业用户使用非常不方便,虽然可以简单的方法加上基本密码认证(HTTP Auth Basic),但是要细分权限就有点坑了。kibana优势不用说,展现及统计都十分强大,所以两者各有千秋,本次主题所说的grafana替换kibana只是部分替换。我们这里2两者可以并用,将grafana提供给运营及开发等人群查看,给予相关分组及查看权限,而对于运维或者数据挖掘等等真正对这些日志进行的分析我们可以使用kibana。实践如下:


依然选择单机操作,所有的安装均在172.16.200.108上


  1. 安装grafana(2.6.0)

    yum install https://grafanarel.s3.amazonaws.com/builds/grafana-2.6.0-1.x86_64.rpm

  2. 配置文件

    /etc/grafana/grafana.ini

    #默认数据库sqlite3,默认服务端口3000,等等

  3. 启动脚本

    /etc/init.d/grafana-server

  4. 添加Elasticsearch数据源

  5. * 登录成功后,Data Sources => Add new 

    关键说明:
    Type : 选择elasticsearch类型
    url : elasticsearch 的地址
    access : proxy 本实例选用该选项
    index name : elasticsearch中存储数据的的索引名
    如下所示:

    添加完成后可 Test connection 测试,如果如下图所示则数据源可正常获取数据

    创建一个日志相关统计的图形


    默认的组织,选择 New ,添加一个dashboard(如下图),我们这里简单翻译为仪表盘。仪表盘中可以自定义自己需要的相关信息.

        创建的新仪表盘会看到一个绿色的条,点击可以做相关动作,另外设置里面可以另存为一个具体的名字保持仪表盘.如下:

 

       绿色条展开后有许多选项,如下:

          我们点击上面的Graph创建一个图形,然后如下,做相关参数调整
General => Title 定义图形名称,如下:


Metrics => Query 可以输入相关查询条件(lunece 语法),右下角的nginx红框代表当前数据源是之前定义的数据源名称


Axes & Grid => Legend 是否显示,及显示的位置
Axes & Grid => Values 对应是否显示相关值,如下:

创建一个可查看相关详细日志的表格


我们点击绿色条,然后”Add Pannel”=>”Table”,然后如下,做相关参数调整,如下:



grafana相关用户及权限功能展示

grafana用户的功能是比较丰富的,这里简单展示下,可仔细查看下/etc/grafana/grafana.ini 配置文件中更多对用户这块的控制与定制.



kibana地图显示

思路

这里用最简单的思路实现,如下(nginx中client IP):

  • logstash

    input:通过制定文件采集(这里采集的nginx源日志已经设置为json格式了)
    filter:通过geoip插件指定字段client
    output:把日志导出到elasticsearch(这里重点注意,index名字如果在你没指定自定义模板之前,必须用”logstash-“开头,不理解没关系,按照我的例子操作一遍先实现即可)

  • kibana

    先在Settings中创建好对应的index
    然后在Discover中查看对应index是否有采集到相关数据,数据采集是否正确
    再就是Visualize中Title map功能就可以查看相关client IP在地图中的显示及访问统计

实践

  • logstash配置文件

input {

   file {

                type => "nginx-access"

                path => ["/logs/nginx/access.log"]

   }

}

filter {

     json {

       source => "message"

     }

     geoip {

        source => "client"

    }

}

output {

        elasticsearch {

                hosts => ["10.154.19.58:9200"]

                index => "logstash-nginx-access-%{+YYYY.MM}"

        }

}

  • kibana操作

    先在Settings中创建好对应的index



然后在Discover中查看对应index是否有采集到相关数据,数据采集是否正确


再就是Visualize中Title map功能就可以查看相关client IP在地图中的显示及访问统计






日志统计分析--filebeat

Filebeat 是elastic官方Beats系列之一,用来采集文件日志推荐实践工具。采用当前流行高效率go语言开发,客户端采集日志无需安装jdk。

filebeat+logstash+elasticsearch+kibana

  • 看下官网的示意图,图中我们暂时只使用Beats家族之一filebeat

filebeat:客户端采集文件日志信息,然后output给logstash,这里可以做负载
logstash:通过beat插件收集filebeat发过来的日志,如果需要可以过滤一些规则,然后indexer到elasticsearch
elasticsearch:保存及搜索日志
kibana:前端交互及展现

相关安装说明

1:安装filebeat、curl -L -O https://download.elastic.co/beats/filebeat/filebeat-1.1.1-x86_64.rpm

sudo rpm -vi filebeat-1.1.1-x86_64.rpm

2:安装logstash

参照上面的安装


3:安装logstash-input-beats插件

/opt/logstash/bin/plugin install logstash-input-beats

配置实例

filebeat:(/etc/filebeat/filebeat.yml)

  • 这里收集3种文件日志,定义了三种文档类型,方便在logstash索引时根据不同文档应用不通过滤规则

  • 其中nginx-access日志源是json格式

  • output 可以启用负载均衡

  • shipper 可以定义name tags等等


filebeat:

  prospectors:

    -

      document_type: "messages"

      paths:

        - /var/log/messages

    -

      document_type: "php-error-5"

      paths:

        - /home/wwwroot/php_error/php.log


    -

      document_type: "nginx-access"

      scan_frequency: "10s"

      backoff: "1s"

      paths:

        - "/usr/local/ver01/nginx/logs/*json.log"


  registry_file: /var/lib/filebeat/registry


output:

  logstash:

    hosts: ["172.31.27.253:5044","172.31.17.40:5044"]

    worker: 4

    compression_level: 3

    loadbalance: true


shipper:

  name: test-web-01

  tags: ["web-server", "nginx"]


启动filebeat

/etc/init.d/filebeat start

logstash:(/etc/logstash/conf.d/index.conf)

  • index.conf文件名可自取,以.conf后缀结尾即可

  • filter 过滤了nginx-access 这种json格式日志,并加入了geoip插件将其客户端IP生成详细的ip位置信息

  • filter 过滤了php-error-5 phperror日志,并切分好字段

  • output 根据不通类型文档输入到不同的es索引中

input {

  beats {

    port => 5044

  }

}

filter {

  if [type] == "nginx-access" {

     json {

       source => "message"

     }

     mutate {

            remove_field => [ "message" ]

     }

     geoip {

        source => "client"

    }

  }

  if [type] == "php-error-5" {

        grok {

            break_on_match => false

            match => [ "message", [

                    "\[%{MONTHDAY:day}-%{MONTH:month}-%{YEAR:year} %{TIME:time}\] PHP %{DATA:level}\:  %{GREEDYDATA:error}"

                ]

            ]

            add_field    => { "timestamp" => "%{day}-%{month}-%{year} %{time}" }

            remove_field => [ "day", "month", "year", "time" ]

        }

        date {

            match        => [ "timestamp" , "yyyy-MM-dd HH:mm:ss", "dd-MMM-yyyy HH:mm:ss" ]

        }

        mutate {

            remove_field => [ "tags", "offset", "timestamp" ]

        }

  }

}


output {

  if [type] == "messages" {

        elasticsearch {

                hosts => ["10.154.19.58:9200"]

                index => "logstash-messages-%{+YYYY.MM}"

        }

  }

  if [type] == "nginx-access" {

        elasticsearch {

                hosts => ["10.154.19.58:9200"]

                index => "logstash-nginx-access-%{+YYYY.MM}"

        }

  }

  if [type] == "php-error-5" {

        elasticsearch {

                hosts => ["10.154.19.58:9200"]

                index => "logstash-php-error-%{+YYYY.MM}"

        }

  }

  #stdout { codec => rubydebug }

}

测试配置文件:

/opt/logstash/bin/logstash agent -f /etc/logstash/conf.d/index.conf -t

启动logstach:

/etc/init.d/logstash start