由于微服务架构中每个服务可能分散在不同的服务器上,因此需要一套分布式日志的解决方案。spring-cloud提供了一个

用来trace服务的组件sleuth。它可以通过日志获得服务的依赖关系。基于sleuth,可以通过现有的日志工具实现分布式日志的采集。

这里使用的是ELK,也就是elasticsearch、logstash、kibana。

一、sleuth

第一步:sleuth管理端

 sleuth一般单独放在一个工程中。需要添加如下依赖


 
  1. <dependency>
  2. <groupId>io.zipkin.java</groupId>
  3. <artifactId>zipkin-autoconfigure-ui</artifactId>
  4. <scope>runtime</scope>
  5. </dependency>
  6. <dependency>
  7. <groupId>io.zipkin.java</groupId>
  8. <artifactId>zipkin-server</artifactId>
  9. </dependency>
配置服务注册中心的地址



 
  1. eureka:
  2. client:
  3. serviceUrl:
  4. defaultZone: http://localhost:1111/eureka/
启动类加入服务发现的注解和zipkin的注解,如下


 
  1. package com.wlf.demo;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. import zipkin.server.EnableZipkinServer;
  6. @EnableDiscoveryClient
  7. @EnableZipkinServer
  8. @SpringBootApplication
  9. public class Application {
  10. public static void main(String[] args) {
  11. SpringApplication.run(Application.class, args);
  12. }
  13. }
这个时候启动并访问该微服务的地址,可以看到zipkin的管理页面了

第二步:被管理的微服务端

在我们的其他微服务端需要简单的配置,纳入到zipkin的管理之中

引入依赖


 
  1. <dependency>
  2. <groupId>org.springframework.cloud </groupId>
  3. <artifactId>spring-cloud-starter-sleuth </artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud </groupId>
  7. <artifactId>spring-cloud-sleuth-zipkin </artifactId>
  8. </dependency>
加入如下配置


 
  1. spring:
  2. sleuth:
  3. sampler:
  4. percentage: 1
  5. zipkin:
  6. base-url: http://localhost:9411
spring.sleuth.sampler.percentage:这个参数的意思是抓取100%的日志,只有通过抓取日志,才能获知依赖关系。但是

如果始终抓取日志的话对性能会有影响,因此可以自己配置。一般在开发环境,该值设置为1,生产环境视情况而定。

spring.zipkin.base-url:为第一步配置的zipkin管理端微服务的地址

现在分别启动服务注册中心,网关,需要的微服务,以及sleuth。

随便调用一个微服务

然后我们可以看到相关的跟踪日志

同样我们也可以看到微服务之间的依赖关系,这里是通过网关调用了myservice-consumer-feign微服务,然后通过

myservice-consumer-feign微服务调用了myservice-provider微服务

二、搭建ELK

1、elasticsearch的安装与配置,由于之前的文章已经介绍了elasticsearch的单点,集群的安装,head插件的安装。这里

不再总结。

elasticsearch单点搭建

 elasticsearch head插件安装

 elasticsearch集群搭建

2、kibana的安装,没什么好说的,解压,运行就可以了

3、logstash的安装,解压即可

