Slf4j loggers with Byte Buddy(使用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记录器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用Byte Buddy的SLF4j记录器
基础教程推荐
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01