需求:系统中经常需要记录员工的操作日志和用户的活动日志,简单的做法在每个需要的方法中进行日志保存操作,
但这样对业务代码入侵性太大,下面就结合AOP和自定义日志注解实现更方便的日志记录
 
首先看下一个简单的操作日志表
 
action_log
  • id
  • subject(日志主题)
  • content(日志内容)
  • create_by
  • create_time

日志主题可以用下面的枚举类来实现

  1. package cn.bounter.common.model;
  2.  
  3. /**
  4. * 应用日志主题枚举类
  5. * @author simon
  6. *
  7. */
  8. public enum AppLogSubjectEnum {
  9.  
  10. /** 客户 */
  11. CUSTOMER(1,"客户"),
  12. /** 商品 */
  13. COMMODITY(2,"商品"),
  14. /** 订单 */
  15. ORDER(3,"订单");
  16.  
  17. private Integer value;
  18.  
  19. private String name;
  20.  
  21. private AppLogSubjectEnum(int value, String name) {
  22. this.value = value;
  23. this.name = name;
  24. }
  25.  
  26. public Integer getValue() {
  27. return value;
  28. }
  29.  
  30. public String getName() {
  31. return name;
  32. }
  33.  
  34. /**
  35. * 自定义方法
  36. * 根据枚举值获取枚举字符串内容
  37. * @param value
  38. * @return
  39. */
  40. public static String stringOf(int value) {
  41. for(AppLogSubjectEnum oneEnum : AppLogSubjectEnum.values()) {
  42. if(oneEnum.value == value) {
  43. return oneEnum.getName();
  44. }
  45. }
  46. return null;
  47. }
  48.  
  49. }

然后让我们看下自定义注解

  1. package cn.bounter.common.model;
  2.  
  3. import java.lang.annotation.*;
  4.  
  5. /**
  6. * 应用日志注解
  7. */
  8. @Target(ElementType.METHOD)
  9. @Retention(RetentionPolicy.RUNTIME)
  10. @Documented
  11. public @interface AppLog {
  12.  
  13. /**
  14. * 日志主题
  15. * @return
  16. */
  17. AppLogSubjectEnum subject();
  18.  
  19. /**
  20. * 日志内容
  21. * @return
  22. */
  23. String content() default "";
  24. }

接下来就是重头戏基于自定义注解的切面了

  1. package cn.bounter.common.model;
  2.  
  3. import org.aspectj.lang.JoinPoint;
  4. import org.aspectj.lang.Signature;
  5. import org.aspectj.lang.annotation.AfterReturning;
  6. import org.aspectj.lang.annotation.Aspect;
  7. import org.aspectj.lang.annotation.Pointcut;
  8. import org.aspectj.lang.reflect.MethodSignature;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Component;
  11.  
  12. import java.lang.reflect.Method;
  13. import java.time.LocalDateTime;
  14.  
  15. /**
  16. * 应用日志切面
  17. */
  18. @Aspect
  19. @Component
  20. public class AppLogAspect {
  21.  
  22. @Autowired
  23. private ActionLogService actionLogService;
  24.  
  25. @Pointcut("@annotation(cn.bounter.common.model.AppLog)")
  26. public void appLogPointCut() {
  27. }
  28.  
  29. @AfterReturning("appLogPointCut()")
  30. public void addActionLog(JoinPoint joinPoint) {
  31. Signature signature = joinPoint.getSignature();
  32. MethodSignature methodSignature = (MethodSignature) signature;
  33. Method method = methodSignature.getMethod();
  34.  
  35. //获取注解
  36. AppLog appLog = method.getAnnotation(AppLog.class);
  37. if (appLog == null) {
  38. return;
  39. }
  40.  
  41. //保存数据库
  42. actionLogService.save(
  43. new ActionLog()
  44. .setSubject(appLog.subject().getValue())
  45. .setContent(appLog.content())
  46. .setCreateBy(ShiroUtils.getUser()) //获取当前登录的用户
  47. .setCreateTime(LocalDateTime.now())
  48. );
  49. }
  50.  
  51. }

到这里就差不多,最后让我们看下怎么使用自定义日志注解

  1. /**
  2. * 新增订单
  3. * @param order
  4. * @return
  5. */
  6. @AppLog(subject = AppLogSubjectEnum.ORDER, content = "新增")
  7. public void save(Order order) {
  8. orderService.save(order);
  9. }

看完了之后是不是觉得挺简单哉!那就赶快自己动手试一试吧!

