简介

  ELKstack是由Elasticsearch、Logstash、Kibana三个开源软件组合而成的一款集分析、搜索、图形展示于一身的实施日志收集系统。
各个组件的功能如下:
Elasticsearch:日志分布式存储、搜索工具,支持集群功能,可以将指定时间的日志生成一个索引,加快日志查询和访问。
Logstash:日志收集工具,可以从本地磁盘或网络环境的服务器中收集各种文件,然后进行过滤分析,并将日志输入到Elasticsearch中。
Kibana:web界面可视化日志展示工具,对Elasticsearch中存储的日志进行展示。

从各个组件的功能可以看出日志收集到展示的整个过程如:
日志——>Logstash——>Elasticsearch——>Kibana
在日志量相对较大的环境中,由于ELKstack天然支持集群功能及各个组件的灵活使用,我们还可以进行如下改进:
日志——>Logstash——>redis/Kafaka——>Logstash——>Elasticsearch1+Elasticsearch2(集群)——>Kibana——>nginx

  通过ELKstack,我们就再也不需要给开发人员copy日志了,直接在web界面上开个账户即可进行各种查询工作,大大减轻了运维的工作。

在此我们只介绍在普通环境下的部署及使用。

部署

准备

  1. 服务器列表
    10.10.20.16 Elasticsearch+Kibana
    10.10.20.17 nginx日志来源+Logstash

  2. 软件列表
    elasticsearch-1.7.3.tar.gz
    logstash-2.0.0.tar.gz
    kibana-4.1.2-linux-x64.tar.gz

安装

  • 一.Elasticsearch

1.配置java环境,版本为8,如果为7出现告警信息无法启动

yum install -y java-1.8.0
[root@test local]# java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)

2.安装并创建相关目录

wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.tar.gz
tar -zxvf elasticsearch-1.7.3.tar.gz -C /usr/local
cd /usr/local
ln -s /usr/local/elasticsearch-1.7.3 /usr/local/elasticsearch
cd /usr/local/elasticsearch
mkdir {data,work,logs,plugins}

3.修改配置文件

vim /usr/local/elasticsearch/config/elasticsearch.yml
#集群名字
cluster.name: elasticsearch
#集群中节点名,不可重复
node.name: "es-node1"
#是否是master节点
node.master: true
#节点是否存储数据
node.data: true
#索引分片的个数
index.number_of_shards: 5
#分片的副本个数
index.number_of_replicas: 1
#配置文件路径
path.conf: /usr/local/elasticsearch/config
#数据存放路径
path.data: /usr/local/elasticsearch/data
#工作路径
path.work: /usr/local/elasticsearch/work
#日志路径
path.logs: /usr/local/elasticsearch/logs
#插件路径
path.plugins: /usr/local/elasticsearch-1.7.3/plugins
#内存不向swap交还
bootstrap.mlockall: true

4.安装启动脚本

git clone https://github.com/elastic/elasticsearch-servicewrapper.git
mv elasticsearch-servicewrapper/service /usr/local/elasticsearch-1.7.3/bin/
[root@test service]# /usr/local/elasticsearch-1.7.3/bin/service/elasticsearch install
Detected RHEL or Fedora:
Installing the Elasticsearch daemon..

5.配置启动脚本并启动

[root@test service]# vim /usr/local/elasticsearch/bin/service/elasticsearch.conf
#设置ES的安装路径,必须和安装路径保持一致
set.default.ES_HOME=/usr/local/elasticsearch
#设置分配jvm内存大小
set.default.ES_HEAP_SIZE=1024
[root@test service]# /etc/init.d/elasticsearch start
Starting Elasticsearch...
Waiting for Elasticsearch......
running: PID:29823
[root@test service]# netstat -lntp | grep -E "9200|9300"
tcp        0      0 :::9200                     :::*                        LISTEN      29825/java          
tcp        0      0 :::9300                     :::*                        LISTEN      29825/java 

访问10.10.20.16:9200,检查elasticsearch是否启动正常。

注意:
1.由于我们在此只用了一个节点,没有使用集群,若要使用集群请在另一台服务器上按上述配置,但是注意节点名称不能够重复,如node.name: “es-node1”
2.官方还提供了一个ES集群管理插件,可以非常直观的查看ES状态信息,安装方法如下:

/usr/local/elasticsearch/bin/plugin -i mobz/elasticsearch-head

安装完成,访问安装head插件的ES服务器,即可查看集群信息:

其中:unassigned表示没有另一个集群节点,而nginx-2015-12和nginx-access-2015-12则是我通过logstash将nginx日志源写入ES的记录,下面我们再进行下一步吧。

  • 二.Logstash

