最近接触一个新的传统项目,在联调过程中,查看日志特别不方便,既无trackId,也无接口耗时,如果用户量上来后,完全无法过滤出当前请求的日志,所以写了该博客。话不多说,直接上代码
1、实体类user
package com.yk.domain;
import lombok.Data;
@Data
public class User {
private Long id;
private String username;
private String sex;
}
2、接口统计返回实体封装类
/**
* @author : yk
* @date : 2024/03/11
* @description : 封装的基础 result
*/
@Data
public class CommonResult<T> implements Serializable {
private Integer code;
private String message;
private String traceId;
private Long costTime;
private T data;
}
2、controller层
@Slf4j
@RestController
@RequestMapping("user")
public class UserController {
@GetMapping("/query")
public CommonResult<User> query(@RequestParam(name = "id", required = false, defaultValue = "1") Long id) {
User user = new User();
user.setId(id);
user.setUsername("yk");
user.setSex("男");
CommonResult<User> apiResult = new CommonResult<>();
apiResult.setData(user);
return apiResult;
}
@PostMapping("/queryUser")
public CommonResult<User> queryAlert(@RequestBody User user) {
CommonResult<User> apiResult = new CommonResult<>();
apiResult.setData(user);
return apiResult;
}
}
3、aspect包
public class TraceIdUtil {
public static final String REGEX = "-";
public static final String TRACE_ID = "trace_id";
/**
* 从header和参数中获取traceId
* 从网关传入数据
*
* @param request HttpServletRequest
* @return traceId
*/
public static String getTraceIdByRequest(HttpServletRequest request) {
String traceId = request.getParameter(TRACE_ID);
if (StringUtils.isBlank(traceId)) {
traceId = request.getHeader(TRACE_ID);
}
return traceId;
}
/**
* 传递traceId至MDC
*
* @param traceId 链路id
*/
public static void setTraceId(String traceId) {
if (StringUtils.isNotBlank(traceId)) {
MDC.put(TRACE_ID, traceId);
}
}
/**
* 构建traceId
*
* @return
*/
public static String getTraceId() {
if (StringUtils.isBlank(MDC.get(TRACE_ID))) {
String traceId = UUID.randomUUID().toString().replaceAll(REGEX, StringUtils.EMPTY);
setTraceId(traceId);
return