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 ;
    }
}
相关推荐
NiceCloud喜云1 小时前
Anthropic 一周三连发:Cowork 多端、Fable 5 按需付费、J-space 论文的技术解读
java·服务器·网络·人工智能·ai
SamDeepThinking1 小时前
组合还是继承?我在项目里主要看这两个判断
java·后端·面试
momo1 小时前
JAVA基础知识
java·开发语言
就叫_这个吧2 小时前
Activiti7工作流入门+案例应用
java·activiti7·工作流
Z_W_H_2 小时前
minikube start --driver=docker --memory=4000mb出现PROVIDER_DOCKER_NEWGRP
java·docker·minikube
折哥的程序人生 · 物流技术专研2 小时前
第3篇:手写促销策略引擎(满减、打折、立减)
java·设计模式·策略模式·开闭原则·编程实战·扩充系列·促销引擎
郑州光合科技余经理2 小时前
海外外卖平台源码改造实战——多语言核心代码实现
java·开发语言·前端·后端·mysql·架构·php
耀耀_很无聊2 小时前
12_Redis Lua 脚本踩坑:为什么 tonumber(ARGV[x]) 会得到 nil?
java·redis·lua
奶油话梅糖3 小时前
锐捷常用命令速查表
java·网络·windows
code_std3 小时前
java WebSocket 使用
java·开发语言·websocket