Elasticsearch + Logstash + Kibana日志管理方案浅析
本文转自:http://www.icyfire.me/2014/11/13/logstash-es-kibana.html
概述
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
$tarzxvf 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
$tarzxvf elasticsearch-1.4.0.tar.gz
|
启动服务
$cdelasticsearch-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
tarzxvf 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
$mvdefault.json default_origin.json
$mvlogstash.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强大的检索功能,我们可以做出适合于我们系统的日志管理。上面只是作一个简单的了解。希望有时间作更深入的研究。