最近因为以前协助前公司作了点力所能及的事情,竟然收到了一份贵重的端午礼物,是给我女儿的一个乐高积木,整个有7大包物件,我花了接近一天的时间一砖一瓦的组织起来,虽然很辛苦可是可以从过程当中体验到乐趣。此次将分享从头搭建分布式日志系统,主要是在spring mvc上结合ELK套件实现(以前有些工做因为分工不一样由不一样的同事来完成,我只是在已经配置好的环境下作开发而已),包含以下这些技术点:html
来看下总体的架构图,这类架构很是容易解决当下分布式系统下的日志记录,查询以及分析困难的问题。java
操做系统,IDE环境:node
1:搭建spring mvc项目
eclipse自带建立的dynamic web project是个空结构,没有任何配置,咱们要想跑起来一个hello world的项目,还须要作些配置,好比建立程序文件,好比view,controller等等。
spring tool suite能够帮助咱们解决这个问题,它提供了spring mvc的项目模板,里面自带一个hello world的可启动的应用页面,在eclipse中能够很方便的以插件形式安装spring tool suit,安装好以后就能够建立了。
这里须要注意的是不一样版本的spring tool suite在建立时的菜单会有不一样,我目前的菜单位于:git
首先要选中spring标签:github
而后在File菜单下找:web
建立好以后,咱们就能够直接在tomcat下运行了,不须要任何的其它操做,相对建立的dynamic web project要方便的多,不过经过这种模板建立的项目也有缺点:若是你喜欢新的一些依赖包,那么你须要手工去pom文件中去更新版本号为你想要的,还有可能会引入部分你暂时可能用不上的一些第三方包。下图是稍加修改的项目完成图,是一个标准的maven结构的spring mvc。redis
2:redis安装
因为个人是windows环境,因此相应的须要下载windows版本的redis:
windows版:https://github.com/mythz/redis-windows
下载下来解压,而后选择一个版本:spring
配置文件我只修改了一个:bind,它是用来绑定一个固定IP的,为何要显示的去绑定一个IP呢?后面会介绍我遇到的问题。
启动服务端:在redis/bin目录下执行:redis-server.exe redis.windows.conf便可启动json
启动客户端:在redis/bin目录下执行:redis-cli.exe -h 127.0.0.1 -p 6379,在这个窗口能够经过一些redis命令再测试redis是否正常,好比get,set ,keys *等等。windows
3:ELK安装
在这个网站能够找到ELK最新版本:https://www.elastic.co/downloads,将elasticsearch,logstash,kibana这三个所有下载下来。
大部分的配置都使用默认的,只是为了好标识我修改了cluster.name以及node.name,详细的参数可研究文档。而后直接在bin目录下运行elasticsearch.bat就能够启动了。
打开http://127.0.0.1:9200/就能够,看到以下信息就说明启动正常了。
还有不少插件能够安装,用来帮助咱们查看监控elasticsearch,这里先安装head,命令行进入elasticsearch的目录,而后执行plugin install mobz/elasticsearch-head便可安装。
安装成功后打开http://127.0.0.1:9200/_plugin/head/
先看下logstash的架构设计以及与其它ELK的配合,本篇的data source就是redis,不涉及到filter,最终日志输出到elasticsearch中。
这里咱们只配置input以及output,须要注意的是不一样版本的logstash在配置上也会略有不一样,你们有兴趣能够进一步作下对比。
input { redis { data_type => "list" key => "logstash" host => "127.0.0.1" port => 6379 threads => 5 codec => "json" } } filter { } output { elasticsearch { hosts => ["127.0.0.1:9200"] index => "logstash-%{type}-%{+YYYY.MM.dd}" document_type => "%{type}" workers => 1 flush_size => 20 idle_flush_time => 1 template_overwrite => true } stdout{} }
而后在logstash目录下执行logstash -f etc/logstash.d/便可启动
须要有一个记录日志的入口,将logback-classic引入进来,为了将日志传递给redis,须要配置一个logback-redis-appender,依赖以下:
<!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> <!--logstash begin --> <dependency> <groupId>com.cwbase</groupId> <artifactId>logback-redis-appender</artifactId> <version>1.1.3</version> <exclusions> <exclusion> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </exclusion> </exclusions> </dependency>
配置logback.xml,key须要与logstash配置文件中配置的key相匹配。
<appender name="LOGSTASH" class="com.cwbase.logback.RedisAppender"> <source>logstashdemo</source> <type>dev</type> <host>127.0.0.1</host> <key>logstash</key> <tags>dev</tags> <mdc>true</mdc> <location>true</location> <callerStackIndex>0</callerStackIndex> </appender>
在homecontroller中记录日志,slf4j因为完成了与logback完美集成,因此咱们也不须要作任何转换类的配置便可实现日志记录。
前文中曾经提到在配置redis时,设置了bind属性,让其指定到一个固定的IP。若是不指定,在logstash链接redis会有问题,其中的缘由有待后续进一步确认。
4:运行网站,查看日志
当redis,elasticsearch,logstash服务运行正常后,启动spring mvc,经过logger记录的日志就能够在kibana中方便的查看了。
测试logback是否已经将日志发送到redis,能够经过redis的命令来查看是否包含了配置的logstash这个key,还能够经过llen来判断日志是否在正常的递增。
若是上面都正常,再找开kibana的页面,第一次打开会提示建立索引规则,建立好以后就能够看到日志已经被采集到elasticsearch中了。
通过接近两天的研究,终于从0开始搭建成功了spring mvc+ELK的分布式日志管理平台,java平台的优点就是开源的产品多,可利用优秀插件也多,擅于去发倔仍是能够很省事的作些比较优秀的项目的。虽然本篇只是一个练手入门文章,但有了开始就会有收获。
本文参考:
http://www.cnblogs.com/ASPNET2008/p/5594479.html