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

Posted IT利刃出鞘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>

启动结果

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

可以发现,没有请求的时候,打印的是:[TID:N/A],有请求进来时,打印traceId

代码中获取traceId

其他网址

​skywalking获取traceId(tid)的方式_lijunwyf的专栏-CSDN博客​

​skywalking04 - skywalking自定义链路追踪@Trace_过了这个村没这个老王的博客-CSDN博客​

简介

我们可以在代码中获取到traceId,这样一来,我们可以做如下操作:

  • 将traceId传给前端。
  • 将traceId连同本次请求的信息记录到操作日志中

有了traceId,我们就可以直接到skywalking的界面中根据traceId来搜索了:

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

用法

步骤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等其他信息:

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

项目应用

        实际上,项目中不需要每个方法都加@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 Dubbo日志链路追踪TraceId选型

SpringBoot入门教程 日志TraceId

在Java项目中使用traceId跟踪请求全流程日志

在Java项目中使用traceId跟踪请求全流程日志

dubbo traceId透传实现日志链路追踪(基于Filter和RpcContext实现)

(WebFlux)002如何打印日志与链路ID