package com.api.aspect; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; 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.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.alibaba.fastjson.JSON; import com.antong.common.util.DateUtil; /** * Copyright: Copyright (c) 2018 zq_tuo * * @ClassName: WebLogAspect.java * @Description: AOP統一處理Web請求日誌 使用@Aspect註解將一個java類定義爲切面類 使用@Pointcut定義一個切入點,能夠是一個規則表達式,好比下例中某個package下的全部函數,也能夠是一個註解等。 根據須要在切入點不一樣位置的切入內容 使用@Before在切入點開始處切入內容 使用@After在切入點結尾處切入內容 使用@AfterReturning在切入點return內容以後切入內容(能夠用來對處理返回值作一些加工處理) 使用@Around在切入點先後切入內容,並本身控制什麼時候執行切入點自身的內容 使用@AfterThrowing用來處理當切入內容部分拋出異常以後的處理邏輯 * * @version: v1.0.0 * @author: tuozq * @date: 2018年6月26日 下午4:03:43 * Modification History: * Date Author Version Description *---------------------------------------------------------* * 2018年6月26日 tuozq v1.0.0 修改緣由 */ @Aspect @Component public class WebLogAspect { private Logger logger = LoggerFactory.getLogger(WebLogAspect.class); @Value("${api.devMode}") private boolean devMode; ThreadLocal<Long> startTime = new ThreadLocal<>(); @Pointcut("execution(public * com.antong.api.web..*.*(..))") public void webLog(){} @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { if(devMode) { // 接收到請求,記錄請求內容 startTime.set(System.currentTimeMillis()); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); Signature signature = joinPoint.getSignature(); //MethodSignature methodSignature = (MethodSignature) signature; StringBuilder sb = new StringBuilder("\n\nAction report -------- ").append(DateUtil.format(new Date())).append(" -----------------------------------\n"); sb.append("Url : ").append(request.getMethod()).append(" ").append(request.getRequestURI()).append("\n"); sb.append("Controller : ").append(signature.getDeclaringTypeName()).append(".(").append(signature.getDeclaringType().getSimpleName()).append(".java:1)"); sb.append("\nMethod : ").append(signature.getName()).append("\n"); Enumeration<String> enumeration = request.getParameterNames(); Map<String,String> parameterMap = new HashMap<>(); while (enumeration.hasMoreElements()){ String parameter = enumeration.nextElement(); parameterMap.put(parameter,request.getParameter(parameter)); } String str = JSON.toJSONString(parameterMap); if(str.length() > 0) { sb.append("UrlPara : ").append(str).append("\n"); } sb.append("--------------------------------------------------------------------------------\n"); logger.debug(sb.toString()); } } @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { if(devMode) { // 處理完請求,返回內容 logger.debug("RESPONSE : " + ret); logger.debug("SPEND TIME : " + (System.currentTimeMillis() - startTime.get())); } } }