SkyWalking--打印traceId到日志/获取traceId

天下之事常成于困约,而败于奢靡。这篇文章主要讲述SkyWalking--打印traceId到日志/获取traceId相关的知识,希望能为你提供帮助。


?
简介本处,我的skywalking服务端版本为8.7.0.
打印traceId到日志简介
        Skywalking可以直接在界面上看执行的链路,也可以将traceId输出到日志,这样的话,在日志里就可以分辨哪些是同一个请求。
        本处,我使用logback,只配置将traceId日志输出到控制台,实际也可以写到日志文件的,方法差不多。logback配置方法见:
??Java日志--logback--配置/介绍/基础_IT利刃出鞘的博客-CSDN博客??
??Java日志--logback--SpringBoot--整合/使用/教程/实例_IT利刃出鞘的博客-CSDN博客??
实例pom.xml

< !--skywalking traceId 记录到logback日志-->
< dependency>
< groupId> org.apache.skywalking< /groupId>
< artifactId> apm-toolkit-logback-1.x< /artifactId>
< version> 8.7.0< /version>
< /dependency>

logback-spring.xml(放到resources目录下)
添加此配置
< appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
< encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
< layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
< pattern> [%tid] $CONSOLE_LOG_PATTERN:-%clr(%d$LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS)faint %clr($LOG_LEVEL_PATTERN:-%5p) %clr($PID:- )magenta %clr(---) faint %clr([%15.15t])faint %clr(%-40.40logger39)cyan %clr(:)faint %m%n$LOG_EXCEPTION_CONVERSION_WORD:-%wEx< /pattern>
< /layout>
< /encoder>
< /appender>

  • 使用[%tid] 来占trace-id的位置,默认为TID:N/A,当有请求调用时,会显示trace-id。
所有配置
< ?xml version="1.0" encoding="UTF-8"?>
< configuration>

< !--< include resource="org/springframework/boot/logging/logback/base.xml"/> -->

< include resource="org/springframework/boot/logging/logback/defaults.xml"/>
< !--< include resource="org/springframework/boot/logging/logback/console-appender.xml"/> -->
< !--< include resource="org/springframework/boot/logging/logback/file-appender.xml" /> -->

< springProperty scope="context" name="appName" source="spring.application.name"/>

< appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
< encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
< layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
< pattern> [%tid] $CONSOLE_LOG_PATTERN:-%clr(%d$LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS)faint %clr($LOG_LEVEL_PATTERN:-%5p) %clr($PID:- )magenta %clr(---) faint %clr([%15.15t])faint %clr(%-40.40logger39)cyan %clr(:)faint %m%n$LOG_EXCEPTION_CONVERSION_WORD:-%wEx< /pattern>
< /layout>
< /encoder>
< /appender>

< root level="INFO">
< appender-ref ref="STDOUT"/>
< /root>
< /configuration>

启动结果

可以发现,没有请求的时候,打印的是:[TID:N/A],有请求进来时,打印traceId
代码中获取traceId其他网址
??skywalking获取traceId(tid)的方式_lijunwyf的专栏-CSDN博客??
??skywalking04 - skywalking自定义链路追踪@Trace_过了这个村没这个老王的博客-CSDN博客??
简介我们可以在代码中获取到traceId,这样一来,我们可以做如下操作:
  • 将traceId传给前端。
  • 将traceId连同本次请求的信息记录到操作日志中
【SkyWalking--打印traceId到日志/获取traceId】有了traceId,我们就可以直接到skywalking的界面中根据traceId来搜索了:

用法步骤1:在想获取traceId的地方加@Trace注解
例如:
@PostMapping("create")
@Trace
public Result create(Order order)
orderService.create(order);
return new Result().message("创建订单成功");

Trace所在包:import org.apache.skywalking.apm.toolkit.trace.Trace;
步骤2:获得注解
例:
@PostMapping("create")
@Trace
public Result create(Order order)
orderService.create(order);
String traceId = TraceContext.traceId();
return new Result().message("创建订单成功");

TraceContext所在包:import org.apache.skywalking.apm.toolkit.trace.TraceContext;  
TraceContext可以获得spanId等其他信息:

项目应用        实际上,项目中不需要每个方法都加@Trace这个注解来获得traceId,只需要在全局响应的地方来获取即可。
        下边展示项目中的实际用法(我是实测过的,可以获取到traceId)。
package com.example.common.advice;

import com.example.common.entity.Result;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@Slf4j
@ControllerAdvice
public class GlobalResponseBodyAdvice implements ResponseBodyAdvice< Object>
@Override
public boolean supports(MethodParameter returnType,
Class< ? extends HttpMessageConverter< ?> > converterType)
// 若接口返回的类型本身就是ResultWrapper,则无需操作,返回false
// return !returnType.getParameterType().equals(ResultWrapper.class);
return true;


@Override
@ResponseBody
@Trace
public Object beforeBodyWrite(Object body, MethodParameter returnType,
MediaType selectedContentType,
Class< ? extends HttpMessageConverter< ?> > selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response)

String

    推荐阅读