Slf4j记录器与Byte Buddy

时间:2018-03-19 11:26:35

标签: java slf4j javaagents byte-buddy

我尝试检测一个名为ThreadPoolExecutor的java类,我希望使用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())));
}}

logger以正常方式工作,没有记录器,这是有效的。当我尝试在上面输入方法中使用记录器时会发生错误。 对此有任何建议!

1 个答案:

答案 0 :(得分:1)

如果您将类用作logger,则此类只是一个模板,而不是实际执行的代码。这意味着您不得引用对执行方法不可见的字段,例如类中的{{1}}字段。

由于您正在检测JVM的类,因此将在引导路径上加载此类,该路径无法查看将加载SLF4j等类的类路径。如果要将类添加到引导路径,则必须明确地执行此操作。请查看Instrumentation::appendToBootstrapClassLoaderSearch这样做。