在Spring NON Boot应用程序中,我希望公开一个类似Spring Actuator的loggers端点的功能。
问题是,由于我无法改变,我们在Tomcat lib
文件夹中有一个jar,其中包含logback库。
我的代码是这样的(在控制器内):
@RequestMapping(value = "/logging", method = RequestMethod.GET)
@ResponseBody
@Produces("application/json")
public Map<String, String> getLevel(@RequestParam(required = false) String name) {
Map<String, String> toReturn = new HashMap<>();
ILoggerFactory iLoggerFactory = LoggerFactory.getILoggerFactory();
LoggerContext loggerContext = (LoggerContext) iLoggerFactory;
loggerContext.getLoggerList().forEach(l -> toReturn.put(l.getName(), l.getLevel().levelStr));
return toReturn;
}
这里,在LoggerContext loggerContext = (LoggerContext) iLoggerFactory;
行中我得到了例外:
ch.qos.logback.classic.LoggerContext cannot be cast to ch.qos.logback.classic.LoggerContext
这显然是ClassLoader
的一个问题,同时也考虑到如果我设置一个断点并评估演员,它就能正常工作。
阅读Tomcat documentation,我认为演员与评估一起工作,因为在这种情况下它使用我的web app类加载器,并且它在运行时不起作用,因为tomcat使用公共ClassLoader
来阅读在启动时间内使用LoggerContext,然后在方法ClassLoader
中使用我的网络应用LoggerFactory.getILoggerFactory()
。
所以我的问题是:如何强制tomcat在执行LoggerFactory.getILoggerFactory()
时使用通用类加载器?
或者,或许更好,什么应该是正确的方法?