经过以前的入门示例,咱们已经为trace-1
和trace-2
引入了Spring Cloud Sleuth的基础模块spring-cloud-starter-sleuth
,实现了为各微服务的日志信息中添加跟踪信息的功能。可是,因为日志文件都离散的存储在各个服务实例的文件系统之上,仅仅经过查看日志文件来分析咱们的请求链路依然是一件至关麻烦的差事,因此咱们还须要一些工具来帮助咱们集中的收集、存储和搜索这些跟踪信息。引入基于日志的分析系统是一个不错的选择,好比:ELK平台,它能够轻松的帮助咱们来收集和存储这些跟踪日志,同时在须要的时候咱们也能够根据Trace ID来轻松地搜索出对应请求链路相关的明细日志。git
ELK平台主要有由ElasticSearch、Logstash和Kiabana三个开源免费工具组成:github
Spring Cloud Sleuth在与ELK平台整合使用时,实际上咱们只要实现与负责日志收集的Logstash完成数据对接便可,因此咱们须要为Logstash准备json格式的日志输出。因为Spring Boot应用默认使用了logback来记录日志,而Logstash自身也有对logback日志工具的支持工具,因此咱们能够直接经过在logback的配置中增长对logstash的appender,就能很是方便的将日志转换成以json的格式存储和输出了。spring
下面咱们来详细介绍一下在快速入门示例的基础上,如何实现面向Logstash的日志输出配置:json
pom.xml
依赖中引入logstash-logback-encoder
依赖,具体以下:<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>4.6</version> </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
,具体内容以下:<?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>
对logstash支持主要经过名为logstash
的appender实现,内容并不复杂,主要是对日志信息的格式化处理,上面为了方便调试查看咱们先将json日志输出到文件中。bootstrap
完成上面的改造以后,咱们再将快速入门的示例运行起来,并发起对trace-1
的接口访问。此时咱们能够在trace-1
和trace-2
的工程目录下发现有一个build
目录,下面分别建立了以各自应用名称命名的json文件,该文件就是在logback-spring.xml
中配置的名为logstash
的appender输出的日志文件,其中记录了相似下面格式的json日志:bash
{"@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>==="} {"@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服务端,好比:restful
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>127.0.0.1:9250</destination> ... </appender>
原文地址: http://blog.didispace.com/spr...
读者能够根据喜爱选择下面的两个仓库中查看trace-1
和trace-2
两个项目:并发
若是您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!app
本文内容部分节选自个人《Spring Cloud微服务实战》,但对依赖的Spring Boot和Spring Cloud版本作了升级。分布式