Elasticsearch + Logstash + Kibana日志管理方案浅析

概述

Elasticsearch + Logstash + Kibana(ELK)是一套开源的日志管理方案。

  • Logstash:负责日志的收集,处理和储存。
  • Elasticsearch:负责日志检索和分析。
  • Kibana:负责日志的可视化。

三个软件的安装使用都非常简单,基本下载下来就可以使用了,没有繁琐的安装步骤。下面我会作一个简单的介绍,但不会深入去探讨。

Logstash

依赖

Logstash唯一的依赖的Java运行环境,请确保Java已正确安装,最好安装较新的版本:

$ java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)

安装

下载和解压出来就能使用了,不需要安装:

$ wget https://download.elasticsearch.org/logstash/logstash/logstash-1.4.2.tar.gz
$ tar zxvf logstash-1.4.2.tar.gz

验证

$ cd /path/to/logstash/
$ bin/logstash -e 'input { stdin { } } output { stdout {} }'
hello world
2014-11-13T02:46:46.340+0000 linux hello world

-e表示直接从命令行输入配置文件,input表示输入,output表示输出。上面我们使用的是标准输入和标准输出作为logstash的输入和输出。

我们后面要做的是把输出存储到Elasticsearch。

Elasticsearch

安装

同样的,Elasticsearch下载下来解压后即可使用:

$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.4.0.tar.gz
$ tar zxvf elasticsearch-1.4.0.tar.gz

启动服务

$ cd elasticsearch-1.4.0
$ bin/elasticsearch

Elasticsearch同样依赖于Java运行环境,而且要求1.7以上的版本,不然启动会报以下错误:

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/elasticsearch/bootstrap/Elasticsearch : Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: org.elasticsearch.bootstrap.Elasticsearch.  Program will exit.

正常的启动信息如下:

[2014-11-12 18:04:14,250][INFO ][node                     ] [Thunderclap] version[1.4.0], pid[25882], build[bc94bd8/2014-11-05T14:26:12Z]
[2014-11-12 18:04:14,251][INFO ][node                     ] [Thunderclap] initializing ...
[2014-11-12 18:04:14,256][INFO ][plugins                  ] [Thunderclap] loaded [], sites []
[2014-11-12 18:04:16,527][INFO ][node                     ] [Thunderclap] initialized
[2014-11-12 18:04:16,528][INFO ][node                     ] [Thunderclap] starting ...
[2014-11-12 18:04:16,820][INFO ][transport                ] [Thunderclap] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/192.168.205.252:9300]}
[2014-11-12 18:04:16,839][INFO ][discovery                ] [Thunderclap] elasticsearch/AWsqNT85SbytA3OYMKvekQ
[2014-11-12 18:04:20,625][INFO ][cluster.service          ] [Thunderclap] new_master [Thunderclap][AWsqNT85SbytA3OYMKvekQ][linux][inet[/192.168.205.252:9300]], reason: zen-disco-join (elected_as_master)
[2014-11-12 18:04:20,647][INFO ][http                     ] [Thunderclap] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/192.168.205.252:9200]}
[2014-11-12 18:04:20,647][INFO ][node                     ] [Thunderclap] started
[2014-11-12 18:04:20,706][INFO ][gateway                  ] [Thunderclap] recovered [0] indices into cluster_state

验证

可以直接通过HTTP协议访问Elasticsearch,默认端口为9200

$ curl -X GET http://localhost:9200
{
  "status" : 200,
  "name" : "Thunderclap",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.4.0",
    "build_hash" : "bc94bd81298f81c656893ab1ddddd30a99356066",
    "build_timestamp" : "2014-11-05T14:26:12Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.2"
  },
  "tagline" : "You Know, for Search"
}

Elasticsearch更多的用法可以看安装目录下的README.textile文件。

下面我先把展示界面安装好。

Kibana

安装

wget https://download.elasticsearch.org/kibana/kibana/kibana-3.1.2.tar.gz
tar zxvf kibana-3.1.2.tar.gz 

配置

然后我们需要一个web server作为容器,这里我使用nginx。配置nginx文件:

server {
    listen       80;
    server_name  kibana;
    root   /path/to/kibana/;
    index  index.html;

}

配置host并访问:http://kibana/。由于访问Elasticsearch服务出错,所以会出现以下界面:

我们修改Kibana安装目录下的配置文件config.js

elasticsearch: "http://localhost:9200",

然后修改Elasticsearch的配置文件elasticsearch.yml,增加以下配置:

http.cors.enabled: true

再次访问:

然后我们修改默认的显示面板为logstash:

$ cd /path/to/kibana/app/dashboards
$ mv default.json default_origin.json 
$ mv logstash.json default.json

再访问:

Elasticsearch + Logstash + Kibana

下面我们结合3者来做一个例子。我们通过Logstash收集Nginx的日志,并存储到Elasticsearch,最后用Kibana显示出来。

首先我们配置Logstash,让它能收集Nginx的日志,并输出到Elasticsearch。假设我们的Nginx的access_log的格式为:

log_format  main  '$remote_addr - $remote_user [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent" ';

我们在Logstash的安装目录下创建配置文件logstash.conf,并输入以下内容:

input {
    file {
        type => "nginx-access"
        path => "/path/to/nginx/access.log"
    }
}

filter {
    grok {
        type => "nginx-access"
        match => {"message" => "%{IPORHOST:source_ip} - %{USERNAME:remote_user} \[%{HTTPDATE:timestamp}\] %{QS:request} %{INT:status} %{INT:body_bytes_sent} %{QS:http_referer} %{QS:http_user_agent}"}
    }
}

output {
    elasticsearch { host => localhost }
}

我们可以看到input设为file,output设为elasticsearch,然后我们还用到了filter,它的作用是用来对输入的日志进行过滤处理。

然后我们通过这个配置文件来启动Logstash:

$ bin/logstash -f logstash.conf

等Nginx运行了一段时间后,我们再访问Kibana:

我们可以看到已经一些图表和日志事件显示在Web界面上。

后话

通过对Kibana的定制和Elasticsearcht强大的检索功能,我们可以做出适合于我们系统的日志管理。上面只是作一个简单的了解。希望有时间作更深入的研究。

本条目发布于