【链路追踪】xxl-job定时任务日志增加traceId

问题背景

项目中通过sleuth实现了统一的traceId注入,在生产环境进行日志追溯时比较方便。但是在使用xxl-job进行定时任务管理时,却发现xxl-job线程打印出来的日志没有traceId,查询日志时十分不方便,于是通过使用Spring aop的方式对使用了@XxlJob注解的方法注入traceId

代码:

java 复制代码
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.MDC;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.cloud.sleuth.Span;
import org.springframework.stereotype.Component;

import java.util.UUID;

@Slf4j
@Aspect
@Component
public class XxlJobAspect {

  /**
   * 打印统一日志,注入traceId
   * @author 只有影子
   * @param joinPoint
   */
  @Before("@annotation(com.xxl.job.core.handler.annotation.XxlJob)")
  public void beforeMethod(JoinPoint joinPoint) {
    // 注入traceId
    // MDC` put的key可以自己定义,在我的项目里因为用的是`X-B3-TraceId`,所以用的是Span.TRACE_ID_NAME,这里填实际用到的key
    MDC.put(Span.TRACE_ID_NAME,
        UUID.randomUUID().toString());

    // xxl定时任务统一日志
    String className = joinPoint.getTarget().getClass().getSimpleName();
    String methodName = joinPoint.getSignature().getName();
    String args = JSON.toJSONString(joinPoint.getArgs(), SerializerFeature.IgnoreNonFieldGetter);
    log.info("执行xxl-job自动任务:{}.{},参数:{}", className, methodName, args);
  }
}

说明

通过增加以上类,即可实现traceId注入,同时也增加了统一日志打印,不需要在每个定时任务入口都打印日志(如果不需要也可以去掉)。

相关文章:
【链路追踪】Java多线程之间日志traceId传递

相关推荐
Goldn.1 天前
Java核心技术栈全景解析:从Web开发到AI融合
java· spring boot· 微服务· ai· jvm· maven· hibernate
李慕婉学姐1 天前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
m0_740043731 天前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
编织幻境的妖1 天前
SQL查询连续登录用户方法详解
java·数据库·sql
未若君雅裁1 天前
JVM面试篇总结
java·jvm·面试
kk哥88991 天前
C++ 对象 核心介绍
java·jvm·c++
招风的黑耳1 天前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端
xunyan62341 天前
面向对象(下)-接口的理解
java·开发语言
程序员游老板1 天前
基于SpringBoot3+vue3的爱心陪诊平台
java·spring boot·毕业设计·软件工程·课程设计·信息与通信
期待のcode1 天前
Springboot核心构建插件
java·spring boot·后端