spring boot自定义日志注解

本文介绍了如何在Spring Boot应用中利用Maven配置相关依赖,自定义注解以及AOP切面来实现方法级别的日志分析。通过创建`LogProfiler`注解,设置方法的执行信息,然后定义`LogAspect`切面处理注解,实现入参和出参的打印。在实际应用中,可以使用这个注解来跟踪和记录关键方法的执行情况,便于日志管理和性能分析。
摘要由CSDN通过智能技术生成

1. maven配置
首先需要在maven的pom文件中配置依赖。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
</dependency>
 

 

2.自定义注解
依赖配置好后,需要我们自定义一个注解。

@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogProfiler {

    /**
     * 方法英文名称,格式为:类名.方法名
     */
    String key() default "";

    /**
     * 方法中文名称,必填
     */
    String name();

    /**
     * 描述信息,非必填
     */
    String description() default "";

}

@Documented 将该自定义注解添加到 javadoc 文档中
@Target({ElementType.METHOD}) 该注解是作用在方法上的
@Retention(RetentionPolicy.RUNTIME) 作用时机为运行时
 

4. 配置AOP切面
定义好注解后,需要定义切面来解析该注解。

新建一个LogAspect 类@Aspect
@Component
public class LogAspect {
    private static final Logger log = LoggerFactory.getLogger(LogAspect.class);

 

声明切面

@Pointcut("@annotation(com.demo.common.annotation.LogProfiler)")
public void pointcut() {
}
1
2
3
配置环绕通知

@Around("pointcut()")
    public Object execParamLogAspect(ProceedingJoinPoint joinPoint) throws Throwable {
        // 如果停用日志打印,则直接执行原有代码逻辑,跳过打印日志
        if (!enable) {
            return joinPoint.proceed();
        }

        // 如果启用日志分析,则获取方法上的注解信息,并打印方法入参出参
        Method method = this.getMethod(joinPoint);
        LogProfiler logProfiler = method.getAnnotation(LogProfiler.class);
        // 获取注解上的 key+name
        String key = logProfiler.key();
        String name = logProfiler.name();
        String str = key + "-" + name;
        Object[] args = joinPoint.getArgs();
        // 打印入参
        this.printParam(str, args);
        // 执行原有方法逻辑
        Object result = joinPoint.proceed();
        // 打印出参
        this.printResult(str, result);
        return result;
    }

    private Method getMethod(JoinPoint jp) throws Exception {
        MethodSignature methodSignature = (MethodSignature) jp.getSignature();
        Method method = methodSignature.getMethod();
        return jp.getTarget().getClass().getDeclaredMethod(method.getName(), method.getParameterTypes());
    }

    /**
     * 打印入参
     *
     * @param key  方法名称
     * @param args 参数
     */
    private void printParam(String key, Object[] args) {
        if (log.isInfoEnabled()) {
            log.info("{}方法入参为:{}", key, JSONObject.toJSONString(args));
        }
    }

    /**
     * 打印出参
     *
     * @param key    方法名称
     * @param result 方法返回值
     */
    private void printResult(String key, Object result) {
        if (log.isInfoEnabled()) {
            log.info("{}方法出参为:{}", key, JSONObject.toJSONString(result));
        }
    }

}



其中enable为日志打印的全局开关,可以通过在application.yml中配置该属性来决定日志是否打印。默认值为true。

    @Value("${log.profiler.enable:true}")
    private Boolean enable;

5. 使用自定义注解打印
自定义注解定义完成,可以在我们的方法上面来使用这个注解了,使用如下图

在这里插入图片描述

调用该方法时,就可以看到该注解所打印的日志了
 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值