?1 import org.aspectj.lang.JoinPoint; ?2 import org.aspectj.lang.Signature; ?3 import org.aspectj.lang.annotation.AfterReturning; ?4 import org.aspectj.lang.annotation.Aspect; ?5 import org.aspectj.lang.annotation.Before; ?6 import org.aspectj.lang.annotation.Pointcut; ?7 import org.aspectj.lang.reflect.MethodSignature; ?8 import org.slf4j.Logger; ?9 import org.slf4j.LoggerFactory; 10 import org.springframework.core.annotation.Order; 11 import org.springframework.stereotype.Component; 12 import org.springframework.web.context.request.RequestContextHolder; 13 import org.springframework.web.context.request.ServletRequestAttributes; 14 ?15 import javax.servlet.http.HttpServletRequest; 16 import java.io.UnsupportedEncodingException; 17 import java.net.URLDecoder; 18 ?19 /** 20 ?* 实现Web层的日志切面 21 ?* @author lpf 22 ?*/ 23 @Component 24 @Aspect 25 @Order(1) 26 public class WebLogAspect { 27 ????private Logger log = LoggerFactory.getLogger(getClass()); 28 ????private ThreadLocal<Long> startTime = new ThreadLocal<>(); 29 ?30 ????/** 31 ?????* 定义一个切入点. 32 ?????* 解释下: 33 ?????* <p> 34 ?????* ~ 第一个 * 代表任意修饰符及任意返回值. 35 ?????* ~ 第二个 * 任意包名 36 ?????* ~ 第三个 * 定义在web包或者子包 37 ?????* ~ 第四个 * 任意方法 38 ?????* ~ .. 匹配任意数量的参数. 39 ?????*/ 40 ????// @Pointcut("execution(public * com.kfit.*.web..*.*(..))") 41 ????// use 42 ????// @Pointcut("execution(public * org.zhilan..*Controller.*(..))") 43 ?44 ????// @Pointcut("(execution(public * org.zhilan.timer.*Service.*(..)))") ??45 ????@Pointcut("(execution(public * com.haoyun..*Controller.*(..))) " 46 ????????????// + "|| execution(public * com.haoyun.timer.*Service.*(..)) " 47 ????????????+ "&& !execution(* com.haoyun.login.LoginController.getSystemState())" 48 ????) 49 ????public void webLog() { 50 ????} 51 ?52 ????@Before("webLog()") 53 ????public void doBefore(JoinPoint joinPoint) throws UnsupportedEncodingException { 54 ????????startTime.set(System.currentTimeMillis()); 55 ?56 ????????// 接收到请求,记录请求内容 57 ????????log.info("========================= before start ========================="); 58 ????????Signature signature = joinPoint.getSignature(); 59 ????????MethodSignature methodSignature = (MethodSignature) signature; 60 ?61 ????????log.info("CLASS_METHOD : " + methodSignature.getDeclaringTypeName() + "." + methodSignature.getName()); 62 ?63 ????????// 记录下请求内容 64 ????????ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); 65 ????????if(attributes != null){ 66 ????????????HttpServletRequest request = attributes.getRequest(); 67 ????????????log.info("IP : " + request.getRemoteAddr()); 68 ????????} 69 ?70 ????????log.info("请求参数: ???名称 ????值"); 71 ????????String[] argsNameArray ?= methodSignature.getParameterNames(); 72 ????????Object[] argsValueArray = joinPoint.getArgs(); 73 ????????for (int i = 0; i < argsNameArray.length; i++) { 74 ????????????log.info("args_name: " + argsNameArray[i]); 75 ?76 ????????????String argValue = argsValueArray[i] != null ? argsValueArray[i].toString() : ""; 77 ????????????if (argsNameArray[i].contains("encode")) { 78 ????????????????String str = URLDecoder.decode(argValue, "utf-8"); 79 ????????????????log.info("args_value: " + (str.length() > 200 ? str.substring(0, 200) + "..." : str)); 80 ????????????} else { 81 ????????????????log.info("args_value: " + (argValue.length() > 200 ? argValue.substring(0, 200) + "..." : argValue)); 82 ????????????} 83 ????????} 84 ?85 ????????log.info("========================= before end ========================="); 86 ????} 87 ?88 ????@AfterReturning(returning="rvt", pointcut="webLog()") 89 ????public void doAfterReturning(JoinPoint joinPoint, Object rvt) { 90 ????????// 处理完请求, 返回内容 91 ????????log.info("========================= after returning start ========================="); 92 ????????Signature signature = joinPoint.getSignature(); 93 ????????log.info("CLASS_METHOD : " + signature.getDeclaringTypeName() + "." + signature.getName()); 94 ?95 ????????if(rvt != null){ 96 ????????????String str = rvt.toString(); 97 ????????????if (str.length() > 200) { 98 ????????????????str = str.substring(0, 200) + "..."; 99 ????????????}100 101 ????????????log.info("return 返回值:");102 ????????????log.info(str);103 ????????}104 105 ????????log.info("耗时(毫秒) : " + (System.currentTimeMillis() - startTime.get()));106 107 ????????log.info("========================= after returning end =========================");108 ????}109 }
实现Web层的日志切面(方便清晰查看日志)
原文地址:https://www.cnblogs.com/milicool/p/8445458.html