核心是结合spring aop与自定义注解实现日志切面:先定义@target(method)@retention(runtime)的@logexecution注解作标记,再通过@aspect+@around切面拦截,自动记录方法描述、参数、耗时、返回值或异常,业务方法仅需添加注解即可,零侵入、易维护。

用 Java 注解实现日志记录切面,核心是结合 Spring AOP 和自定义注解,在方法执行前后自动打印日志,避免在业务代码里硬编码 log 语句。
定义自定义日志注解
先创建一个运行时保留、可作用于方法的注解,用于标记需要记录日志的方法:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogExecution {
String value() default ""; // 可选描述,如 "用户登录"
}这个注解本身不带逻辑,只是个“标记”,后续由切面识别并处理。
编写日志切面类
使用 @Aspect 声明切面,配合 @Around 或 @Before/@AfterReturning 实现日志行为。推荐用 @Around,便于记录入参、返回值和耗时:
@Aspect
@Component
@Slf4j
public class LoggingAspect {
<pre class="brush:java;toolbar:false;">@Around("@annotation(logExecution)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint, LogExecution logExecution) throws Throwable {
String methodName = joinPoint.getSignature().toShortString();
String desc = StringUtils.defaultString(logExecution.value(), methodName);
long start = System.currentTimeMillis();
log.info("【开始】{},参数:{}", desc, Arrays.toString(joinPoint.getArgs()));
try {
Object result = joinPoint.proceed();
long cost = System.currentTimeMillis() - start;
log.info("【完成】{},耗时:{}ms,返回:{}", desc, cost, result);
return result;
} catch (Exception e) {
long cost = System.currentTimeMillis() - start;
log.error("【异常】{},耗时:{}ms,异常:{}", desc, cost, e.getMessage(), e);
throw e;
}
}}
- 确保项目已引入
spring-boot-starter-aop和 Lombok(或手动写 Logger) -
@Around拦截所有标注了@LogExecution的方法 - 日志中包含方法描述、参数、耗时、返回值或异常堆栈,信息完整且结构清晰
在业务方法上使用注解
直接加在需要监控的方法上,轻量无侵入:
@Service
public class UserService {
<pre class="brush:java;toolbar:false;">@LogExecution("查询用户详情")
public User getUserById(Long id) {
return userMapper.selectById(id);
}
@LogExecution
public void updateUser(User user) {
userMapper.updateById(user);
}}
不加 value 时默认用方法签名作日志前缀,加了则按描述显示,灵活可控。
可选增强:支持异步与敏感字段脱敏
实际生产中常需避开日志泄露密码、手机号等敏感信息:
- 对
joinPoint.getArgs()做白名单过滤或调用脱敏工具(如用正则替换手机号为138****1234) - 若方法是异步(
@Async),注意 AOP 默认不生效,需启用exposeProxy=true或改用 AspectJ 编译织入 - 可通过注解属性控制日志级别(如
level = LogLevel.INFO),让切面动态选择log.info还是log.debug
不复杂但容易忽略细节,关键是把注解当开关、把切面当统一日志入口,既干净又易维护。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











