注:本教程均是参考"程序猿DD"大佬的SpringCloud教程:http://blog.didispace.com/spring-cloud-learning/实践结合自己的理解和总结编写
spring-cloud-logstash
微服务架构的演化,带来了服务的分布式部署,每台机器上都有相应的服务,这时对于服务的报错信息采集查看就尤为重要,目前国内互联网大厂有许多采用ELK来搭建日志采集分析系统,这里给出Spring-Cloud-Logstash的实现,感兴趣的同学可以参考本人的另一篇博:https://blog.csdn.net/qq_23536449/article/details/89876514
1.基于sleuth-trace(sleuth-trace2)添加pom.xml
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.11</version>
<scope>runtime</scope>
</dependency>
2.添加bootstrap.properties配置将配置spring.application.name=trace-1,配置到bootstrap.properties配置文件
这是由于logback-spring.xml的加载在application.properties之前,所以之前的配置logback-spring.xml无法获取到spring.application.name属性,因此这里将该属性移动到最先加载的bootstrap.properties配置文件中
3.创建logback-spring.xml配置文件,内容如下
<?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"/>
<!-- 日志在工程中的输出位置 -->
<property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}"/>
<!-- 控制台的日志输出样式 -->
<property name="CONSOLE_LOG_PATTERN"
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}"/>
<!-- 控制台Appender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- 为logstash输出的json格式的Appender -->
<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:-}",
"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"/>
<appender-ref ref="logstash"/>
</root>
</configuration>
4.启动eureka-server和sleuth-trace(sleuth-trace2),访问接口
GET http://localhost:9101/trace-1
可以看到在工作空间目录下多出了一个文件夹build,有以下文件
spring-cloud-zipkin
Zipkin是Twitter的一个开源项目,它基于Google Dapper实现。我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的API接口之外,它也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等
- Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin内部处理的Span格式,以支持后续的存储、分析、展示等功能。
- Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。
- RESTful API:API组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等。
- Web UI:UI组件,基于API组件实现的上层应用。通过UI组件用户可以方便而有直观地查询和分析跟踪信息。
搭建zipkin-server
1.创建springboot应用,在pom.xml中添加如下依赖
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
2.启动类
@EnableZipkinServer
@SpringBootApplication
public class ZipkinServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZipkinServerApplication.class, args);
}
}
3.application.properties
spring.application.name=zipkin-server
server.port=9411
4.启动启动类浏览器哦访问http://localhost:9411,效果图如下
客户端sleuth-trace(sleuth-trace2)集成zipkin
1.pom.xml依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
2.修改application.properties配置添加
spring.zipkin.base-url=http://localhost:9411
3.启动eureka-server、zipkin-server、sleuth-trace、sleuth-trace2
4.访问GET http://localhost:9101/trace-1,查看控制台,圈中的属性
是否为true,如果为False代表,并没有被zipkin收集到
原因:默认sleuth收集信息的比率是0.1 ,针对于这个问题有两种解决方法:
a.在application.properties中添加
spring.sleuth.sampler.percentage=1
b.在代码中声明
//100%的来采集日志,和在配置文件中配置spring.sleuth.sampler.percentage=1是一样的
@Bean
public AlwaysSampler defaultSampler(){
return new AlwaysSampler();
}
5.访问zipkin-server地址,查看调用信息
点击下方trace-1端点的跟踪信息,我们还可以得到Sleuth收集到的跟踪到详细信息,其中包括了我们关注的请求时间消耗等。