SpringAOP中基于注解实现通用日志打印方法详解

 更新时间:2023年12月31日 08:35:37   作者:_Romeo  
这篇文章主要介绍了SpringAOP中基于注解实现通用日志打印方法详解,在日常开发中,项目里日志是必不可少的,一般有业务日志,数据库日志,异常日志等,主要用于帮助程序猿后期排查一些生产中的bug,需要的朋友可以参考下

前言

我们在日常开发中,项目里日志是必不可少的,一般有业务日志,数据库日志,异常日志等,主要用于帮助程序猿后期排查一些生产中的bug。

有时候程序猿们在做代码调优的时候需要关注每个接口的响应速度,所以需要打印接口调用时间,如果在接口中每次写这段代码实在恶心,故基于Spring AOP面向切面编程使用注解解决该问题。

1.定义注解

value为对应的接口名称,默认为BaseController

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OwnLog {
    String value() default "BaseController";
}

2.面向切面处理

@Aspect
@Component
@Slf4j
public class LogAspect {
    @Before(value = "@annotation(ownLog)")
    public void before(JoinPoint point, OwnLog ownLog) {
        //point.getArgs()获取请求参数
        log.info("服务{}调用开始,请求参数:{}", ownLog.value(), JSONObject.toJSONString(point.getArgs()));
    }
    @Around(value = "@annotation(ownLog)")
    public Object around(ProceedingJoinPoint point, OwnLog ownLog) {
        Object result = null;
        String name = ownLog.value();
        long start = System.currentTimeMillis();
        try {
            result = point.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        } finally {
            long end = System.currentTimeMillis();
            log.info(String.format("服务%s,耗时:%dms", name, (end - start)));
        }
        return result;
    }
    //设置rvt为返回参数
    @AfterReturning(value = "@annotation(ownLog)", returning = "rvt")
    public void afterReturning(JoinPoint point, OwnLog ownLog, Object rvt) {
        log.info("服务{}调用结束,response:{}", ownLog.value(), JSONObject.toJSONString(rvt));
    }
}

3.使用注解

@OwnLog("sendMsg")
    @Idempotent
    @ApiOperation(value = "消息推送")
    @PostMapping(value = "/sendMsg")
    public BaseResp sendMessage(@ModelAttribute UserMsgHistoryDTO userMsgHistoryDTO) {
        userMsgHistoryService.sendMessage(findCurrentUser(), userMsgHistoryDTO);
        addUserLog(LOG_TYPE_USER, "用户消息推送", JSON.toJSONString(userMsgHistoryDTO));
        return new BaseResp<>(ResultStatus.SUCCESS);
    }

4.控制台打印

输出:

服务addEnrolmentUser调用开始,request:[{"age":0,"country":"string","health":"一般","idNum":"12345","name":"string","phoneNum":"string","status":"审核中"}]
服务addEnrolmentUser,耗时:13ms
服务addEnrolmentUser调用结束,response:{"code":10000,"message":"操作成功","success":true}

到此这篇关于SpringAOP中基于注解实现通用日志打印方法详解的文章就介绍到这了,更多相关SpringAOP注解实现日志打印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Servlet关于RequestDispatcher的原理详解

    Servlet关于RequestDispatcher的原理详解

    这篇文章主要介绍了Servlet关于RequestDispatcher的原理详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Java 泛型的上界和下界通配符示例详解

    Java 泛型的上界和下界通配符示例详解

    这篇文章主要为大家通过示例介绍了Java 泛型的上界和下界通配符,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • java生成在线验证码

    java生成在线验证码

    这篇文章主要介绍了java生成在线验证码,需要的朋友可以参考下
    2023-10-10
  • IDEA中的.iml文件和.idea文件夹

    IDEA中的.iml文件和.idea文件夹

    这篇文章主要介绍了IDEA中的.iml文件和.idea文件夹,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • IDEA反编译出整个jar包源码

    IDEA反编译出整个jar包源码

    InteliJ IDEA默认带反编译插件,那么如何把反编译的jar包整体导出java源码来?本文就来介绍一下,感兴趣的可以了解下
    2021-05-05
  • SpringBoot和前端Vue的跨域问题及解决方案

    SpringBoot和前端Vue的跨域问题及解决方案

    所谓跨域就是从 A 向 B 发请求,如若他们的地址协议、域名、端口都不相同,直接访问就会造成跨域问题,跨域是非常常见的现象,这篇文章主要介绍了解决SpringBoot和前端Vue的跨域问题,需要的朋友可以参考下
    2023-11-11
  • 使用IDEA打jar包的详细图文教程

    使用IDEA打jar包的详细图文教程

    JAR文件是一种压缩文件,与常见的ZIP压缩文件兼容,被称为JAR包,下面这篇文章主要给大家介绍了关于使用IDEA打jar包的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Java实例化的几种方法总结

    Java实例化的几种方法总结

    这篇文章主要介绍了Java实例化的几种方法总结的相关资料,需要的朋友可以参考下
    2017-04-04
  • 浅谈Spring Cloud Netflix-Ribbon灰度方案之Zuul网关灰度

    浅谈Spring Cloud Netflix-Ribbon灰度方案之Zuul网关灰度

    这篇文章主要介绍了浅谈Spring Cloud Netflix-Ribbon灰度方案之Zuul网关灰度,想了解Ribbon灰度的同学可以参考下
    2021-04-04
  • Spring Boot 整合单机websocket的步骤 附github源码

    Spring Boot 整合单机websocket的步骤 附github源码

    websocket 是一个通信协议,通过单个 TCP 连接提供全双工通信,这篇文章主要介绍了Spring Boot 整合单机websocket的步骤(附github源码),需要的朋友可以参考下
    2021-10-10

最新评论