美文网首页
SpringAop + MongoDB 注解 记录 方法日志

SpringAop + MongoDB 注解 记录 方法日志

作者: cn_moexc | 来源:发表于2019-05-05 15:19 被阅读0次

1.思路

  1. 在需要log的方法上添加自定义注解
  2. aop log注解,获取方法参数、返回值、调用时间保存至队列中
  3. 队列取log,保存至MongoDB

2.实现

  1. 所需包
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--Aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!--MongoDB-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.4</version>
        </dependency>

        <!--LomBok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>
  1. 自定义注解 - AopLog.java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AopLog {
    String value() default "未定义"; //自定义操作名称 - 比如:支付货款
    String collectionName() default "log"; //日志记录到MongoDB的哪个集合中
}
  1. 需要一个日志Model - Log.java
@Data //这个是lombok注解,如果不使用lombok,需要自己添加get、set方法
public class Log {
    private String annotationName;//自定义方法名 - AopLog.value
    private String methodName;//全限定方法名
    private Object[] methodArgs;//实参
    private Object methodResult;//方法返回值
    private Boolean normal;//状态 - 是否正常
    private Date date;//时间

    @Transient //不保存至MongoDB
    private String collectionName;//MongoDB Collection Name
}
  1. 日志操作类 - AopLogUtil.java
@Repository
public class AopLogUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(AopLogUtil.class);

    @Autowired
    private MongoTemplate mongoTemplate;

    private static BlockingQueue<Log> logs = new LinkedBlockingDeque<>();
    /**
     * @param log 添加Log到队列
     */
    public void add(Log log){
        logs.add(log);
    }
    private Log log;
    /**
     * 保存到MongoDB
     */
    public void save(){
        while(true){
            try {
                log = logs.take();
                LOGGER.info("待添加到MongoDB的日志:Json -> " + JSONObject.toJSONString(log));
                mongoTemplate.insert(log, log.getCollectionName());
            } catch (Exception e) {
                LOGGER.error("日志保存到MongoDB失败:Error -> " + e.getMessage());
            }finally {
                log = null;
            }
        }
    }
}
  1. aop
@Component
@Aspect
public class AopLogAspect {

    @Autowired
    private AopLogUtil aopLogUtil;

    @Pointcut("@annotation(AopLog)")
    public void aopLogCut(){}

    @Around("aopLogCut()")
    public Object AopLogCutAround(ProceedingJoinPoint joinPoint) throws Throwable{
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
        AopLog aopLog = method.getAnnotation(AopLog.class);

        Log log = new Log();
        log.setMethodArgs(joinPoint.getArgs());
        log.setMethodName(method.toString());
        log.setCollectionName(aopLog.collectionName());
        log.setAnnotationName(aopLog.value());
        log.setDate(new Date());
        try {
            Object object = joinPoint.proceed();
            log.setMethodResult(object);
            log.setNormal(true);
            return object;
        } catch (Throwable throwable) {
            log.setMethodResult(throwable);
            log.setNormal(false);
            throw  throwable;
        } finally {
            aopLogUtil.add(log);
        }
    }
}
  1. 启动时开始读取队列中的log保存至MongoDB
@Component
@Order(1)
public class SaveAopLog implements CommandLineRunner {

    @Autowired
    private AopLogUtil aopLogUtil;

    @Override
    public void run(String... args) throws Exception {
        aopLogUtil.save();
    }
}
  1. application.yml
spring:
  data:
    mongodb:
      host: 127.0.0.1
      port: 27017
      database: moexclog

相关文章

  • SpringAop + MongoDB 注解 记录 方法日志

    1.思路 在需要log的方法上添加自定义注解 aop log注解,获取方法参数、返回值、调用时间保存至队列中 队列...

  • spring boots使用AOP处理日志

    spring boots使用AOP处理日志 思路 创建注解,在需要记录日志的方法上添加注解, 在 方法运行前后,异...

  • SpringAOP-4

    SpringAOP实现代理-6(注解,组件) 注解的方式实现切面类,并且5种通知方法都可以使用注解完成环绕通知参数...

  • 收藏夹日常记录

    在SpringBoot中用SpringAOP实现日志记录功能 - 汪神 - 博客园[https://www.cnb...

  • SpringBoot 基于AOP的低侵入式日志

    ​ 使用Springboot Aop 注解的方式 实现 1.声明日志注解 2.用于日志记录的 DO 3.记录日志

  • Spring Aop实战应用

    一 场景 记录操作日志 二 代码实现 1 切面类 2 配置监控的自定义注解 3 为要增加日志的方法添加自定义注解 ...

  • 通用的记录日志注解

    通过AOP定义通用的记录日志注解 需求: 实现AOP日记记录 定义日志注解 定义日志拦截器 可扩展的日志生成规则模...

  • houyi平台-开发指南-日志记录

    日志说明 在需要使用记录日志的java类上使用@Sl4j注解,就可以使用log.xx方法,记录日志了。示例如下: ...

  • SpringBoot 用AOP做日志记录

    1:自定义注解(贴到所需要记录日志的方法上) 我的注解级别设置的是METHOD 2:创建拦截类 也就是说你要做日志...

  • Spring切面编程(AOP)-记录管理系统操作日志

    一、注解类 二、注解使用类 三、AOP拦截类 四、MQ记录操作日志 五、操作日志记录表 六、HttpServlet...

网友评论

      本文标题:SpringAop + MongoDB 注解 记录 方法日志

      本文链接:https://www.haomeiwen.com/subject/dhocoqtx.html