spring aop可通过自定义注解@logexecutiontime与@aspect切面实现方法级日志记录,自动记录执行耗时、结果及异常,无需侵入业务代码,且支持上下文标识、参数脱敏与链路追踪等进阶功能。

Spring AOP 通过自定义注解 + 切面(@Aspect)可以优雅地实现方法级日志记录,无需在业务代码中硬编码日志逻辑。
1. 定义自定义日志注解
创建一个运行时保留、可作用于方法的注解,用于标记需要记录日志的方法:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogExecutionTime {
String value() default "执行日志";
}说明:value() 可选,方便在不同方法中标识日志上下文(如“用户登录耗时”、“订单查询耗时”)。
2. 编写切面类记录日志
使用 @Aspect + @Around 拦截带该注解的方法,记录开始时间、执行结果、异常和耗时:
@Aspect
@Component
@Slf4j
public class LoggingAspect {
<pre class="brush:java;toolbar:false;">@Around("@annotation(logExecutionTime)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint, LogExecutionTime logExecutionTime) throws Throwable {
String methodName = joinPoint.getSignature().toShortString();
String context = StringUtils.hasText(logExecutionTime.value())
? logExecutionTime.value() : methodName;
long start = System.currentTimeMillis();
log.info("【日志】{} 开始执行", context);
try {
Object result = joinPoint.proceed();
long duration = System.currentTimeMillis() - start;
log.info("【日志】{} 执行成功,耗时 {} ms,返回: {}", context, duration, result);
return result;
} catch (Exception e) {
long duration = System.currentTimeMillis() - start;
log.error("【日志】{} 执行失败,耗时 {} ms,异常: {}", context, duration, e.getMessage(), e);
throw e;
}
}}
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
关键点:
- @Around 必须接收 ProceedingJoinPoint 和注解参数(形参名需与注解类名一致)
- joinPoint.proceed() 是真正执行目标方法的入口,必须调用
- 建议对 result 做 toString() 限制(如 JSON.toJSONString(result, SerializerFeature.WriteClassName)),避免日志过大或敏感信息泄露
- log.error 的第三个参数传入异常对象,才能打印完整堆栈
3. 在方法上使用注解
只需在 Controller、Service 等任意 Bean 方法上添加 @LogExecutionTime 即可生效:
@RestController
public class UserController {
<pre class="brush:java;toolbar:false;">@LogExecutionTime("获取用户详情")
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}}
注意:确保目标类是 Spring 管理的 Bean(加了 @Service/@Controller/@Component 等),且项目已启用 AOP(Spring Boot 默认开启;传统 Spring 需配置
4. 进阶建议(可选)
提升日志实用性与安全性:
- 用 @Pointcut 抽取公共切入点表达式,便于复用和统一管理
- 结合 MDC(Mapped Diagnostic Context)注入 traceId,实现链路追踪(配合 Sleuth 或手动传递)
- 对入参脱敏(如手机号、身份证号字段),避免日志泄露敏感数据
- 按日志级别分流:info 记耗时,debug 记参数,error 记异常,避免生产环境日志爆炸
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










