You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot中ProceedingJoinPoint仅捕获log.info单个参数求助

排查AspectJ拦截SLF4J Logger.info时参数不全的问题

以下是实际开发中遇到类似问题的排查思路:

  • 确认AspectJ织入模式
    Spring AOP仅支持execution()切入点,不支持call()。如果项目默认用Spring AOP而非原生AspectJ织入,call(* org.slf4j.Logger.info(..))这个切入点不会正确工作,可能只拦截到部分调用。要启用原生AspectJ织入:

    1. 在SpringBoot启动类添加@EnableAspectJAutoProxy(proxyTargetClass = true)
    2. 确保Maven中配置了正确的织入方式,比如通过spring-boot-maven-plugin添加aspectjweaver的javaagent,或者使用编译时织入。
  • 检查日志实现的字节码干扰
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:20:33