通过自定义注解 实现记录日志
引入AOP
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
/**
* 自定义注解
*
* @ClassName: ControllerLog
* @Version: 1.0
*/
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ControllerLog {
//操作方式(查询、删除、新增、修改、登录、退出
String operaType() default "";
//菜单名称,操作模块(用户,订单,监控等)
String operaMod() default "";
//接口描述
String describe() default "";
}
读取自定义注解的参数
/**
* @ClassName: ControllerLogAop
* @Version: 1.0
*/
@Log
@Aspect
@Component
public class ControllerLogAop {
/**
* 配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
* 此处配置 @ControllerLog 注解的路径
*/
@Pointcut("@annotation(com.common.tools.aop.annotation.ControllerLog)")
public void aspect() {
}
/**
* 后置通知 可用于记录操作日志
*
* @param point:
* @return: void
**/
@AfterReturning("aspect()")
public void doAfterReturning(JoinPoint point) {
//访问路径
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
String className = point.getSignature().getDeclaringType().getSimpleName();
String methodName = point.getSignature().getName();
String date = LocalDateTimeUtils.formatNow("yyyy-MM-dd HH:mm:ss");
//拦截的放参数类型
Class[] parameterTypes = ((MethodSignature) point.getSignature()).getMethod().getParameterTypes();
try {
Method method = point.getTarget().getClass().getMethod(methodName, parameterTypes);
if (!ObjectUtils.isEmpty(method)) {
ControllerLog as = method.getAnnotation(ControllerLog.class);
if (!ObjectUtils.isEmpty(as)) {
String operaMod = as.operaMod();
String describe = as.describe();
String operaType = as.operaType();
log.info(""
+ "\n---------请求类名: " + className
+ "\n---------请求路径: " + request.getRequestURI()
+ "\n---------访问地址: " + IpUtils.getIpAddr(request)
+ "\n---------访问时间: " + date
+ "\n---------菜单名称: " + operaMod
+ "\n---------操作方式: " + operaType
+ "\n---------接口描述: " + describe
+ "\n---------接口参数: " + getArgs(point));
}
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
/**
* 获取接口参数
*
* @param point:
* @return: java.lang.String
**/
private String getArgs(JoinPoint point) {
String[] parameterNames = ((MethodSignature) point.getSignature()).getParameterNames();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < parameterNames.length; i++) {
if (point.getArgs()[i] != null) {
sb.append(parameterNames[i] + ":" + point.getArgs()[i].toString() + "; ");
}
}
return sb.toString();
}
//****************************************************************************
//上面获取接口参数的方法无法转为JSON格式 在此添加可转为JSON格式的获取参数方法
/**
* 获取接口参数
*
* @param point:
* @return: java.lang.String
**/
private String getArgs(JoinPoint point) {
List<Object> logArgs = Arrays.stream(point.getArgs())
.filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)))
.collect(Collectors.toList());
return JSONObject.toJSONString(logArgs);
}
}
使用方式