Spring Cloud Sleuth 链路追踪
2017-12-22 09:33
711 查看
随着微服务的数量增长,一个业务接口涉及到多个微服务的交互,在出错的情况下怎么能够快速的定位错误,这是一个难题。
好在Spring Cloud已经为什么实现了一个非常好的方案来对服务进行追踪。
Sleuth就是做这个事情的,它在日志中引入唯一的请求ID来标识每次请求,通过SpanId来构成整个的链路。
只需要引入依赖就可以集成Sleuth
在方法中记录日志我们会发现在日志的最前面对了一部分内容,这部分内容就是Sleuth为什么提供的链路信息
可以看到内容是由
- appname:服务的名称,也就是spring.application.name的值,这边要注意下,如果需要输出正确的服务名称,需要将spring.application.name的配置写在bootstrap.properties中
- traceId:整个请求的唯一ID,它标识整个整个请求的链路
- spanId:基本的工作单元,发起一起远程调用就是一个span
- exportable:是否导入数据到Zipkin中
如果仅仅是通过上面的方式,在每条日志中都记录请求的链路信息,我们也是可以通过traceId来追踪整个请求的信息,但是不是特别直观,这个时候就需要将数据导入Zipkin中更直观的显示,或者导入到ES中,用Kibana查看,方便集中管理。
如果需要将跟踪的信息导入到ES中,可以将跟踪的信息以JSON格式的数据输出,然后用logstash收集输出到ES中。
输出JSON格式的日志首先需要导入一个依赖包
然后创建一个logback-spring.xml文件, 配置logstash需要收集的数据格式
具体代码可以参考我的github:
https://github.com/yinjihuan/spring-cloud
好在Spring Cloud已经为什么实现了一个非常好的方案来对服务进行追踪。
Sleuth就是做这个事情的,它在日志中引入唯一的请求ID来标识每次请求,通过SpanId来构成整个的链路。
只需要引入依赖就可以集成Sleuth
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
在方法中记录日志我们会发现在日志的最前面对了一部分内容,这部分内容就是Sleuth为什么提供的链路信息
2016-02-02 15:30:57.902 INFO [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ... 2016-02-02 15:30:58.372 ERROR [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ... 2016-02-02 15:31:01.936 INFO [bar,46ab0d418373cbc9,46ab0d418373cbc9,false] 23030 --- [nio-8081-exec-4] ...
可以看到内容是由
[appname,traceId,spanId,exportable]组成的, 具体含义如下:
- appname:服务的名称,也就是spring.application.name的值,这边要注意下,如果需要输出正确的服务名称,需要将spring.application.name的配置写在bootstrap.properties中
- traceId:整个请求的唯一ID,它标识整个整个请求的链路
- spanId:基本的工作单元,发起一起远程调用就是一个span
- exportable:是否导入数据到Zipkin中
如果仅仅是通过上面的方式,在每条日志中都记录请求的链路信息,我们也是可以通过traceId来追踪整个请求的信息,但是不是特别直观,这个时候就需要将数据导入Zipkin中更直观的显示,或者导入到ES中,用Kibana查看,方便集中管理。
如果需要将跟踪的信息导入到ES中,可以将跟踪的信息以JSON格式的数据输出,然后用logstash收集输出到ES中。
输出JSON格式的日志首先需要导入一个依赖包
<!-- 输出JSON格式日志 --> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>4.8</version> <scope>runtime</scope> </dependency>
然后创建一个logback-spring.xml文件, 配置logstash需要收集的数据格式
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <springProperty scope="context" name="springAppName" source="spring.application.name"/> <!-- Example for logging into the build folder of your project --> <property name="LOG_FILE" value="logs\\${springAppName}.log"/> <!-- You can override this to have a custom pattern --> <property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/> <!-- Appender to log to console --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- Minimum logging level to be presented in the console logs--> <level>INFO</level> </filter> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> </appender> <!-- Appender to log to file --> <appender name="flatfile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_FILE}</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern> <maxHistory>7</maxHistory> </rollingPolicy> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> </appender> <!-- Appender to log to file in a JSON format --> <appender name="logstash" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_FILE}.json</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</fileNamePattern> <maxHistory>7</maxHistory> </rollingPolicy> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <timestamp> <timeZone>UTC</timeZone> </timestamp> <pattern> <pattern> { "severity": "%level", "service": "${springAppName:-}", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "parent": "%X{X-B3-ParentSpanId:-}", "exportable": "%X{X-Span-Export:-}", "pid": "${PID:-}", "thread": "%thread", "class": "%logger{40}", "rest": "%message" } </pattern> </pattern> </providers> </encoder> </appender> <root level="INFO"> <appender-ref ref="console"/> <!-- uncomment this to have also JSON logs --> <appender-ref ref="logstash"/> <appender-ref ref="flatfile"/> </root> </configuration>
具体代码可以参考我的github:
https://github.com/yinjihuan/spring-cloud
相关文章推荐
- SpringCloud: 服务链路追踪(Spring Cloud Sleuth)
- 服务链路追踪(Spring Cloud Sleuth)
- Spring Cloud Sleuth服务链路追踪(zipkin)(转)
- 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 企业级 SpringCloud 教程 (九) 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- SpringCloud之服务链路追踪(Spring Cloud Sleuth) |第九章 -yellowcong
- Spring Cloud Sleuth 链路追踪
- SpringCloud 教程 (二) 服务链路追踪(Spring Cloud Sleuth)
- Spring Cloud(六):链路追踪Sleuth与Zipkin结合
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十二):链路追踪(Sleuth、Zipkin)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- Spring Boot + Spring Cloud 构建微服务系统(八):分布式链路追踪(Sleuth、Zipkin)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)