在config下新建配置文件


 
  1. output {
  2. input {
  3. tcp {
  4. port => 4560
  5. codec => json_lines
  6. }
  7. }
  8. output {
  9. elasticsearch {
  10. hosts => ["192.168.160.66:9200","192.168.160.88:9200","192.168.160.166:9200"]
  11. index => "applog"
  12. }
  13. }
  其中port为端口号,codec表示通过json格式,elasticsearch.hosts表示elasticsearch的地址,这里是集群。index

为日志存储的elasticsearch索引。

  启动需要调用bin下的logstash命令,通过-f指定配置文件

 4、使用kibana

 启动elasticsearch、head、kibana、logstash

创建索引applog

 将applog配置到kibana中,在index pattern中输入我们的applog索引



最后点击create即可

  点击菜单中的discover即可查看日志

  三、logback配置

spring-cloud、logstash都是支持logback的,因此需要为微服务配置好相应的logback-spring.xml

这里值得注意的是,在spring-boot中,logback-spring.xml的加载在application.yml之前。而我们需要在

logback-spring.xml中使用spring.application.name。因此,我们需要把spring.application.name配置提到bootstrap.yml中。

加载顺序为bootstrap.yml,logback-spring.xml,application.yml

相比普通的logback-spring.xml,我们主要配置这几样东西spring.application.name,logstash的appender

这里提供一个logback-spring.xml的例子


 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration scan="true" scanPeriod="10 seconds">
  3. <springProperty scope="context" name="springAppName"
  4. source= "spring.application.name" />
  5. <property name="CONSOLE_LOG_PATTERN"
  6. value= "%date [%thread] %-5level %logger{36} - %msg%n" />
  7. <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  8. <withJansi>true </withJansi>
  9. <encoder>
  10. <pattern>${CONSOLE_LOG_PATTERN} </pattern>
  11. <charset>utf8 </charset>
  12. </encoder>
  13. </appender>
  14. <appender name="logstash"
  15. class= "net.logstash.logback.appender.LogstashTcpSocketAppender">
  16. <destination>192.168.160.66:4560 </destination>
  17. <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
  18. <providers>
  19. <timestamp>
  20. <timeZone>UTC </timeZone>
  21. </timestamp>
  22. <pattern>
  23. <pattern>
  24. {
  25. "severity":"%level",
  26. "service": "${springAppName:-}",
  27. "trace": "%X{X-B3-TraceId:-}",
  28. "span": "%X{X-B3-SpanId:-}",
  29. "exportable": "%X{X-Span-Export:-}",
  30. "pid": "${PID:-}",
  31. "thread": "%thread",
  32. "class": "%logger{40}",
  33. "rest": "%message"
  34. }
  35. </pattern>
  36. </pattern>
  37. </providers>
  38. </encoder>
  39. </appender>
  40. <appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
  41. <File>main.log </File>
  42. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  43. <FileNamePattern>main.%d{yyyy-MM-dd}.log </FileNamePattern>
  44. <maxHistory>30 </maxHistory>
  45. </rollingPolicy>
  46. <encoder>
  47. <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n </Pattern>
  48. </encoder>
  49. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  50. <level>DEBUG </level>
  51. </filter>
  52. </appender>
  53. <springProfile name="!production">
  54. <logger name="com.myfee" level="DEBUG" />
  55. <logger name="org.springframework.web" level="INFO"/>
  56. <root level="info">
  57. <appender-ref ref="stdout" />
  58. <appender-ref ref="dailyRollingFileAppender" />
  59. <appender-ref ref="logstash" />
  60. </root>
  61. </springProfile>
  62. <springProfile name="production">
  63. <logger name="com.myfee" level="DEBUG" />
  64. <logger name="org.springframework.web" level="INFO"/>
  65. <root level="info">
  66. <appender-ref ref="stdout" />
  67. <appender-ref ref="dailyRollingFileAppender" />
  68. <appender-ref ref="logstash" />
  69. </root>
  70. </springProfile>
  71. </configuration>
 我们把message信息配置到了rest字段中。

 三、查询日志

启动服务注册中心,网关,需要的微服务,以及sleuth

启动elasticsearch,head,kibana,logstash

 随便运行一个服务,比如

这里会输出一行日志,内容为myService-provider userController

             通过网关调用

    

              eclipse控制台输出日志

 

  在kibana中搜索日志


我们看到日志信息在rest字段中。另外,通过trace和span还可以跟踪到整个微服务的调用过程


 到此为止,整个日志采集就搭建完成了。系统上线后只需要在elasticsearch中就能搜索到各个服务器上,各个微服务的日志内容了

Logo

更多推荐