自定义日志注解 + AOP实现记录操作日志的更多相关文章

  1. 使用SpringBoot AOP 记录操作日志、异常日志

    平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能:我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 ...

  2. spring-boot-route(十七)使用aop记录操作日志

    在上一章内容中--使用logback管理日志,我们详细讲述了如何将日志生成文件进行存储.但是在实际开发中,使用文件存储日志用来快速查询问题并不是最方便的,一个优秀系统除了日志文件还需要将操作日志进行持 ...

  3. Appfuse:记录操作日志

    appfuse的数据维护操作都发生在***form页面,与之对应的是***FormController,在Controller中处理数据的操作是onSubmit方法,既然所有的操作都通过onSubmi ...

  4. MVC 记录操作日志与过滤特殊字符

    最近进行的MVC系统需要用到记录操作日志和过滤特殊字符的功能,如果每个action中都调用记录日志的方法就太麻烦了,所以根据需要结合mvc的过滤机制 写了个特殊字符验证与记录操作日志的公用类: pub ...

  5. Tomcat会话超时时怎样记录操作日志,满足安全审计要求

    众所周知.在实际的Web应用程序中,会话管理一般都採用Web容器会话管理功能. 使用Tomcat做Webserver也是如此,并且从安全的角度考虑,尽量避免去更改和干预Web容器的会话管理功能. To ...

  6. Spring aop 记录操作日志 Aspect

    前几天做系统日志记录的功能,一个操作调一次记录方法,每次还得去收集参数等等,太尼玛烦了.在程序员的世界里,当你的一个功能重复出现多次,就应该想想肯定有更简单的实现方法.于是果断搜索各种资料,终于搞定了 ...

  7. springmvc集成aop记录操作日志

    首先说明一下,这篇文章只做了记录日志相关事宜 具体springmvc如何集成配置aop对cotroller进行拦截,请看作者的另一篇文章 http://www.cnblogs.com/guokai87 ...

  8. SpringBoot-AOP记录操作日志

    package com.meeno.inner.oa.extend.operaterecord.aop; import com.alibaba.fastjson.JSONArray; import c ...

  9. Django记录操作日志、LogEntry的使用

    LogEntry是在后台开发中经常用到的模块,它在admin是默认开启的. 可以使用LogEntry模块记录所有用户的操作记录.一方面可以用来监督,另一方面可以用来做回滚. 1. 使用LogEntry ...

随机推荐

  1. 模拟赛DAY1 T1大美江湖

    这就是一个模拟题,注意1234分别对应左右上下横坐标和纵坐标的判断就好了 题解: 需要注意的是,向上取整ceil函数是对于一个double值返回一个double值,也就是说在ceil里面的类型一定要是 ...

  2. 线性回归 r python 比较

    w http://blog.sina.cn/dpool/blog/s/blog_70f632090101bp8u.html

  3. 使用wxpy模块了解微信好友

    网上看了一篇python文章,内容简单有趣,正好可以练习一下.原文连接:http://mp.weixin.qq.com/s/oI2pH8uvq4kwYqc4kLMjuA 一.环境:Windows+py ...

  4. 用Vue来实现音乐播放器(10):Scroll组件的抽象和应用

    了解better-scroll什么时候是需要refresh计算的??通常我们遇到的better-scroll不能滚动的问题的根源是什么??better-scroll的渲染原理是:根据初始化的时机  或 ...

  5. Vultr CentOS下后台跑node

    在Mac或者Windows下简直易如反掌.几行命令搞定的事情,但因为使用的是远程SSH连接纯命令行处理,所以需要记录下来怎么弄. 比如, 1. 怎么在什么都没有的CentOS里下载Node安装包? 2 ...

  6. spring的后置处理器——BeanPostProcessor以及spring的生命周期

    后置处理器的调用时机 BeanPostProcessor是spring提供的接口,它有两个方法——postProcessBeforeInitialization.postProcessAfterIni ...

  7. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第4节 ArrayList集合_15-ArrayList集合存储基本数据

    泛型必须是引用类型,不能是基本类型 里面的泛型用int就会报错 集合里面保存的都是地址值.基本类型的数据没有地址值,所以你想要往里面存int是不可以的 基本类型可以往ArrayList里面放,但是必须 ...

  8. node+express 中安装nodemon实时更新server.js

    每次启动node server.js,有一个缺点,每次server.js文件有改动时,必须重新执行指令node server.js,新的代码才会起作用 解决方案1 全局安装 npm install s ...

  9. 【FICO系列】SAP 财务帐与后勤不一致情况

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP 财务帐与后勤不一致情况 ...

  10. windows10安装ipython

    Win10中如何装IPython?(其他Windows版本,如win7.win8/8.1也通用)我的这个方法比较简单,配置好环境变量敲几行命令就行了 .安装IPython的前提是已经安装好了Pytho ...