日志监控和分析在保障业务稳定运行时,起到了很重要的作用,不过一般情况下日志都分散在各个生产服务器,且开发人员无法登陆生产服务器,这时候就需要一个集中式的日志收集装置,对日志中的关键字进行监控,触发异常时进行报警,并且开发人员能够查看相关日志。logstash+elasticsearch+kibana3就是实现这样功能的一套系统,并且功能更强大。
logstash:是一个管理日志和事件的工具,你可以收集它们,解析它们,并存储它们以供以后使用(例如日志搜索),logstash有一个内置的web界面,用来搜索你的所有日志。logstash在部署时有两种运行模式:standalone和centralized:
* standalone:standalone的意思是所有的事情都在一台服务器上运行,包括日志收集、日志索引、前端WEB界面都部署在一台机器上。
* centralized:就是多服务器模式,从很多服务器运输(ship)日志到一台总的日志(collector)服务器上用来索引和查找。
需要注意的是logstash本身并没有什么shipper和indexer这种说法,因为不论是运输日志的进程还是汇集总的日志的进程运行的都是同一个程序,只是使用的配置文件不同而已。
elasticsearch:
基于lucene的开源搜索引擎,是一个分布式的搜索分析系统,主要特点有:real time data、real time analytics、distributed、high availability、multi-tenancy、full text search、document oriented、conflict management、schema free、restful api等等。
kibana3:
可视化日志和数据系统,作为WEB前端可以很容易地和elasticsearch系统结合。kibana有版本2和版本3的区分,版本2采用ruby编写,部署起来很麻烦,需要安装很多ruby依赖包(目前网上多是这个版本的部署),版本3采用纯html+css编写,因此部署起来很方便,解压即用,目前已经是kibana4了,建议大家使用最新版。
出于性能及扩展性考虑,实际应用中logstash我们必然采用centralized模式,最基本的结构图如下:
1、安装redis,安装过程简单,这里不做详细说明。
2、安装ElasticSearch(目前版本1.4)
<span style="font-size:14px;">wget 'https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.7.tar.gz'tar zxvf elasticsearch-0.90.7.tar.gzcd elasticsearch-0.90.7/bin#可以在logstash agent启动后再启动./elasticsearch -f</span>
3、启动logstash shipper,定义配置文件logstash.conf,根据实际情况定义,以下主要定义了input源为文件,output到redis,启动logstash shipper,例如:
<span style="font-family: 'Microsoft YaHei';"><span style="font-size:14px;">input { file { type => "api_log" path => "/home/jws/app/nginxserver/logs/apiaccess.log" debug => true } file { type => "cas_log" path => "/home/jws/app/nginxserver/logs/casaccess.log" debug => true } file { type => "id_log" path => "/home/jws/app/nginxserver/logs/idaccess.log" debug => true } file { type => "login_log" path => "/home/jws/app/nginxserver/logs/loginaccess.log" debug => true } file { type => "proxy_log" path => "/home/jws/app/nginxserver/logs/proxyaccess.log" debug => true }}output { redis { host => "10.20.164.121" data_type => "list" key => "logstash:redis" } redis { host => "10.20.164.122" data_type => "list" key => "logstash:uop_file" }}</span></span>
启动shipper:
java -jar /home/jws/htdocs/logstash/lib/logstash.jar agent -f /home/jws/htdocs/logstash/conf/logstash.conf -l /home/jws/htdocs/logstash/logs/logstash.log
4、启动logstash indexer
logstash的配置文件相当简单,主要有三部分:inputs、filters、outputs。事件在配置文件中的出现是有顺序的。在inputs、output、filter中,允许你设置配置插件,配置插件由一个插件名称和紧跟在后面的插件配置代码块构成。插件中的值可以是布尔值、字符串、数字、哈希、数组等,并且支持条件判断(if…else)。
例如以下indexer中的配置,并启动indexer:
<span style="font-size:14px;">input { file { path => "/home/rsyslog/asaserver/*/*/*/proxy.log.*" exclude => "*.bz2" type => "proxy" }}filter { grok { match => [ "message", "%{APIPROXY}" ] patterns_dir => ["/home/jws/app/logstash/patterns"] } if [request_uripath_orig]{ grok { match => [ "request_uripath_orig", "%{NSSS}" ] patterns_dir => ["/home/jws/app/logstash/patterns"] } }}output { #stdout { codec =>"rubydebug"} elasticsearch_http { host => "10.20.161.36" flush_size => 500 idle_flush_time => 3 index => "logstash_pf_proxy-%{+YYYY.MM.dd.HH}" template => "/home/jws/app/logstash/template/t.json" template_overwrite => true }}</span>
5、安装并启动kibana3,安装过程与普通软件安装无异,可以配合nginx安装,这里不做描述,需要注意的是需要在kibana config.js中配置elasticSearch的地址与端口。
注意红框中的内容,这只是kibana3的默认界面,需要我们用logstash.json代替default.json界面,具体目录源码目录下app/dashboards中。
例如项目中的一个例子,根据需求制作图表(类似饼图,柱状图,折线图等),在笔者实际项目中,从日志中分析数据,实现系统稳定性、响应时间、请求量、业务响应码、HTTP状态码等等以kibana展现;
并且,elasticsearch的用途远不如此,可以用来做搜索数据源,ES提供了编程接口,可以使用编程的方式获取ES中的数据自定义开发监控程序,灵活且功能强大。