摘要:简介在前段时间,看自己写的代码的时候,发现存在大量繁琐的日志记录,影响观感不说,后期的维护上也是十分麻烦,决定通过去解决这个问题,先做记录。
简介
在前段时间,看自己写的代码的时候,发现存在大量繁琐的日志记录,影响观感不说,后期的维护上也是十分麻烦,决定通过AOP去解决这个问题,先做记录。
与SpringBoot框架的整合所需要的依赖包org.springframework.boot spring-boot-starter-aop org.projectlombok lombok com.alibaba fastjson
通过查阅网上资料,了解到通过AOP记录日志,存在两种方式
基于注解
基于表达式
详细说明 一、基于注解的AOP日志在使用注解这种方式前,我们需要自定义一个属于自己的注解@VoiceLog
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface VoiceLog { }
@@Target说明该注解的使用范围,包含10个枚举值;
@Retention说明编译程序如何对待自定义的Annotation,包含三个枚举值:SOURCE,CLASS,RUNTIME;
完成之后,继续下面的步骤
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; @Aspect // 声明这是一个切面类 @Component // 注册为一个bean @Slf4j // lombok日志注解 public class AspectLog { /** * 对存在注解 `VoiceLog`的方法做日志记录 * * @param joinPoint joinPoint * @param voiceLog voiceLog * @throws Throwable Throwable * @see VoiceLog */ @Around(value = "@annotation(voiceLog)") // aspect增强注解,对存在该注解方法的前后做拦截 public Object logAroud(ProceedingJoinPoint joinPoint, VoiceLog voiceLog) throws Throwable { // 获取当前毫秒 long beginTime = System.currentTimeMillis(); // 执行方法体 Object result = joinPoint.proceed(); // 计算方法执行时间 long time = System.currentTimeMillis() - beginTime; //获取当前方法的类名 String className = joinPoint.getTarget().getClass().getSimpleName(); // 获取切点处的签名 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); // 获取当前的方法名 String methodName = methodSignature.getMethod().getName(); // 获取参数名称 String[] paramNames = methodSignature.getParameterNames(); // 获取参数值 Object[] params = joinPoint.getArgs(); // 把参数名称和参数值组装成json格式 JSONObject paramsJson = new JSONObject(paramNames.length); for (int i = 0; i < paramNames.length; i++) { paramsJson.put(paramNames[i], params[i]); } // 日志输出 log.info("TargetClass:{}; method:{}; requestParams:{}; response:{}; time:{}ms", className, methodName, paramsJson.toJSONString(), result, time); return Object; } }
配置文件添加配置
spring.aop.proxy-target-class=true
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75805.html
摘要:自定义注解新增日志注解类,注解作用于方法级别,运行时起作用。自定义注解,声明一种行为,使配置简化,代码层面更加简洁。 showImg(https://segmentfault.com/img/remote/1460000017791628); 写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主。 场景 我们通常有这样一个需求:打印后台接口请求的具...
摘要:连接对象执行命令对象执行关闭值得注意的是,对数据库连接池是有很好的支持的。给我们提供了事务的管理器类,事务管理器类又分为两种,因为的事务和的事务是不一样的。 前言 上一篇Spring博文主要讲解了如何使用Spring来实现AOP编程,本博文主要讲解Spring的DAO模块对JDBC的支持,以及Spring对事务的控制... 对于JDBC而言,我们肯定不会陌生,我们在初学的时候肯定写过非...
摘要:几乎每一个接口被调用后,都要记录一条跟这个参数挂钩的特定的日志到数据库。我最终采用了的方式,采取拦截的请求的方式,来记录日志。所有打上了这个注解的方法,将会记录日志。那么如何从众多可能的参数中,为当前的日志指定对应的参数呢。 前言 不久前,因为需求的原因,需要实现一个操作日志。几乎每一个接口被调用后,都要记录一条跟这个参数挂钩的特定的日志到数据库。举个例子,就比如禁言操作,日志中需要记...
摘要:入门篇学习总结时间年月日星期三说明本文部分内容均来自慕课网。主要的功能是日志记录,性能统计,安全控制,事务处理,异常处理等等。 《Spring入门篇》学习总结 时间:2017年1月18日星期三说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://git...
摘要:面向切面的本章主要内容面向切面编程的基本原理通过创建切面使用注解为切面注入依赖。什么是面向切面编程切面能够帮我们模块化横切关注点。在使用面向切面编程时,我们仍然在一个地方定义通知功能,而无需修改受影响的类。切面切面是通知和切点的结合。 面向切面的Spring 本章主要内容: 面向切面编程的基本原理 通过POJO创建切面 使用@Aspect注解 为AspectJ切面注入依赖。 说明 ...
阅读 2443·2021-11-19 09:59
阅读 1970·2019-08-30 15:55
阅读 929·2019-08-29 13:30
阅读 1330·2019-08-26 10:18
阅读 3081·2019-08-23 18:36
阅读 2382·2019-08-23 18:25
阅读 1155·2019-08-23 18:07
阅读 430·2019-08-23 17:15