AOP实现日志管理
AOP实现日志管理
做项目时,往往需要一个日志管理功能来记录用户的操作记录。实现日志管理的方式有很多,主要用过滤器、拦截器、AOP等,本文将详细介绍用AOP来实现操作日志的管理。主要步骤如下:
创建自定义注解
package javax.annotation;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Title {
String value();
}
日志中需要uri和对应操作的名称(title),为了解决这一问题,本文采用自定义注解Title,为每个controller中的方法添加@Title,给每个方法创建操作名称。@Title使用如下:
@Title(value = "查询用户")
@RequestMapping( value = "list", method = RequestMethod.GET)
public @ResponseBody BaseRes<DataPageWrapper<SysUserVo>> queryPageList(
nteger currPage, Integer pageSize, SysUserVo sysUserVo) {
LOG.info("currPage={}, pageSize={}, sysUserVo={}", currPage, pageSize, sysUserVo);
BaseRes<DataPageWrapper<SysUserVo>> res = sysUserService.list(currPage, pageSize, sysUserVo);
return res;
}
创建切面类
package com.yishang.loan_admin.component;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.aspectj.lang.reflect.MethodSignature;
@Aspect
@Component
public class LogAspect {
@Around("execution(* com.yishang.loan_admin..*Controller.*(..))")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
HttpServletRequest request = CommUtils.getRequest();
Title title = ((MethodSignature) pjp.getSignature()).getMethod().getAnnotation(Title.class);
LoginInfo loginInfo = CommUtils.getLoginUserInfo();
Object[] args = pjp.getArgs();
String queryString = request.getQueryString();
return proceed;
}
}
LogAspect的环绕通知目标为所有controller,然后使用ProceedingJoinPoint来获取controller中的所有方法的注解、传入方法的参数。使用工具类CommUtils中的getRequest方法来获取HttpServletRequest
,使用request就可以获取uri、Header、IP等信息,工具类的getLoginUserInfo方法可以获取登录的用户信息。
在获取相关信息的过程中,较为复杂的是获取目标方法的Title注解的value和传入方法的参数。本文使用 ((MethodSignature) pjp.getSignature()).getMethod().getAnnotation(Title.class)来获取Title类,再使用title.value便可获取对应操作的名称;由于本项目中前后端传参方式有三种:payload方式、queryString和url路径参数,而ProceedingJoinPoint的getArgs方法只能获取参数值,不能获取参数名,因此该方法不能获取queryString的参数,所以另采用HttpServletRequest的getQueryString方法来获取参数。
在获取到所有想要参数后,存入数据库,便完成了对用户操作的记录。
下一篇: AOP日志管理