利用java aop优雅的保存日志

利用java aop优雅的保存日志

目标

达到的目标通过自定义注解,注释到类上,将注解作为aop的切点,将这个方法执行耗时,方法名,参数,执行时间 ,记录到日志

demo

  • 自定义注解
package com.jsong.wiki.backend.annotation;

import java.lang.annotation.*;

/**
 * @Author: Jsong
 * @Date: 2020/3/22 20:51
 * @Description:
 */
// 注解信息添加到java文档中
@Documented
// 注解生命周期,表示注解会被保留到什么阶段,可选择编译阶段,类加载阶段,运行阶段
@Retention(RetentionPolicy.RUNTIME)
// 注解作用的位置,ElementType.METHOD 作用在方法上
@Target(ElementType.METHOD)
public @interface LogAnnotation {
    String action() default "";
}

  • aop切片
package com.jsong.wiki.backend.aop.aspect;

import com.alibaba.fastjson.JSON;
import com.jsong.wiki.backend.annotation.LogAnnotation;
import com.jsong.wiki.backend.entity.LogEntity;
import com.jsong.wiki.backend.service.LogService;
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.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * @Author: Jsong
 * @Date: 2020/3/22 20:48
 * @Description:
 */
@Aspect
@Component
public class LogAspect {

    @Autowired
    private LogService logService;

    /***
     * 切点
     * @date 2020/3/22 21:07
     * @author Jsong
     * @param
     * @return void
     */
    @Pointcut("@annotation(com.jsong.wiki.backend.annotation.LogAnnotation)")
    public void logpointCut() {

    }

//    @Before("createTiemPointCut()")
//    public void before(ProceedingJoinPoint proceedingJoinPoint){
//        Object[] args = proceedingJoinPoint.getArgs();
//        for (Object arg : args) {
//
//        }
//    }

    /***
     * 环绕 执行方法前方法后
     * @date 2020/3/22 21:17
     * @author Jsong
     * @param proceedingJoinPoint
     * @return void
     */
    @Around("logpointCut()")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        LogEntity logEntity = new LogEntity();
        // 执行开始时间
        Long beginTime = System.currentTimeMillis();
        proceedingJoinPoint.proceed();
        // 执行时长
        long time = System.currentTimeMillis() - beginTime;
        logEntity.setDuration((int) time);

        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
        Method method = signature.getMethod();

        LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);
        // 注解上的名字
        String action = logAnnotation.action();
        logEntity.setOperate(action);

        // 类名
        String className = proceedingJoinPoint.getTarget().getClass().getName();
        String methodName = signature.getName();
        logEntity.setMethod(className + "." + methodName);

        Object[] args = proceedingJoinPoint.getArgs();
        String params = null;
        if (args.length > 0) {
            // date对象 变json字符串
//            params = JSON.toJSONString(args);
            params = JSON.toJSONStringWithDateFormat(args, "yyyy-MM-dd HH:mm:ss");
        }
        logEntity.setParams(params);
        logService.saveLog(logEntity);
    }

}

  • 测试
    在方法使用自定义注解,然后就可以将这个方法执行的耗时,参数的等信息记录到日志
 	@PostMapping("/newFolder")
    @LogAnnotation(action = "新增文件夹")
    public DataResult addFolder(@RequestBody FolderEntity folderEntity) {
        folderService.addFolder(folderEntity);
        return DataResult.success();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值