AOP记录日志

<!--Aop-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
/**
 * @Auther: dingjn
 * @Desc: Service层日志切面
 */
@Slf4j
@Aspect
@Component
public class ServiceLogAspect {
    /**
     * 切点
     * 切面表达式:
     * 第一个 *:代表方法返回类型,*代表所以类型
     * 第二个包名:代表aop监控的类所在的包
     * 第三个 *:代表包下的所有类
     * 第四个 *(..):*代表类下的所有方法,(..)代表方法中的任何参数
     */
    @Pointcut("execution(* com.dingjn.service.impl.*.*(..))")
    public void point() {
    }

    /**
     * @param joinPoint 封装了代理对象的信息
     * @return
     */
    @Around(value = "point()")
    public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
        Object result = null;
        log.info("===== 开始执行 =====");
        log.info("执行方法 : {}.{}", joinPoint.getSignature().getDeclaringType(),
                joinPoint.getSignature().getName());
        Object[] args = joinPoint.getArgs();
        StringBuilder sb = new StringBuilder();
        sb.append("|");
        if (args != null) {
            for (Object arg : args) {
                if (arg instanceof HttpServletRequest) {
                    continue;
                } else if (arg instanceof HttpServletResponse) {
                    continue;
                }
                sb.append(arg);
                sb.append("|");
            }
        }
        log.info("方法参数 : {}", sb.toString());

        long start = System.currentTimeMillis();

        result = joinPoint.proceed();

        long end = System.currentTimeMillis();

        long target = end - start;

        if (target > 3000) {
            log.error("===== 执行结束,耗时 {} 毫秒 =====", target);
        } else if (target > 2000) {
            log.warn("===== 执行结束,耗时 {} 毫秒 =====", target);
        } else {
            log.info("===== 执行结束,耗时 {} 毫秒 =====", target);
        }
        return result;
    }
}

posted @ 2020-05-13 16:10  范特西-  阅读(83)  评论(0)    收藏  举报