一、引入必要依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- aop依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.41</version></dependency><!-- druid数据源驱动 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

二、自定义注解

定义一个方法级别的@Log注解,用于标注需要监控的方法:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {String value() default "";
}

三、建立数据表和实体类

数据表:

实体类:

@Data
@TableName("sys_handle_log")
public class SysHandleLog extends Model<SysHandleLog> {@TableId(value = "id", type = IdType.AUTO)private Integer id;@ApiModelProperty(value = "执行人")@TableField("create_user")private String createUser;@ApiModelProperty(value = "操作")@TableField("operation")private String operation;@ApiModelProperty(value = "执行的方法")@TableField("method")private String method;@ApiModelProperty(value = "携带参数")@TableField("params")private String params;@ApiModelProperty(value = "耗时")@TableField("spend_time")private Integer spendTime;@ApiModelProperty(value = "用户ip")@TableField("ip")private String ip;@ApiModelProperty(value = "位置")@TableField("location")private String location;@ApiModelProperty(value = "创建时间")@TableField("create_time")private Date createTime;@Overrideprotected Serializable pkVal() {return this.id;}
}

四、日志切面

@Aspect
@Component
public class UserOperateAspect{@Autowiredprivate SysHandleLogMapper sysHandleLogMapper;@Pointcut("@annotation(com.project.common.annotation.UserOperateLog)")public void pointcut() { }@Around("pointcut()")public Object around(ProceedingJoinPoint point) {Object result = null;long beginTime = System.currentTimeMillis();try {// 执行方法result = point.proceed();} catch (Throwable e) {e.printStackTrace();}// 执行时长(毫秒)long time = System.currentTimeMillis() - beginTime;// 保存日志saveLog(point, time);return result;}private void saveLog(ProceedingJoinPoint joinPoint, long time) {MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();SysHandleLog sysHandleLog = new SysHandleLog();UserOperateLog logAnnotation = method.getAnnotation(UserOperateLog.class);if (logAnnotation != null) {// 执行的操作sysHandleLog.setOperation(logAnnotation.value());}// 请求的方法名String className = joinPoint.getTarget().getClass().getName();String methodName = signature.getName();sysHandleLog.setMethod(className + "." + methodName + "()");// 请求的方法参数值Object[] args = joinPoint.getArgs();// 请求的方法参数名称LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();String[] paramNames = u.getParameterNames(method);if (args != null && paramNames != null) {String params = "";for (int i = 0; i < args.length; i++) {if(args[i] instanceof Project) {Class<?> object = args[i].getClass();//获取实体类的所有属性,返回Field数组Field[] fields = object.getDeclaredFields();for (Field field : fields) {//field.toString() 格式:private java.lang.String com.project.sys.entity.Project.projectProperty 只需要projectPropertytry {field.setAccessible(true);if (field.get(args[i]) != null && !"".equals(field.get(args[i]))) {params += "  " + StringUtils.substringAfterLast(field.toString(), ".") + ": " + field.get(args[i]);}} catch (IllegalAccessException e) {e.printStackTrace();}}}else if(args[i]!=null&&!args[i].equals("")){params += "  " + paramNames[i] + ": " + args[i];}}sysHandleLog.setParams(params);}// 获取requestHttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();// 获取ip及地址String IP=IPUtils.getIpAddress(request);sysHandleLog.setIp(IP);sysHandleLog.setLocation(AddressUtils.getAddressByIP(IP).replaceAll("\\d+","").replace("|",""));//获取用户名SysUserInfo userInfo= (SysUserInfo) request.getSession().getAttribute(SystemConst.SYSTEM_USER_SESSION);sysHandleLog.setCreateUser(userInfo.getName());sysHandleLog.setSpendTime((int) time);sysHandleLog.setCreateTime(new Date());// 保存系统日志sysHandleLogMapper.insert(sysHandleLog);}
}

五、控制器

@Controller
@RequestMapping("sys-handlelog-info/")
public class SysHandleLogController {@Autowiredprivate SysHandleLogService sysHandleLogService;@AutowiredSysHandleLogMapper sysHandleLogMapper;@GetMapping("init")public String init() {return "sys/handlelog/list";}@PostMapping("list")@ResponseBodypublic LayTableResult list(Integer page, Integer limit, SysHandleLog sysHandleLog) {return sysHandleLogService.list(page, limit, sysHandleLog);}@GetMapping("deleteAll")public String deleteAll() {sysHandleLogMapper.deleteHandleLog();return "sys/handlelog/list";}
}

注:部分dao层代码没给出,这里主要给出思路

Spring Boot AOP记录用户操作日志相关推荐