1.确认java环境
logstash也需要1.8的java环境,安装如上。

yum install -y java-1.8.0
[root@test1 local]# java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
[root@test1 logstash]# which java
/usr/local/jdk1.7.0_71/bin/java

注意:若我们服务器上本来有java环境,但版本不一致,我们需要安装后需要修改下logstash的相关启动设置,来使其使用java1.8的环境即可。

[root@test1 logstash]# vim /usr/local/logstash/bin/logstash.lib.sh
#添加以下一行即可
JAVA_HOME=/usr

2.下载安装并创建相关目录

wget https://download.elastic.co/logstash/logstash/logstash-2.0.0.tar.gz
tar -zxvf logstash-2.0.0.tar.gz -C /usr/local
cd /usr/local/
ln -sv logstash-2.0.0 logstash
cd /usr/local/logstash
#logs用于存放日志,etc用于存放配置文件
mkdir {logs,etc}

3.配置logstash启动脚本

[root@test1 local]#vim /etc/init.d/logstash
#!/bin/bash
#chkconfig: 2345 55 24
#description: logstash service manager
#logstash配置文件
FILE='/usr/local/logstash/etc/*.conf'
#指定logstash配置文件的命令
LOGBIN='/usr/local/logstash/bin/logstash agent --verbose --config'
#用锁文件配合服务启动与关闭
LOCK='/usr/local/logstash/locks'
#日志
LOGLOG='--log /usr/local/logstash/logs/stdou.log'

START() {
        if [ -f $LOCK ];then
                echo -e "Logstash is already \033[32mrunning\033[0m, do nothing."
        else
                echo -e "Start logstash service.\033[32mdone\033[m"
                nohup ${LOGBIN} ${FILE} ${LOGLOG} &
                touch $LOCK
        fi
}

STOP() {
        if [ ! -f $LOCK ];then
                echo -e "Logstash is already stop, do nothing."
        else
                echo -e "Stop logstash serivce \033[32mdone\033[m"
                rm -rf $LOCK
                ps -ef | grep logstash | grep -v "grep" | awk '{print $2}' | xargs kill -s 9 >/dev/null
        fi
}

STATUS() {
        ps aux | grep logstash | grep -v "grep" >/dev/null
        if [ -f $LOCK ] && [ $? -eq 0 ]; then
                echo -e "Logstash is: \033[32mrunning\033[0m..."
        else
                echo -e "Logstash is: \033[31mstopped\033[0m..."
        fi
}

TEST(){
        ${LOGBIN} ${FILE} --configtest
}

case "$1" in
  start)
        START
        ;;
  stop)
        STOP
        ;;
  status)
        STATUS
        ;;
  restart)
        STOP
        sleep 2
        START
        ;;
  test)
        TEST
        ;;
  *)
        echo "Usage: /etc/init.d/logstash (test|start|stop|status|restart)"
        ;;
esac

[root@test1 local]# chkconfig --add logstash
[root@test1 local]# chkconfig logstash on

4.编辑配置文件

[root@test1 ~]# vim /usr/local/logstash/etc/logstash.conf
input {         #表示从标准输入中收集日志
  stdin {}
}

output {       
  elasticsearch  {  #表示将日志输出到ES中
    host => ["10.10.20.16:9200"]   #可以指定多台主机,也可以指定集群中的单台主机
    protocol => "http"
  }
}

5.启动

#/etc/init.d/logstash或通过以下启动
[root@test1 ~]# /usr/local/logstash/bin/logstash -f /etc/logstash.conf
Logstash startup completed
hello world    #这里是自己手动写入的内容

上面我们只是简单通过hello world来简单演示了下,下面我们需要通过kibana来展示。

  • 三.Kibana

在此只部署单台的Kibana用于图形展示,当然我们还可以通过zookeeper来实现Kibana高可用集群。

1.下载并安装

wget https://download.elastic.co/kibana/kibana/kibana-4.1.2-linux-x64.tar.gz
tar -zxvf kibana-4.1.2-linux-x64.tar.gz -C /usr/local/
cd /usr/local
ln -sv kibana-4.1.2-linux-x64 kibana

2.修改配置文件

vim /usr/local/kibana/config/kibana.yml
#默认端口可以修改的
server.port: 5601 
#kibana监听的ip     
server.host: "0.0.0.0" 
#由于es在本地主机上面,所以这个选项打开注释即可
elasticsearch.url: "http://localhost:9200" 

3.启动脚本

