在微服务开发过程当中,通常都会利用多台服务器作分布式部署,如何可以把分散在各个服务器中的日志归集起来作分析处理,是一个微服务服务须要考虑的一个因素。html
搭建一个日志系统须要考虑一下一些因素:java
第一个问题,针对咱们小公司来讲,基本没有本身的研发能力,绝对是选用第三方开源的组件了。ELK配置比较简单,有现成的UI界面,容易检索日志信息,是首选。
第二个问题,利用log4j2定义好统一的日志格式,利用logstash过滤日志内容。
第三个问题,全局跟踪的ID有几种生产方式,一种是利用UUID或者生成随机数,一种是利用数据库来生成sequence number,还能够经过自定义一个id生成服务来获取。考虑到自身服务的须要,这里选用生成随机数来实现。linux
从左边看起,每一台webserver上都会部署一个logstash-agent,它的做用是用相似tailf的方式监听日志文件,而后把新添加的日志发送到redis队列里面,logstash-indexer负责从redis相应的队列里面取出日志,对日志进进行加工后输出到elasticsearch中,elasticsearch会根据要求对日志进行索引归集,最后用户能够经过kibana来查看和分析日志。git
准备工做github
这里不涉及怎样安装JDK和Redis,请自行查阅资料web
使用logstash2.3.1, elasticsearch2.3.1, kibana2.3.1redis
首先去ELK官网下载相应的压缩包
https://www.elastic.co/downloads数据库
1.解压 tar -zxvf logstash2.3.1
2.检验安装是否成功 bin/logstash -e "input{stdin{}}output{stdout{}}"
,而后在终端输入hello,看看有没有内容返回
3.编写配置文件logstash_agent.conf
在logstash安装目录下新建conf文件夹,在里面新建配置文件logstash_agent.conf
服务器
input { file { type => "customer_service" #须要收集的日志文件 path => ["/home/java/logs/cust/customer-service-*.log"] tags => ["customer-service", "log4j2"] # codec => multiline { # pattern => "^%{TIMESTAMP_ISO8601}" negate => true what => "previous" } } } output { redis { host => "192.168.235.195" data_type => "list" key => "logstash:redis:customer" } }
4.后台启动 nohup ./bin/logstash -f conf/logstash_agent.conf &
架构
1.解压tar -zxvf elasticsearch-2.3.1.tar.gz
2.修改安装目录下的配置文件config/elasticsearch.yml
把network.host字段给反注释掉,把地址改成0.0.0.0(官方并没明确说要去改这配置,默认配置应该就能够了,不过实测的时候发现若是不作这修改,elasticsearch访问不了)
3.后台启动elasticsearch nohup ./bin/elasticsearch &
与在webserver上安装logstash-agent
一节基本相同,只是配置文件不同,这里使用logstash-indexer.conf
input { redis { host => "localhost" #redis地址 data_type => "list" key => "logstash:redis:customer" type => "redis-input" } } filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:date} \[(?<thread_name>.+?)\] (?<log_level>\w+)\s*(?<content>.*)" } } date { match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"] } } output { if[type] == "customer_service" { elasticsearch { #embedded => false #protocol => "http" hosts => "localhost:9200" index => "customer-%{+YYYY.MM.dd}" } }else if[type] == "其余类型" { elasticsearch { #embedded => false #protocol => "http" hosts => "localhost:9200" index => "其余类型索引名字-%{+YYYY.MM.dd}" } }else { //作其余处理 } stdout{ #输出到标准输出,能够去掉 } }
启动logstash-indexer
nohup ./bin/logstash -f conf/logstash-indexer.conf &
1.解压tar -zxvf kibana-4.5.0-linux-x64.gz
2.后台启动kibana nohup ./bin/kibana &
这里没有特别去配置kibana要访问的elasticsearch地址,默认它会找本地的,若是须要,能够到conf/kibana.yml修改
<PatternLayout pattern="%d{ISO8601} %t %level %msg%n"/>
1.打开kibana主页http://your-kibana-ip:5601/
2.输入索引customer-*
,并点击create
3.在Discover页面观察日志
须要了解elasticsearch日志存放在哪里,按期清理日志
索引放久了须要清理,清理因此可使用Elasticsearch的API。
例如我须要删除某个索引2016年5月份的全部索引,可使用下面的命令:
curl -XDELETE 'http://localhost:9200/customer-2016.05.*'
更多API能够查阅Elastic官网
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html
http://www.cnblogs.com/yjf512/p/4199105.html
http://www.cnblogs.com/xing901022/p/4805586.html
https://github.com/chenryn/logstash-best-practice-cn/blob/master/codec/multiline.md
http://www.open-open.com/lib/view/open1451801542042.html
转自
用ELK搭建简单的日志收集分析系统http://m.blog.csdn.net/lzw_2006/article/details/51280058