SpringBoot中ProceedingJoinPoint仅捕获log.info单个参数求助
以下是实际开发中遇到类似问题的排查思路:
确认AspectJ织入模式
Spring AOP仅支持execution()切入点,不支持call()。如果项目默认用Spring AOP而非原生AspectJ织入,call(* org.slf4j.Logger.info(..))这个切入点不会正确工作,可能只拦截到部分调用。要启用原生AspectJ织入:- 在SpringBoot启动类添加
@EnableAspectJAutoProxy(proxyTargetClass = true) - 确保Maven中配置了正确的织入方式,比如通过
spring-boot-maven-plugin添加aspectjweaver的javaagent,或者使用编译时织入。
- 在SpringBoot启动类添加
检查日志实现的字节码干扰
Logback、Log4j2等主流日志实现自身会通过字节码增强优化日志调用,可能和AspectJ的织入逻辑冲突,导致参数捕获不全。可以临时替换为slf4j-simple依赖,测试是否能正常捕获所有参数:<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.36</version> <!-- 匹配你的SLF4J版本 --> </dependency>如果替换后参数正常,说明是原日志实现的字节码增强导致的冲突,需要调整日志实现的配置或AspectJ的织入优先级。
验证切入点表达式覆盖所有重载
SLF4J的Logger有多个info重载方法,比如info(String)、info(String, Object)、info(String, Object[])等。可以修改切入点表达式,明确指定覆盖带多参数的重载:@Around("call(* org.slf4j.Logger.info(String, ..))")或者如果用Spring AOP,切换为
execution切入点:@Around("execution(* org.slf4j.Logger.info(..))")排查自定义日志封装的参数转发逻辑
你封装了SLF4J日志库,要确认封装类在转发日志调用时是否篡改了参数。比如是否把log.info(String, Object)的调用转换成了log.info(String)(只传递第一个参数),或者错误地将多参数打包成了Object[]但未正确传递。可以直接在业务代码中调用原生SLF4J的Logger.info方法,测试参数是否能被正常捕获,排除封装类的问题。调试确认实际拦截的方法签名
在injectLogConfigInfo方法中添加调试代码,打印实际拦截的方法签名:System.out.println("Intercepted method: " + pjp.getSignature());如果输出的是
void org.slf4j.Logger.info(String),说明实际拦截的是单参数重载,而非你调用的多参数版本,这时候需要检查调用逻辑或切入点表达式是否匹配正确。
内容的提问来源于stack exchange,提问作者aditya_sharma

