引言
日志是开发过程中非常重要的一部分,它能够记录程序的运行过程、错误信息和调试信息,帮助我们分析和解决问题。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中的日志记录功能。
参考链接:
推荐阅读
本文来自极简博客,作者:星空下的诗人,转载请注明原文链接:SpringBoot通过自定义注解记录日志