我有使用Spring 5.1.10并在Jetty 9.4.20上运行的webapp。在整个应用程序中,JCL用于记录日志。通过启用jcl-slf4j
(以捕获Webapp和Spring消息)和logging-logback
模块并编辑相应的resources/logback.xml
来配置Jetty。在该配置文件中,定义了一个记录器,该记录器具有两种MDC模式:%mdc{instance:-internal}
和%mdc{user:-default}
。 MCD密钥instance
由Filter
设置,user
由RequestInterceptor
设置。基本上,它们可以正常工作,就像某些控制器调用日志记录语句时,instance
和user
的正确值最终出现在日志文件中。
问题在于存在控制器,该控制器处理系统的旧版部分。它查找一个类文件,使用自定义类加载器加载该类,进行一些设置(设置一些属性),然后执行一个方法,该方法实际上可以完成工作。问题在于,即使两个值都设置为正确值,所有发出日志消息的已加载类都将两个MDC密钥作为默认值(分别为internal
和default
)。
我添加了日志语句来过滤和请求拦截器,看起来它们占用与正在加载的类相同的线程。我还向控制器添加了一条测试日志语句,该语句在加载自定义类之后但在其方法执行之前发出。结果是,尽管所有实体都在同一线程中执行,MCD仍可在控制器,过滤器和拦截器中工作,并且不适用于已加载的类。这使我相信,某种程度上涉及了类加载。
问题是:如何使MDC在自定义类加载器加载的类中工作?