java项目中用aop切面记录方法耗时和入参,核心是结合spring aop与slf4j+logback,通过@around拦截、stopwatch计时、参数脱敏、@logtime注解控制切点,并规范日志格式与生产环境策略。

在 Java 项目中,用 AOP 切面记录方法耗时和入参,核心是结合 Spring AOP(或 AspectJ)与日志框架(如 SLF4J + Logback),避免侵入业务代码,统一管控日志行为。
定义切面类,捕获方法执行前后信息
创建一个 @Aspect 类,用 @Around 拦截目标方法。它能获取方法签名、参数、返回值和异常,适合计算耗时并打印入参:
- 用
StopWatch或System.nanoTime()计算精确耗时(推荐StopWatch,更易读) - 用
Arrays.toString(joinPoint.getArgs())格式化参数,注意敏感字段(如密码)需脱敏,不能直接打明文 - 建议加上条件判断,比如只对
@LogTime注解的方法生效,避免全量拦截影响性能
添加自定义注解控制切点范围
定义一个运行时注解(如 @LogTime),标注在需要监控的方法或类上:
- 注解可带属性,例如
level = LogLevel.INFO控制日志级别,或includeParams = true决定是否打印参数 - 切面中用
@Around("@annotation(logTime)")绑定,比包路径表达式更灵活、可维护 - 避免对高频调用方法(如 getter/setter、工具类)无差别记录,防止日志爆炸
日志输出结构清晰,便于排查与分析
一条完整日志至少包含:类名、方法名、耗时(ms)、入参摘要、结果状态(成功/异常)。示例格式:
[INFO] com.example.service.UserService.updateUser - args=[1001, User(name=xxx)] - cost=128ms - result=success- 使用占位符(
{})配合 SLF4J 的参数化日志,避免字符串拼接开销 - 异常情况要打印堆栈(
log.error(..., e)),但注意不要重复打印——切面里捕获后抛出原异常即可 - 生产环境建议关闭详细参数日志,或仅记录参数类型+数量(如
args[2]: String, Long),兼顾可观测性与安全合规
确保切面生效且不干扰原有逻辑
检查几个关键点:
- 确认切面类被 Spring 扫描到(加
@Component,且所在包在@ComponentScan范围内) - 若目标方法是内部调用(this.xxx()),AOP 不生效——必须是代理对象调用,即从 Spring 容器获取的 Bean 调用
- 事务方法中慎用:如果切面在事务外部执行,可能因事务未提交导致日志中的数据状态与最终库中不一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











