1.pom增加如下依赖
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency>
2.创建切面类
package com.xxl.api.admin.core.util;
import javax.servlet.http.HttpServletRequest;
import com.xxl.api.admin.TraceContext;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import ch.qos.logback.classic.Logger;
/**
* 切面类
*/
@Aspect
@Component
public class RequestAspect {
private Logger logger= (Logger) LoggerFactory.getLogger(RequestAspect.class);
/**
* Pointcut定义切点
* public修饰符的 返回值任意 com.cy.controller包下面的任意类的任意方法任意参数
*/
@Pointcut("execution(public * com.xxl.api.admin.controller.*.*(..))")
public void log(){
}
@Before("log()")
public void doBefore(JoinPoint joinPoint){
logger.info("========================================方法执行前...");
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = sra.getRequest();
logger.info("url: " + request.getRequestURI());
logger.info("ip: " + request.getRemoteHost());
logger.info("method: "+request.getMethod()); //post or get? or ?
logger.info("class.method: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
logger.info("args: "+joinPoint.getArgs());
TraceContext traceContext = new TraceContext();
logger.info("request traceContext.getTraceId() is {}", traceContext.getTraceId());
}
@After("log()")
public void doAfter(JoinPoint joinPoint){
logger.info("方法执行后...");
}
@AfterReturning(returning="result", pointcut="log()")
public void doAfterReturnint(Object result){
logger.info("方法返回值:" + result);
}
}
3.生成traceId
public class TraceContext {
public static ThreadLocal ctx = new InheritableThreadLocal(){ //此处用InheritableThreadLocal保证可以在子线程得到相同的traceId
@Override
protected TraceContext initialValue() {
return new TraceContext();
}
};
private String traceId;
public String getTraceId() {
if(traceId == null || "".equals(traceId)){
traceId = System.nanoTime() + "";
}
return traceId;
}
}