  1. Spring Boot + Aop 记录用户操作日志

    目录 一.前言 二.实战 1.设计用户操作日志表: sys_oper_log 2.引入依赖 3.自定义用户操作日志注解 4.自定义用户操作日志切面 5.MyLog注解的使用 6.最终效果 三.总结 一 ...

  2. ssm 项目记录用户操作日志和异常日志

    ssm 项目记录用户操作日志和异常日志 参考文章: (1)ssm 项目记录用户操作日志和异常日志 (2)https://www.cnblogs.com/mei-m/p/10231792.html (3 ...

  3. 中操作日志文件记录的是什么_SpringBoot+AOP实现用户操作日志的记录

    前言: 任何一个项目都会有一个用户操作日志(也叫行为日志)的模块,它主要用来记录某个用户做了某个操作,当出现操作失败时,通过日志就可以快速的查找是哪个用户在哪个模块出现了错误,以便于开发人员快速定位问 ...

  4. Linux记录用户操作日志

    前言 我这里计划用SLS做服务器日志审计,安装Logtail后通过 [分隔符-文本] 的方式,采集服务器各种相关日志,大概需要以下内容(目录可能是错的,这个是做等保的评测的兄弟发过来的) /var/l ...

  5. Spring Boot Aop结合Swagger记录用户操作日志

    1.引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swag ...

  6. spring boot aop 记录方法执行时间

    了性能调优,需要先统计出来每个方法的执行时间,直接在方法前后log输出太麻烦,可以用AOP来加入时间统计 添加依赖 <dependency> <groupId>org.spri ...

  7. Spring Boot——基于AOP的HTTP操作日志解决方案

    解决方案 package com.hailiu.web.aop;import com.fasterxml.jackson.databind.ObjectMapper; import com.haili ...

  8. 使用Spring AOP自定义注解方式实现用户操作日志记录

    1,开发环境 操作系统:Windows 7 JDK:1.8.0_161 Eclipse:Mars.2 Release (4.5.2) 2,自定义注解类UserLog @Target({ElementT ...

  9. spring boot项目怎么记录用户操作行为和登录时间_6 个 Github 项目拿下 Spring Boot

    经常浏览技术社区.技术公众号的读者会有一个感受,那么就是 Spring Boot 相关的文章和相关咨询越来越多.包括小逛和技术公众号的博主交流,他们也发现推送 Spring Boot 相关的文章阅读量 ...

最新文章

  1. 活动报名 | “认知神经科学”助力人工智能突围的方法路径
  2. SAP RETAIL 特征参数文件(Characteristic Profile) II
  3. ASP.NET常见错误,原因及解决方法(2003版)_不断更新.....
  4. dubbo使用一些简单想法
  5. Ubuntu配置远程访问的xrdp协议和teamviewer软件
  6. optee HSM的实现
  7. mysql安装前的系统准备工作(转)
  8. java @valid 密码不一致_一个成熟的Java项目如何优雅地处理异常
  9. react-draft-wysiwyg富文本的使用
  10. linux live使用方法,使用linux-live kit对Linux备份/部署
  11. doe报告模板_【质量管理小组QCC活动】报告模板
  12. word图片靠右_如何设置word图片边缘透明
  13. JavaScript 验证统一社会信用代码/营业执照注册号
  14. BeanNotOfRequiredTypeException,Bean named ‘xx‘ is excepted to be of type ‘xx‘ but was ‘$Proxy30 ‘
  15. 计算广告——读书笔记(一)
  16. 运动蓝牙耳机什么牌子好?性价比高的无线蓝牙耳机
  17. 【STC15控制WS2812 RGB彩灯级联】
  18. KMP算法(快速找出字串)
  19. 电气器件系列十:热继电器FR\KRE
  20. eva新世纪福音战士_如何客观地评价EVA(新世纪福音战士)?

热门文章

  1. Nhibernate一些问题解决方法
  2. Oracle PL SQL 精萃pdf
  3. poj2392 Space Elevator
  4. 对css float 浮动的学习心得
  5. 英雄会挑战失败求原因
  6. 拦截导弹 最长上升/下降子序列
  7. Apache+PHP+MySQL安装与配置
  8. 基于MATLAB的LS-SVM实现方法以及SVM的一些知识点
  9. 论文阅读:Deep Filter Banks for Texture Recognition and Segmentation
  10. 七、“待到秋风起,桃李遍九州”