SpringBoot通过自定义注解记录日志

星空下的诗人 2024-07-14 ⋅ 99 阅读

引言

日志是开发过程中非常重要的一部分,它能够记录程序的运行过程、错误信息和调试信息,帮助我们分析和解决问题。Spring Boot提供了很多日志框架的支持,比如Logback、Log4j2等。本文将介绍如何通过自定义注解在Spring Boot中记录日志。

1. 创建自定义注解

首先,我们需要创建一个自定义注解来标记需要记录日志的方法:

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

在上面的示例中,我们定义了一个名为Loggable的注解,它可以应用在方法上,并且在运行时保留。

2. 创建切面

接下来,我们需要创建一个切面类,用来处理被Loggable注解标记的方法,并实现日志记录的功能:

@Aspect
@Component
public class LoggingAspect {
    
    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
    
    // 在所有被Loggable注解标记的方法上织入日志记录逻辑
    @Around("@annotation(com.example.Loggable)")
    public Object logMethodInvocation(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        Loggable loggable = method.getAnnotation(Loggable.class);
        
        String methodName = method.getName();
        String className = joinPoint.getTarget().getClass().getSimpleName();
        String logMessage = StringUtils.isNotBlank(loggable.value()) ? loggable.value() : methodName;
        
        logger.info("开始执行方法:{}.{}", className, methodName);
        long startTime = System.currentTimeMillis();
        
        Object result = joinPoint.proceed();
        
        long endTime = System.currentTimeMillis();
        long executionTime = endTime - startTime;
        
        logger.info("完成执行方法:{}.{}. 总耗时:{}ms", className, methodName, executionTime);
        
        return result;
    }
}

在上面的示例中,我们使用了@Aspect注解将该类声明为一个切面,并使用@Component注解将其交由Spring管理。@Around注解表示这是一个Around类型的通知,在被@Loggable注解标记的方法执行前后会执行切面逻辑。

我们从ProceedingJoinPoint中获取到被注解方法的签名信息,如方法名和类名,并根据需求记录日志。

3. 在方法上标记注解

最后,在需要记录日志的方法上使用自定义注解Loggable标记:

@RestController
public class UserController {
    
    @Loggable("查询用户")
    @GetMapping("/users/{id}")
    public User getUserById(@PathVariable("id") Long id) {
        // 查询用户逻辑...
    }
}

在上面的示例中,我们在getUserById方法上使用@Loggable注解,并提供了需要记录的日志信息。

总结

经过上述步骤,我们成功地使用自定义注解和切面来记录Spring Boot应用中方法的日志信息。这种方式可以帮助我们统一处理日志记录,避免重复代码,并且可以根据需求灵活地添加或删除日志记录。希望通过本文的介绍,能够帮助读者更好地理解和应用Spring Boot中的日志记录功能。

参考链接:

推荐阅读


全部评论: 0

    我有话说: