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 ;
    }
}
相关推荐
fhgfyrsg34 分钟前
【无标题】
java
佩奇的技术笔记1 小时前
Java学习手册:关系型数据库基础
java·数据库·学习
forestsea1 小时前
Maven 实现多模块项目依赖管理
java·maven
种时光的人1 小时前
【Java多线程】计时器Timer/ScheduledExecutorService的使用
java·开发语言
会游泳的石头1 小时前
在Java项目中实现本地语音识别与热点检测,并集成阿里云智能语音服务
java·阿里云·语音识别
计算机毕设指导62 小时前
基于Springboot旅游网站系统【附源码】
java·开发语言·spring boot·后端·mysql·spring·旅游
fanTuanye2 小时前
Java 中的 设计模式详解
java·设计模式·工厂模式
caihuayuan52 小时前
关于vue+iview中tabs嵌套及实际应用
java·大数据·spring boot·后端·课程设计
武昌库里写JAVA2 小时前
iView Admin的side menu改为top menu
java·vue.js·spring boot·课程设计·宠物管理
开开心心就好2 小时前
快速搜索与管理PDF文档的专业工具
java·运维·windows·pdf·自动化·excel·音视频