spring-aop-打印日志 package com.soyea.aop;import com.google.gson.Gson;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.slf4j.Logger;import org.slf4j.LoggerFact
package com.soyea.aop; import com.google.gson.Gson; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Map; /** * @ClassName: LogAspect * @Description: 日志记录AOP实现 */ @Component @Aspect public class LogAspect { private final Logger LOG = LoggerFactory.getLogger(this.getClass()); private String requestPath = null; // 请求地址 private Map inputParamMap = null; // 传入参数 private MapoutputParamMap = null; // 存放输出结果 private long startTimeMillis = 0; // 开始时间 private long endTimeMillis = 0; // 结束时间 @Pointcut("execution(* com.soyea.web..*.*(..))") public void log() { } /** * @param joinPoint * @Description: 方法调用前触发 * 记录开始时间 */ @Before("log()") public void doBeforeInServiceLayer(JoinPoint joinPoint) { startTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间 } /** * @param joinPoint * @Description: 方法调用后触发 * 记录结束时间 */ @After("log()") public void doAfterInServiceLayer(JoinPoint joinPoint) { endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间 this.printOptLog(); } /** * @return * @throws Throwable * @Description: 环绕触发 */ @Around("log()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { /** * 1.获取request信息 */ RequestAttributes ra = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes sra = (ServletRequestAttributes) ra; HttpServletRequest request = sra.getRequest(); // 获取输入参数 inputParamMap = request.getParameterMap(); // 获取请求地址 requestPath = request.getRequestURI(); // 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行 outputParamMap = new HashMap<>(); Object result = pjp.proceed();// result的值就是被拦截方法的返回值 outputParamMap.put("result", result); return result; } /** * 输出日志 */ private void printOptLog() { Gson gson = new Gson(); String optTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTimeMillis); LOG.info(" 请求地址:" + requestPath + " ; 开始时间:" + optTime + " 耗时:" + (endTimeMillis - startTimeMillis) + "ms ;"); LOG.info(" 请求参数:" + gson.toJson(inputParamMap) + ";" + "\n 返回结果:" + gson.toJson(outputParamMap)); } }