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注解实现日志打印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot如何使用feign实现远程接口调用和错误熔断

    SpringBoot如何使用feign实现远程接口调用和错误熔断

    这篇文章主要介绍了SpringBoot如何使用feign实现远程接口调用和错误熔断,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 使用springboot每日推送早安问候语到用户微信的全过程

    使用springboot每日推送早安问候语到用户微信的全过程

    近期网上又出现一股给女朋友做微信公众号推送的潮流,所以这篇文章主要给大家介绍了关于如何使用springboot每日推送早安问候语到用户微信的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Fluent Mybatis零xml配置实现复杂嵌套查询

    Fluent Mybatis零xml配置实现复杂嵌套查询

    本文主要介绍了Fluent Mybatis零xml配置实现复杂嵌套查询,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java中Runnable和Thread的区别分析

    Java中Runnable和Thread的区别分析

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口,下面就拉分别介绍一下这两种方法的优缺点
    2013-03-03
  • Java包装类的缓存机制原理实例详解

    Java包装类的缓存机制原理实例详解

    这篇文章主要介绍了Java包装类的缓存机制原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • springboot配置Undertow服务器全过程

    springboot配置Undertow服务器全过程

    Spring Boot默认使用内嵌Tomcat容器简化部署,但部分开发者选择性能更优的Undertow替代,集成Undertow需排除Tomcat依赖,直接引入相关模块即可实现高并发、低内存的Web服务运行
    2025-07-07
  • Mybatis Plus条件构造器ConditionConstructor用法实例解析

    Mybatis Plus条件构造器ConditionConstructor用法实例解析

    这篇文章主要介绍了Mybatis Plus条件构造器ConditionConstructor用法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 详解Java对象结构与对象锁的升级

    详解Java对象结构与对象锁的升级

    这篇文章主要为大家详细介绍了Java对象结构与对象锁的升级,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Redis结合AOP与自定义注解实现分布式缓存流程详解

    Redis结合AOP与自定义注解实现分布式缓存流程详解

    项目中如果查询数据是直接到MySQL数据库中查询的话,会查磁盘走IO,效率会比较低,所以现在一般项目中都会使用缓存,目的就是提高查询数据的速度,将数据存入缓存中,也就是内存中,这样查询效率大大提高
    2022-11-11
  • 利用反射获取Java类中的静态变量名及变量值的简单实例

    利用反射获取Java类中的静态变量名及变量值的简单实例

    下面小编就为大家带来一篇利用反射获取Java类中的静态变量名及变量值的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论