- 推荐序一
- 推荐序二
- 推荐序三
- 推荐语
- 前言
- 第1章 基础知识
- 第2章 微服务构建:Spring Boot
- 第3章 服务治理:Spring Cloud Eureka
- 第4章 客户端负载均衡:Spring Cloud Ribbon
- 第5章 服务容错保护:Spring Cloud Hystrix
- 第6章 声明式服务调用:Spring Cloud Feign
- 第7章 API网关服务:Spring Cloud Zuul
- 第8章 分布式配置中心:Spring Cloud Config
- 第9章 消息总线:Spring Cloud Bus
- 第10章 消息驱动的微服务:Spring Cloud Stream
- 附录 A Starter POMs
- 后记
与 Logstash 整合
通过之前的准备与整合,我们已经为trace-1和trace-2引入了Spring Cloud Sleuth的基础模块spring-cloud-starter-sleuth,实现了在各个微服务的日志信息中添加跟踪信息的功能。但是,由于日志文件都离散地存储在各个服务实例的文件系统之上,仅仅通过查看日志文件来分析我们的请求链路依然是一件相当麻烦的事,所以我们还需要一些工具来帮助集中收集、存储和搜索这些跟踪信息。引入基于日志的分析系统是一个不错的选择,比如ELK平台,它可以轻松地帮助我们收集和存储这些跟踪日志,同时在需要的时候我们也可以根据Trace ID来轻松地搜索出对应请求链路相关的明细日志。
ELK平台主要由ElasticSearch、Logstash和Kibana三个开源工具组成。
- ElasticSearch 是一个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,RESTful 风格接口,多数据源,自动搜索负载等。
- Logstash 是一个完全开源的工具,它可以对日志进行收集、过滤,并将其存储供以后使用。
- 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依赖,具体如下:
<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 之前,所以之前的配置 logbackspring.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-Expo rt:-}]){yellow} %clr(${PID:-}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %c lr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wE x}"/>
<!--控制台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>
对Logstash的支持主要通过名为logstash的Appender实现,内容并不复杂,主要是对日志信息的格式化处理,上面为了方便调试和查看,我们先将JSON格式的日志输出到文件中。
完成上面的改造之后,我们再将快速入门的示例运行起来,并发起对 trace-1的接口访问。此时可以在trace-1和trace-2的工程目录下发现有一个build目录,下面分别创建了以各自应用名称命名的 JSON 文件,该文件就是在 logback-spring.xml中配置的名为logstash的Appender输出的日志文件,其中记录了类似下面格式的JSON日志:
{"@timestamp":"2016-12-04T06:57:58.970+00:00","severity":"INFO","service":"trac e-1","trace":"589ee5f7b860132f","span":"a9e891273affb7fc","exportable":"false","pid":"19756","thread":"http-nio-9101-exec-1","class":"c.d.TraceApplication$$EnhancerBy SpringCGLIB$$a9604da6","rest":"===<call trace-1>==="}
{"@timestamp":"2016-12-04T06:57:59.061+00:00","severity":"INFO","service":"trac e-1","trace":"589ee5f7b860132f","span":"2df8511ddf3d79a2","exportable":"false","pid":"19756","thread":"http-nio-9101-exec-1","class":"o.s.c.a.AnnotationConfigApplicat ionContext","rest":"Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@64951f38: startup date[Sun Dec 04 14:57:59 CST 2016]; parent:org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationCon text@4b8c8f15"}
除了可以通过上面的方式生成 JSON 文件外,还可以使用 LogstashTcpSocketAppender将日志内容直接通过Tcp Socket输出到Logstash服务端,比如:
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocket Appender">
<destination>127.0.0.1:9250</destination>
...
</appender>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论