[root@test ~]# vim /etc/init.d/kibana 
#!/bin/bash
#chkconfig: 2345 55 24
#description: kibana service manager

KIBBIN='/usr/local/kibana/bin/kibana'
LOCK='/usr/local/kibana/locks'

START() {
        if [ -f $LOCK ];then
                echo -e "kibana is already \033[32mrunning\033[0m, do nothing."
        else
                echo -e "Start kibana service.\033[32mdone\033[m"
                cd  /usr/local/kibana/bin
        nohup ./kibana & >/dev/null
                touch $LOCK
        fi
}

STOP() {
        if [ ! -f $LOCK ];then
                echo -e "kibana is already stop, do nothing."
        else
                echo -e "Stop kibana serivce \033[32mdone\033[m"
                rm -rf $LOCK
                ps -ef | grep kibana | grep -v "grep" | awk '{print $2}' | xargs kill -s 9 >/dev/null
        fi
}

STATUS() {
        Port=$(netstat -tunl | grep ":5602")
        if [ "$Port" != "" ] && [ -f $LOCK ];then
                echo -e "kibana is: \033[32mrunning\033[0m..."
        else
                echo -e "kibana is: \033[31mstopped\033[0m..."
        fi
}

case "$1" in
  start)
        START
        ;;
  stop)
        STOP
        ;;
  status)
        STATUS
        ;;
  restart)
        STOP
    sleep 2
    START
        ;;
  *)
        echo "Usage: /etc/init.d/kibana (|start|stop|status|restart)"
        ;;
esac

[root@test ~]# /etc/init.d/kibana start
[root@test ~]# netstat -ntlp |grep :5601
tcp        0      0 0.0.0.0:5601                0.0.0.0:*                   LISTEN      47145/./../node/bin

4.访问10.10.20.16:5601,检查kibana是否启动

ok,经过以上我们的ELK基础环境就搭建完毕了,至于ES集群,Kibana集群及redis/kafaka队列等我们就先不介绍了。下面我们就拿nginx日志来做下展示吧。

应用

说明:我们通过ELKstack环境收集nginx日志,来实现相关图形展示。

1.修改nginx的日志格式

通常情况下我们需要通过logstash对nginx日志进行切割,但是nginx支持json格式,这样省去了不少麻烦,还可以减少性能消耗。

        log_format json '{"@timestamp":"$time_iso8601",'
#                 '"upstreamhost":"$upstream_addr",'
                 '"host":"$server_addr:$server_port",'
                 '"method":"$request_method",'
                 '"url":"$uri",'
#                '"args":"$args"'
                 '"clientip":"$remote_addr",'
                 '"protocol":"$server_protocol",'
                 '"useragent":"$http_user_agent",'
                 '"referer":"$http_referer",'
                 '"http_host":"$host",'
                 '"status":"$status",'
#                 '"size":"$body_bytes_sent",'
#                 '"responsetime":"$request_time",'
                 '"cache_status":"$upstream_cache_status"}';

nginx -s reload重启

2.编辑logstash的配置文件

vim /usr/local/logstash/etc/logstash.conf 
input {
        file {
                path => "/data/nginx/logs/access_java.log"
                type => "nginx-access"
                start_position => "beginning"
                codec => "json"
        }
}
output {
        if [type] == "nginx-access" {
                elasticsearch {
                        hosts => ["10.10.20.16:9200"]
                        index => "nginx-access-%{+YYYY-MM}"
                }
        }

}

/etc/init.d/logstash start启动

3.访问kibana
(1)setting界面下,创建Indices

注意: [nginx-access-]YYYY.MM 的格式必须和logstash配置文件output中type字段设置的格式一样。

(2)当上面这一步完成后,我们到Discover界面下,就可以看到访问记录了。

在这个界面下我们可以看到站点访问的实时日志,我们可以在搜索栏中搜索,如statsu:200,就会显示匹配访问状态码为200的所有访问记录了。

(3)到Visualize界面,我们来生成饼图,利用aggregation聚合来生成图形。

(4)到dashboard界面,来进行展示,下面是定义的几个图。

要生成各式各样的图片,我们需要掌握aggregation聚合器的使用,由于中文文档较少,我们需要到kibana官方文档去了解,地址:https://www.elastic.co/guide/en/kibana/4.1/index.html

另ELKstack的中文指南:http://kibana.logstash.es/content/

参考博客:
http://www.fblinux.com/?p=40
http://blog.sctux.com/?p=451

总结

  通过以上介绍,我们对ELKstack的使用有了一个初步了解,但是要真正使用的生产环境中还有许多坑要填,希望大家通过实践慢慢去摸索。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