Tomcat 7:无法将LoggerContext强制转换为LoggerContext

时间:2017-11-10 11:46:35

标签: java spring tomcat

在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()时使用通用类加载器?

或者,或许更好,什么应该是正确的方法?

0 个答案:

没有答案