Springboot整合AOP实现日志的保存

1.定义注解

复制代码
/**
 * 系统日志元注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogFilter {
    String value() default "" ;
}

2.编写切面的实现

复制代码
@Aspect
@Component
public class LogAspect {

    private static final Logger LOGGER = LoggerFactory.getLogger(LogAspect.class) ;

    //切入点,已经被增强的连接点。
    @Pointcut("@annotation(com.boot.aop.config.LogFilter)")
    public void logPointCut (){

    }
    //通知增强代码
    @Around("logPointCut()")
    public Object around (ProceedingJoinPoint point) throws Throwable {
        Object result = null ;
        try{
            // 执行方法
            result = point.proceed();

            // 保存请求日志
            saveRequestLog(point);

        } catch (Exception e){
            // 保存异常日志
            saveExceptionLog(point,e.getMessage());
        }
        return result;
    }



    /**
     * 捕获异常:/ by zero
     * 请求路径:http://localhost:8011/saveExceptionLog
     * 请求方法:saveExceptionLog
     * 模块描述:保存异常日志
     * 请求参数:["cicada"]
     */
    private void saveExceptionLog (ProceedingJoinPoint point,String exeMsg){
        LOGGER.info("捕获异常:"+exeMsg);
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        LOGGER.info("请求路径:"+request.getRequestURL());
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        LOGGER.info("请求方法:"+method.getName());
        // 获取方法上LogFilter注解
        LogFilter logFilter = method.getAnnotation(LogFilter.class);
        String value = logFilter.value() ;
        LOGGER.info("模块描述:"+value);
        Object[] args = point.getArgs();
        LOGGER.info("请求参数:"+ JSONObject.toJSONString(args));
    }

    /**
     * 请求路径:http://localhost:8011/saveRequestLog
     * 请求方法:saveRequestLog
     * 模块描述:保存请求日志
     * 请求参数:["cicada"]
     */
    private void saveRequestLog (ProceedingJoinPoint point){
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        LOGGER.info("请求路径:"+request.getRequestURL());


        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        LOGGER.info("请求方法:"+method.getName());



        // 获取方法上LogFilter注解
        LogFilter logFilter = method.getAnnotation(LogFilter.class);
        String value = logFilter.value() ;
        LOGGER.info("模块描述:"+value);



        Object[] args = point.getArgs();
        LOGGER.info("请求参数:"+ JSONObject.toJSONString(args));
    }
}

3.测试

复制代码
@LogFilter("保存请求日志")
    @RequestMapping("/saveRequestLog")
    public String saveRequestLog (@RequestParam("name") String name){
        return "success:"+name ;
    }

    @LogFilter("保存异常日志")
    @RequestMapping("/saveExceptionLog")
    public String saveExceptionLog (@RequestParam("name") String name){
        int error = 100 / 0 ;
        System.out.println(error);
        return "success:"+name ;
    }
}
相关推荐
摇滚侠1 小时前
Spring Boot 3零基础教程,Spring Intializer,笔记05
spring boot·笔记·spring
Jabes.yang2 小时前
Java求职面试实战:从Spring Boot到微服务架构的技术探讨
java·数据库·spring boot·微服务·面试·消息队列·互联网大厂
聪明的笨猪猪2 小时前
Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
兮动人2 小时前
Spring Bean耗时分析工具
java·后端·spring·bean耗时分析工具
MESSIR222 小时前
Spring IOC(控制反转)中常用注解
java·spring
摇滚侠2 小时前
Spring Boot 3零基础教程,Demo小结,笔记04
java·spring boot·笔记
笨手笨脚の3 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式·行为型设计模式
spencer_tseng4 小时前
Eclipse 4.7 ADT (Android Development Tools For Eclipse)
android·java·eclipse
聪明的笨猪猪4 小时前
Java Spring “AOP” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
Lucky GGBond5 小时前
Vue + Spring Boot 实现 Excel 导出实例
vue.js·spring boot·excel