SpringCloud构建微服务架构:分布式服务跟踪(整合logstash)

Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)

作者:翟永超 2018-04-02 15:01:31


分布式 引入基于日志的分析系统是一个不错的选择,比如:ELK平台,它可以轻松的帮助我们来收集和存储这些跟踪日志,同时在需要的时候我们也可以根据Trace ID来轻松地搜索出对应请求链路相关的明细日志。

创新互联主营银海网站建设的网络公司,主营网站建设方案,成都App制作,银海h5成都微信小程序搭建,银海网站营销推广欢迎银海等地区企业咨询

通过之前的入门示例,我们已经为trace-1和trace-2引入了Spring Cloud Sleuth的基础模块spring-cloud-starter-sleuth,实现了为各微服务的日志信息中添加跟踪信息的功能。但是,由于日志文件都离散的存储在各个服务实例的文件系统之上,仅仅通过查看日志文件来分析我们的请求链路依然是一件相当麻烦的差事,所以我们还需要一些工具来帮助我们集中的收集、存储和搜索这些跟踪信息。引入基于日志的分析系统是一个不错的选择,比如:ELK平台,它可以轻松的帮助我们来收集和存储这些跟踪日志,同时在需要的时候我们也可以根据Trace ID来轻松地搜索出对应请求链路相关的明细日志。

ELK平台主要有由ElasticSearch、Logstash和Kiabana三个开源免费工具组成:

  • Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
  • Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用。
  • Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

Spring Cloud Sleuth在与ELK平台整合使用时,实际上我们只要实现与负责日志收集的Logstash完成数据对接即可,所以我们需要为Logstash准备json格式的日志输出。由于Spring Boot应用默认使用了logback来记录日志,而Logstash自身也有对logback日志工具的支持工具,所以我们可以直接通过在logback的配置中增加对logstash的appender,就能非常方便的将日志转换成以json的格式存储和输出了。

下面我们来详细介绍一下在快速入门示例的基础上,如何实现面向Logstash的日志输出配置:

  • 在pom.xml依赖中引入logstash-logback-encoder依赖,具体如下:
  
 
 
  1.  
  2.   net.logstash.logback 
  3.   logstash-logback-encoder 
  4.   4.6 
  5.  
  • 在工程/resource目录下创建bootstrap.properties配置文件,将spring.application.name=trace-1配置移动到该文件中去。由于logback-spring.xml的加载在application.properties之前,所以之前的配置logback-spring.xml无法获取到spring.application.name属性,因此这里将该属性移动到***加载的bootstrap.properties配置文件中。
  • 在工程/resource目录下创建logback配置文件logback-spring.xml,具体内容如下:
  
 
 
  1.  
  2.  
  3.      
  4.        
  5.      
  6.      
  7.      
  8.      
  9.     
  10.               value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/> 
  11.  
  12.      
  13.      
  14.                     
  15.             INFO 
  16.          
  17.           
  18.             ${CONSOLE_LOG_PATTERN} 
  19.             utf8 
  20.         
  21.      
  22.  
  23.      
  24.      
  25.         ${LOG_FILE}.json 
  26.          
  27.             ${LOG_FILE}.json.%d{yyyy-MM-dd}.gz 
  28.             7 
  29.          
  30.          
  31.              
  32.                  
  33.                     UTC 
  34.                  
  35.                  
  36.                      
  37.                         { 
  38.                           "severity": "%level", 
  39.                           "service": "${springAppName:-}", 
  40.                           "trace": "%X{X-B3-TraceId:-}", 
  41.                           "span": "%X{X-B3-SpanId:-}", 
  42.                           "exportable": "%X{X-Span-Export:-}", 
  43.                           "pid": "${PID:-}", 
  44.                           "thread": "%thread", 
  45.                           "class": "%logger{40}", 
  46.                           "rest": "%message" 
  47.                         } 
  48.                      
  49.                  
  50.              
  51.          
  52.      
  53.        
  54.      
  55.          
  56.          
  57.      
  58.  

对logstash支持主要通过名为logstash的appender实现,内容并不复杂,主要是对日志信息的格式化处理,上面为了方便调试查看我们先将json日志输出到文件中。

完成上面的改造之后,我们再将快速入门的示例运行起来,并发起对trace-1的接口访问。此时我们可以在trace-1和trace-2的工程目录下发现有一个build目录,下面分别创建了以各自应用名称命名的json文件,该文件就是在logback-spring.xml中配置的名为logstash的appender输出的日志文件,其中记录了类似下面格式的json日志:

  
 
 
  1. {"@timestamp":"2016-12-04T06:57:58.970+00:00","severity":"INFO","service":"trace-1","trace":"589ee5f7b860132f","span":"a9e891273affb7fc","exportable":"false","pid":"19756","thread":"http-nio-9101-exec-1","class":"c.d.TraceApplication$$EnhancerBySpringCGLIB$$a9604da6","rest":"======"} 
  2. {"@timestamp":"2016-12-04T06:57:59.061+00:00","severity":"INFO","service":"trace-1","trace":"589ee5f7b860132f","span":"2df8511ddf3d79a2","exportable":"false","pid":"19756","thread":"http-nio-9101-exec-1","class":"o.s.c.a.AnnotationConfigApplicationContext","rest":"Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@64951f38: startup date [Sun Dec 04 14:57:59 CST 2016]; parent: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@4b8c8f15"} 

我们除了可以通过上面的方式生成json文件之外,也可以使用LogstashTcpSocketAppender将日志内容直接通过Tcp Socket输出到logstash服务端,比如:

  
 
 
  1.  
  2.   127.0.0.1:9250 
  3.   ... 
  4.  

本文完整示例:

读者可以根据喜好选择下面的两个仓库中查看trace-1和trace-2两个项目:

  • Github:https://github.com/dyc87112/SpringCloud-Learning/
  • Gitee:https://gitee.com/didispace/SpringCloud-Learning/

【本文为51CTO专栏作者“翟永超”的原创稿件,转载请通过51CTO联系作者获取授权】

当前标题:SpringCloud构建微服务架构:分布式服务跟踪(整合logstash)
当前链接:http://www.csdahua.cn/qtweb/news31/212181.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网