日志查询利器 Logstash和ElasticSearch

作者: admin 分类: 自动化管理 发布时间: 2013-12-04 09:45 115次浏览 6暂无评论

日志查询利器 Logstash和ElasticSearch

一、需要解决的问题:

1、日志分散在各个不同的硬件设备上,特别是在分布式系统下,想找到一个日志,将是很困难的事情。

2、日志检索是一个比较麻烦的事情,通常工程师会采用grep等linux指令进行处理。但是跨时间段查询、计数等需求,需要更多的系统级别的指令综合处理才能完成。无形中增加了难度。

3、日志检索到后,可能有成千上万行,工程师需要对这部分数据再进行钻取,得到最后的检索结果。

二、解决方案:

1、Logstash是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用(如,搜索)。

http://logstash.net/

2、Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

http://es-cn.medcl.net/

3、kibana 也是一个开源和免费的工具,他可以帮助您汇总、分析和搜索重要数据日志并提供友好的web界面。

使用上述的三个组件,可以组成一个很好的查询引擎。

Logstash

Logstash


三、整体架构

1、在需要收集日志的服务上部署Logstash,作为Agent。

2、在中心服务器上,部署Redis,作为缓冲队列。

3、在中心服务器上,部署Logstash,作为Indexer。

4、在中心服务器上,部署ElasticSearch。

5、在中心服务器上,部署kibaba

架构图如下:

Elasticsearch

Elasticsearch


四、部署:

服务器准备:192.168.1.1(Nginx–日志发生文件夹) 192.168.1.2(中心服务器)

部署:

1、192.168.1.1上配置Nginx日志模式,重启

log_format logstash_json ‘{ “@timestamp”: “$time_iso8601″, ‘

‘”@fields”: { ‘

‘”remote_addr”: “$remote_addr”, ‘

‘”remote_user”: “$remote_user”, ‘

‘”body_bytes_sent”: “$body_bytes_sent”, ‘

‘”request_time”: “$request_time”, ‘

‘”status”: “$status”, ‘

‘”request”: “$request”, ‘

‘”request_method”: “$request_method”, ‘

‘”http_referrer”: “$http_referer”, ‘

‘”http_user_agent”: “$http_user_agent” } }’;

access_log logs/access.log logstash_json;

2、192.168.1.1 上部署Logstash(Agent)

下载Logstash(https://download.elasticsearch.org/logstash/logstash/logstash-1.2.2-flatjar.jar),并上传。

配置文件如下:

input{
file{
path => “/usr/local/nginx/logs/access.log”
type => nginx # This format tells logstash to expect ‘logstash’ json events from the file.
format => json_event}
}

output{
redis{
host => “192.168.1.2″
port => 6371
data_type => “list”
key => “logstash”}
}

启动:

nohup java -jar logstash-1.2.2-flatjar.jar agent -f logstash.conf > nohup &
3、192.168.1.2 上部署Redis(不赘述,参考wiki)

4、192.168.1.2 上部署Logstash(Indexer)

input{
redis{
host => “127.0.0.1″ # these settings should match the output of the agent
data_type => “list”
key => “logstash”
port => 6371 # We use the ‘json’ codec here because we expect to read # json events from redis.
codec => json}
}

output{
stdout{
debug => true
debug_format => “json”}
elasticsearch{
host => “127.0.0.1″}
}
nohup java -jar logstash-1.2.2-flatjar.jar agent -f logstash.conf > nohup &
5、192.168.1.2 上部署ElasticSearch

下载:http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.5.tar.gz

$ bin/elasticsearch

6、192.168.1.2 上部署kibana

nohup java -jar logstash-1.2.2-flatjar.jar web > web.log &

最终效果

Logstash Search

Logstash Search


Logstash Search

Logstash Search

本文章作者来自于talkingdata(北京腾云天下技术团队)