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

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

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

开发

开发工具

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

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

[[224659]]

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. <dependency> 
  2.   <groupId>net.logstash.logback</groupId> 
  3.   <artifactId>logstash-logback-encoder</artifactId> 
  4.   <version>4.6</version> 
  5. </dependency> 
  • 在工程/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. <?xml version="1.0" encoding="UTF-8"?> 
  2. <configuration> 
  3.     <include resource="org/springframework/boot/logging/logback/defaults.xml"/> 
  4.        
  5.     <springProperty scope="context" name="springAppName" source="spring.application.name"/> 
  6.     <!-- 日志在工程中的输出位置 --> 
  7.     <property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}"/> 
  8.     <!-- 控制台的日志输出样式 --> 
  9.     <property name="CONSOLE_LOG_PATTERN" 
  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.     <!-- 控制台Appender --> 
  13.     <appender name="console" class="ch.qos.logback.core.ConsoleAppender"
  14.         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">            
  15.             <level>INFO</level
  16.         </filter> 
  17.          <encoder> 
  18.             <pattern>${CONSOLE_LOG_PATTERN}</pattern> 
  19.             <charset>utf8</charset> 
  20.        </encoder> 
  21.     </appender> 
  22.  
  23.     <!-- 为logstash输出的json格式的Appender --> 
  24.     <appender name="logstash" class="ch.qos.logback.core.rolling.RollingFileAppender"
  25.         <file>${LOG_FILE}.json</file> 
  26.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"
  27.             <fileNamePattern>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</fileNamePattern> 
  28.             <maxHistory>7</maxHistory> 
  29.         </rollingPolicy> 
  30.         <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"
  31.             <providers> 
  32.                 <timestamp
  33.                     <timeZone>UTC</timeZone> 
  34.                 </timestamp
  35.                 <pattern> 
  36.                     <pattern> 
  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.                     </pattern> 
  49.                 </pattern> 
  50.             </providers> 
  51.         </encoder> 
  52.     </appender> 
  53.        
  54.     <root level="INFO"
  55.         <appender-ref ref="console"/> 
  56.         <appender-ref ref="logstash"/> 
  57.     </root> 
  58. </configuration> 

对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":"===<call trace-1>==="
  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. <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"
  2.   <destination>127.0.0.1:9250</destination> 
  3.   ... 
  4. </appender> 

本文完整示例:

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

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

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

戳这里,看该作者更多好文

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/252314.html<

(0)
运维的头像运维
上一篇2025-04-29 09:24
下一篇 2025-04-29 09:25

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注