Slf4j 记录器与 Byte Buddy

Slf4j loggers with Byte Buddy

我尝试检测一个名为 ThreadPoolExecutor 的 java class,我想使用 slf4j 记录器获取线程的详细信息,但出现以下错误

Exception in thread "pool-2-thread-2" Exception in thread "pool-2-thread-1" java.lang.NoClassDefFoundError: com/github/shehanperera/threadagent/MonitorInterceptor
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java)
    at java.lang.Thread.run(Thread.java:748)java.lang.NoClassDefFoundError: com/github/shehanperera/threadagent/MonitorInterceptor
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java)
    at java.lang.Thread.run(Thread.java:748)

这是我的经纪人

new AgentBuilder.Default()
            .with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager())
            .ignore(ElementMatchers.none())
            .type(ElementMatchers.nameContains("ThreadPoolExecutor"))
            .transform((builder, type, classLoader, module) -> builder
                    .method(ElementMatchers.nameContains("run"))
                    .intercept(Advice.to(MonitorInterceptor.class))
            ).installOn(instrumentation);

还有我的 MonitorInterceptor

public class MonitorInterceptor {

public static Logger logger = LoggerFactory.getLogger(MonitorInterceptor.class.getName());

@Advice.OnMethodEnter
static void enter(@Advice.Origin String method) throws Exception {

    logger.info(String.valueOf(Arrays.asList(Thread.currentThread().getStackTrace())));
}}

记录器正常工作,没有记录器也能正常工作。当我尝试在 enter 方法中使用记录器时,会发生上述错误。 对此有任何建议!

如果你使用class作为Advice,这个class只是一个模板而不是实际执行的代码。这意味着您不得引用执行方法不可见的字段,例如 class.

中的 logger 字段

由于您正在检测 JVM 的 class,此 class 将加载到无法看到您的 class 路径的引导路径上,其中 class 是这样的因为 SLF4j 将被加载。如果要将 classes 添加到引导路径,则必须明确地这样做。为此,请查看 Instrumentation::appendToBootstrapClassLoaderSearch