maven添加依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
配置logback.xml
<appender name="slowSql" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${catalina.base}/logs/slowsql.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/logs/slowsql.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss} %5p %c:%L [KEY:%X{TRACE_KEY}] %m%n</pattern>
</encoder>
</appender>
<appender name="default" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--ch.qos.logback.core.filter.AbstractMatcherFilter-->
<filter class="com.showe.log.LogOpFilter" >
<opType>OTHER</opType>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${catalina.base}/logs/default.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${catalina.base}/logs/default.%d{yyyy-MM-dd}.log</fileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c:%L [KEY:%X{TRACE_KEY}] %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="com.alibaba.druid.filter.stat.StatFilter" level="info" additivity="false">
<appender-ref ref="slowSql"/>
</logger>
定义切面添加MDC.PUT(TRACE_KEY)
package com.showe.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.MDC;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.concurrent.ThreadLocalRandom;
/**
* 日志跟踪
*
* @Author nixiaowei
*/
@Order(1)
@Aspect
@Component
public class LogKeyAspect {
private static String TRANCE_KEY = "TRANCE_KEY";
private static String NEST_NUM = "NEST_NUM";
@Around("execution(* com.showe.controller..*(..))" +
"||execution(* com.showe.rpc..*(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
if(StringUtils.isEmpty(MDC.get(TRANCE_KEY))){
MDC.put(TRANCE_KEY,ThreadLocalRandom.current().nextLong()+"");
}
String nestNum = MDC.get(NEST_NUM);
if (StringUtils.isEmpty(nestNum)){
MDC.put(NEST_NUM,"1");
}else{
MDC.put(NEST_NUM,Long.parseLong(nestNum)+1+"");
}
try{
return joinPoint.proceed();
}finally {
long num = Long.parseLong(MDC.get(NEST_NUM));
if (num <= 1){
MDC.remove(NEST_NUM);
MDC.remove(TRANCE_KEY);
}else {
MDC.put(NEST_NUM,(num-1)+"");
}
}
}
}