package com.zy.common.config; import com.core.common.R; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Pointcut; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.rmi.NoSuchObjectException; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; /** * Created by Administrator on 2019-07-09. */ //@Component //@Aspect @Slf4j //@Order(2) public class LogAspect { private final List logApiList = Stream.of("digitalTwin", "api/mes", "api/robot") .collect(Collectors.toList()); public LogAspect() { } /** * 切入点 */ @Pointcut("execution(* com.zy.asrs.controller.*.*(..))") // && !execution(* com.lg.iac.controller.PictureController.*(..)) public void controllerPc() { } /** * 环绕通知 * @param pjp ProceedingJoinPoint * @return 方法结果 */ @Around("controllerPc()") public Object around(ProceedingJoinPoint pjp) { try { ServletRequestAttributes attributes = Optional.ofNullable((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) .orElseThrow(() -> new NoSuchObjectException("前置通知中获取的 ServletRequestAttributes 对象为空")); HttpServletRequest request = attributes.getRequest(); if(urlContain(request.getRequestURL().toString())){ // 前置通知 log.info("------【前置通知】------"); // 记录请求内容 log.info("浏览器输入的网址:{}", request.getRequestURL().toString()); log.info("HTTP_METHOD:{}", request.getMethod()); log.info("IP:{}", request.getRemoteAddr()); log.info("执行的业务方法名:{}", pjp.getSignature().getDeclaringTypeName() + "." + pjp.getSignature().getName()); log.info("业务方法获得的参数:{}", Arrays.toString(pjp.getArgs())); Object result = pjp.proceed(); // 后置通知 log.info("------【后置通知】------"); log.info("{}方法的返回值:{}", pjp.getSignature().getName(), result); return result; } else { return pjp.proceed(); } } catch (Throwable e) { // 异常通知 log.error("------【异常通知】------"); log.error("{}方法异常,参数:{},异常:", pjp.getSignature().getName(), Arrays.toString(pjp.getArgs()), e); return R.error("服务器处理数据异常"); } finally { try{ ServletRequestAttributes attributes = Optional.ofNullable((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) .orElseThrow(() -> new NoSuchObjectException("前置通知中获取的 ServletRequestAttributes 对象为空")); HttpServletRequest request = attributes.getRequest(); if(urlContain(request.getRequestURL().toString())){ // 最终通知 log.info("------【最终通知】------"); log.info("{}方法执行结束", pjp.getSignature().getName()); } } catch (Exception ignored){ } } } /** * 是否不包含过滤日志接口 * * @param url * @return */ private boolean urlContain(String url){ boolean have = false; for(String str : logApiList){ if(url.contains(str)){ have = true; return have; } } return have; } }