今天项目经理跑来跟我说,想要在给每次请求配置一个流水号,使之可以在请求中的业务代码之间追踪。
我查了下Logback的资料,发现有一个功能MDC(mapped diagnostic context)可以实现,通过把上下文信息放入MDC中,来标记每个请求。
https://logback.qos.ch/manual/mdc.html
根据官方实例,有了基本思路:
通过AOP,给每个web接口进来的请求配置eventID
package cn.pelerin.writereport.configure;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.MDC;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
@Aspect
@Component
@Slf4j
@Order(4)
public class WebAspect {
//获取线程副本
ThreadLocal<Long> startTime=new ThreadLocal<>();
@Pointcut("execution(public * cn.pelerin.writereport.web.*.*(..))")
public void weblog(){}
@Before("weblog()")
public void doBefore(JoinPoint joinPoint){
//获取请求报文头部元数据
ServletRequestAttributes requestAttributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//获取请求对象
HttpServletRequest request=requestAttributes.getRequest();
Long millis = System.currentTimeMillis();
//NDC.push(millis.toString());
MDC.put("eventId",String.valueOf(millis));
//记录控制器执行前的时间毫秒数
startTime.set(millis);
log.info("前置通知执行:");
log.info("url:"+request.getRequestURL());
log.info("method:"+request.getMethod());
log.info("ip:"+request.getRemoteAddr());
log.info("class_method:"+joinPoint.getSignature().getDeclaringTypeName()+
"."+joinPoint.getSignature().getName());
log.info("args:"+ Arrays.toString(joinPoint.getArgs()));
log.info("流水号:"+millis);
}
@After("weblog()")
public void doFinaly(){
log.info("流水号:"+MDC.get("eventId") + "执行完毕");
MDC.remove("eventId");
}
}
然后在log appender中输出
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder默认配置为PartternLayoutEncoder -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} |-[%thread] %X{eventId} %-5level [%file:%line] - %msg%n</pattern>
</encoder>
<!--<layout>-->
<!--<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} |-[%thread] [%eventId] %-5level [%file:%line] - %msg%n</pattern>-->
<!--</layout>-->
</appender>
%X的作用就是用于获取MDC上下文的信息,后面不带参为输出所有,带参为输出key为参数的value。
最后的效果如下
版权声明:本文为dengpu90原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。