AOP日志统计实现

AOP日志统计简介

日志统计就是在用户操作时记录下用户的名称,访问的哪个控制层,哪个方法,参数是什么,请求是否成功等等,具体的效果如图所示

在这里插入图片描述
AOP适用于具有横切逻辑的场合,比如:日志统计,性能统计,事务管理等等,当然在这里我们使用AOP进行日志统计。不用AOP也可以实现,但要在每个需要进行日志统计的方法里加上,日志代码块,这样就大大造成了代码拥挤,增加代码的重复性,影响开发人员美好的心情。将日志统计的代码块交给AOP进行管理,减轻开发人员的工作量。可以让开发人员更好的将精力放在业务逻辑上。

AOP日志流程

1.新建一个普通的java类LogAspact,在里边写一个普通方法around();那么这么普通的类怎么让他成为一个具有横切逻辑的切面类呢?

<!-- 切点 -->
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

在spring-mvc.xml里配置上面这行代码,
<aop:aspectj-autoproxy proxy-target-class=“true”/> 基于类,需要使用cglib库
<aop:aspectj-autoproxy proxy-target-class=“false”/> 基于接口,需要使用jdk动态代理。
这里因为不是接口,只有类,使用通过cglib代理AOP。

在这个类上加上注解@Component @Aspect,标明是具有横切逻辑的切面类。在around(ProceedingJoinPoint,pjp)方法这个方法上边加上注解@Around 标明这是一个环绕通知,方法有返回值返回值类型为Object类型,参数为:ProceedingJoinPoint,通过pjp.proceed()方法。它代表的是实际要执行的核心业务逻辑,它的返回值就是实际执行方法的返回值,比如productController类中的adaddProduct()方法,返回值就是adaddProduct()方法的返回值,因为方法返回值类型各不相同,所以用Object接收。
2.需要获取到session中的用户信息,所有需要request对象,那么这里是通过ThreadLocal+Filter来获得全局的request对象,具体实现:https://blog.csdn.net/weixin_46763029/article/details/107165061
3.构建对象信息
又通过java的反射机制,
pjp.getTarget().getClass().getName()获得类名
pjp.getSigNature().getName()获得方法名
通过request.getParameterMap()获得参数并将其转换为json字符串
在pjp.proceed()方法的try-catch方法中设置状态,
成功时:info = “调用了”+className+“里面的”+methodName+“方法”;
失败时要将异常信息也加到info里:info = “调用了”+className+“里面的”+methodName+“方法,失败原因:”+throwable.getMessage();

在finally的方法里将log对象信息放入,通过logService.addLog(log);保存到数据库。
4.后续的完善
在这里插入图片描述
虽然后台开发人员可以看懂,但业务人员看不懂log信息,所以为了增加用户体验度,将用户的操作加上一个注解,可以直接通过设置注解的value值获得简单明了的信息。比如addProduct()方法 就可以将注解的value设置成"新增商品",通过action字段展示这个时候就达到简单易懂的需求了。
具体操作如下:
在这里插入图片描述
@Target(ElementType.METHOD) 在方法上使用
@Retention(RetentionPolicy.RUNTIME) 运行时生效
在方法上使用
在这里插入图片描述
通过MethodSignature signature = (MethodSignature) pjp.getSignature();
将signature强转成MethodSignature类型。
通过signature.getMethod()获得method,这样就可以通过反射获得方法是否存在注解,如果存在注解就获取注解的value值放到action属性里
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值