我司项目是分布式系统,但没有分布式日志系统。每次排错查看日志极其痛苦,打开N个终端,shell敲的起飞,效率极低,果断引入ELK。
项目用的日志组件是logback(slf4j的实现),引入logstash-logback-encoder实现输出JSON格式的日志
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.10</version>
</dependency>
把logback的配置里的encoder替换为
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeCallerData>true</includeCallerData>
</encoder>
成功的输出JSON格式的日志文件
运维同学搭好ELK环境,把日志导入到elasticsearch中,可以愉快的使用Kibana来查看日志了。
这时问题又来了,如何查看一次请求的日志,这样可以很好分析一次请求上下文。一直在跟踪Spring的项目,Spring Cloud 中分布式跟踪Spring Cloud Sleuth项目,仔细研究了下发现可以把zipkin系统引进来,引进zipkin.brave
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-spring-beans</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-context-slf4j</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-instrumentation-spring-webmvc</artifactId>
<version>4.4.0</version>
</dependency>
我司是基于Dubbo构架分布式系统,brave没有对应的实现,需要基于Dubbo的Filter来实现传递TraceId
通过过滤traceId,就很方便的实现了查看一个请求的上下文的日志,启用zipkin服务的话还可以很清晰的一个请求每次跨服务调用的耗时,还可查看调用MySQL的耗时