spring-boot aop 增删改操作日志 实现

Posted chunming-an

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring-boot aop 增删改操作日志 实现相关的知识,希望对你有一定的参考价值。

1.注解接口:
import com.github.wxiaoqi.security.common.constant.Constants;

import java.lang.annotation.*;

/**
* 日志注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLogOpt
String value();

String module() default ""; //模块名称 系统管理-用户管理-列表页面

String description() default ""; //描述

Constants.LogOptEnum operationType() default Constants.LogOptEnum.UNKNOW;//操作类型

 

2.切面类
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.duiyue.common.mvc.core.APIResponse;
import com.duiyue.common.util.LogUtils;
import com.github.wxiaoqi.security.admin.annotation.SysLogOpt;
import com.github.wxiaoqi.security.admin.biz.SysLogService;
import com.github.wxiaoqi.security.api.entity.SysLog;
import com.github.wxiaoqi.security.common.constant.Constants;
import com.github.wxiaoqi.security.common.context.BaseContextHandler;
import com.github.wxiaoqi.security.common.util.RegexUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;

@Slf4j
@Aspect
@Component
public class LogAspect
/**
* 开始时间
*/
private long startTime = 0L;

@Resource
private SysLogService logService;

@Pointcut("execution(* *..rest..*.*(..)) && @annotation(com.github.wxiaoqi.security.admin.annotation.SysLogOpt)")
public void logPointCut()

@Around("logPointCut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable
startTime = System.currentTimeMillis();
Object result = null;
SysLog sysLogModel = logPre(pjp);
try
result = pjp.proceed();
finally
//查询类型不添加日志
if (Constants.LogOptEnum.QUERY.value() != sysLogModel.getOperationType())
if (logAfter(result, sysLogModel).getUserName() != null)
sysLogModel.setCreateTime(new Date());
sysLogModel.setUpdateTime(new Date());
logService.add(sysLogModel);



return result;


private SysLog logPre(ProceedingJoinPoint pjp) throws Exception
SysLog sysLogModel = new SysLog();
for (Method method : Class.forName(pjp.getTarget().getClass().getName()).getMethods())
if (method.getName().equals(pjp.getSignature().getName()))
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == pjp.getArgs().length)
//方法名称
sysLogModel.setOperation(method.getAnnotation(SysLogOpt.class).value());
//操作类型
sysLogModel.setOperationType(method.getAnnotation(SysLogOpt.class).operationType().value());
break;



//获取请求对象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
startTime = System.currentTimeMillis();
String ip = HttpUtil.getClientIP(request);
//方法名含包名(om.github.wxiaoqi.security.admin.rest.SysLogController.queryListPage)
String classMethod = pjp.getSignature().getDeclaringTypeName() + "." + pjp.getSignature().getName();
//请求参数
String args = JSON.toJSONString(pjp.getArgs()).replaceAll(RegexUtil.getJSonValueRegex("password"), "****").replaceAll(RegexUtil.getJSonValueRegex("oldPassword"), "****");

sysLogModel.setIp(ip);
sysLogModel.setMethod(classMethod);
sysLogModel.setParams(args);
sysLogModel.setCreateTime(new Date());
sysLogModel.setCreateUser(0L);
sysLogModel.setUpdateUser(0L);

String currentUserName = "";
try
currentUserName = BaseContextHandler.getUsername();
catch (Exception e)
LogUtils.error(log, "", e);

if (StringUtils.isNotEmpty(currentUserName))
sysLogModel.setUserName(currentUserName);

return sysLogModel;


private SysLog logAfter(Object result, SysLog sysLogModel)
APIResponse response = null;
if (result != null)
response = (APIResponse) result;

String currentUserName = "";
try
currentUserName = BaseContextHandler.getUsername();
catch (Exception e)
LogUtils.error(log, "", e);

if (StringUtils.isNotEmpty(currentUserName))
sysLogModel.setUserName(currentUserName);

//返回结果
if (response != null && response.getStatus() == Constants.ResultCodeEnum.SUCCESS.value())
sysLogModel.setResult(1);
else
sysLogModel.setResult(0);

//执行时长(毫秒)
Long spendTime = System.currentTimeMillis() - startTime;
sysLogModel.setProcessTime(spendTime);
return sysLogModel;

 

3.控制层使用(方法上使用)。
@SysLogOpt(module = "活动管理", value = "添加活动", operationType = Constants.LogOptEnum.ADD)

(注:枚举类型未给出,自行修改)

以上是关于spring-boot aop 增删改操作日志 实现的主要内容,如果未能解决你的问题,请参考以下文章

springboot-使用AOP日志拦截实现

静态实现AOP(翻译自MSDN)

使用logging模块实现对文件增删改查操作的纪录(low B版)

使用自定义注解和AOP管理shiro权限

mysql简单增删改查(CRUD)

spring aop + xmemcached 配置service层缓存策略