Spring Cloud ELK+kafka日志分析平台(一) 搭建

  Seves

    一、简介
      ELK是三个开源软件的缩写,分别为elasticsearch、logstash、kibana,elasticsearch是一个基于Lucene和Restful接口的分布式搜索引擎,logstash主要是用来日志的搜集、过滤和分析的工具,kibana是一个为elasticsearch和logstash提供良好的数据分析、检索、汇总可视化Web界面的工具,现在ELK已经被广泛应用到日志分析平台的搭建。而Spring Cloud作为现在最热门的微服务架构,其分布式的日志输出如果使用传统方式来进行分析查看会非常麻烦,可以直接用ELK来为其日志提供友好的服务,而kafka作为现在大数据消息队列的标准可以作为Spring Cloud与ELK之间的桥梁。
    二、架构设计
    这里写图片描述
      如上图所示,我们的服务可以输出日志到kafka,然后logstash去kafka集群中消费日志数据,进行过滤处理后把日志存储在elasticsearch中,然后用户通过kibana去分析elasticsearch中数据。由于kafka、elasticsearch、logstash都可以配置集群,为日志系统提供了高可用性和高性能性。
    三、日志格式的设计
      由于业务场景的不同可能需要根据业务来做出相应的设计,笔者只给出一个基础的格式,以log4j2为例 <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%-15.15t] [%-30.30c{1.}][%-15.20M - %L] [${SERVER_NAME}] [${LOCAL_IP}] - %msg%xEx%n</Property>其中${SERVER_NAME} 可以在log4j2中配置property可以输出当前应用名为以后的日志分析做准备,同样${LOCAL_IP}也可以去配置property去获取环境变量输出应用部署服务器ip,由于服务可能部署在多台服务器上通过此配置为以后的故障排查做准备,例如 <property name="LOCAL_IP">${env:SERVER_IP}</property>
    四、搭建与部署
    1.日志输出
      笔者以log4j2为例,大家也可以其他方式将日志输出到kafka。在log4j2中需要配置kafka的相关参数(由于笔者使用docker启动服务所以通过环境变量的方式传入kafka地址来达到灵活性),并在输出中引入。例如:
    这里写图片描述
      同时要在pom文件中引入kafka依赖,可使用apache官方kafka依赖,也可以引入spring-kafka,例如在如下两个依赖选其一就行,spring-kafka用的是spring-boot1.5.10管理的依赖,亲测这两个版本没有什么问题

    <dependency>
               <groupId>org.springframework.kafka</groupId>
               <artifactId>spring-kafka</artifactId>
           </dependency>
           <dependency>
               <groupId>org.apache.kafka</groupId>
               <artifactId>kafka-clients</artifactId>
               <version>0.9.0.1</version>
           </dependency>
    

    2.kafka搭建
      这个没什么好说的,kafka依赖于zookeeper,去搭建其默认配置就好了,可单机可集群。
    3.elasticsearch
      可以使用docker去部署,可以考虑单机或者集群,其默认配置就可以,笔者使用的版本为5.6.9,elasticsearch部署常见问题可以参照我的博客http://xuyangyang.club/articles/2018/03/23/1521784622259.html
    4.logstash
      logstash这块需要去配置一些东西,例如从kafka中读取消息以及输出到elasticsearh,其中配置filter这个环节比较重要,因为需要对以及参数进行处理并创建field为之后的检索作友好的支持,如不配置的话只能在kibana中检索,但不能基于某个字段做一些过滤,笔者使用的grok插件做的过滤,但貌似这个插件比较耗费资源,下面我将给出一个doker启动脚本配置的示例(logstash版本为5.6.9)。
    这里写图片描述
      其中grok的match是匹配消息并通过正则表达式过滤,上图match配置的是笔者在上文中给出的log4j2日志输出格式的过滤,大家可以通过http://grokdebug.herokuapp.com/ 来调试所需的grok正则表达式
    5.kibana
      kibana,使用其默认配置就好,只需要传入elastic地址,第一次访问需要输入elastic的索引,可以使用在 logstash配置的索引,如果不配置logstash在收到数据输出elastic时会创建默认索引。

    CSDN地址:https://blog.csdn.net/qq_36236890

    微信订阅号:
    微信订阅号

    手在键盘敲很轻,我写的代码很小心。
    443