使用Byte Buddy的SLF4j记录器 [英] Slf4j loggers with Byte Buddy

查看:29
本文介绍了使用Byte Buddy的SLF4j记录器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试检测名为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);

和我的监视器拦截器

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方法中使用记录器时,会出现错误。 对此有何建议!

推荐答案

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

因为您正在检测JVM的一个类,所以这个类将被加载到引导路径上,该路径看不到您的类路径,其中将加载SLF4j之类的类。如果要将类添加到引导路径,则必须显式执行此操作。请查看Instrumentation::appendToBootstrapClassLoaderSearch以执行此操作。

这篇关于使用Byte Buddy的SLF4j记录器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