Jetty下运行的MyServerClass使用Logback classic:
Logger logger = (Logger) LoggerFactory.getLogger(MyServerClass.class);`
在 TestNG 和 Selenium Webdriver 的单独 Maven 模块中,我尝试将 logback LoggerContextListener 附加到该记录器。
Logger logger = (Logger) LoggerFactory.getLogger(MyServerClass.class);
LoggerContext loggerContext = logger.getLoggerContext();
loggerContext.addListener(new MyLoggerContextListener());
问题是两个模块的类加载器不同 所以 LoggerFactory.getLogger(MyServerClass.class) 返回一个不同的实例 到在服务器模块和 MyServerClass.logger 中运行的程序,所以在 MyServerClass
loggerContext.getCopyOfListenerList();
仍然是空的。
在服务器模块中:
ServletContext servletContext = request.getServletContext();
String path = servletContext.getContextPath();
path 是一个空字符串,这意味着它是“根”上下文,植根于 Web 服务器的 URL 名称空间的基础。
在测试模块中: 我在某处读到,Jetty 提供了 ServletContextHelper,它可以返回 webAppClassLoader,它应该能够提供 Jetty 的 MyServerClass 实例,可以将侦听器添加到其中:
ServletContext servletContext = ServletContextHelper.getServletContext(path);
ClassLoader webAppClassLoader = servletContext.getClassLoader();
Class<?> MyServerClass = webAppClassLoader.loadClass("com.example.MyServerClass");
Logger logger = (Logger) LoggerFactory.getLogger(MyServerClass.class);
LoggerContext loggerContext = logger.getLoggerContext();
loggerContext.addListener(new MyLoggerContextListener());
我在 Jetty jar 中找不到这个 ServletContextHelper。 任何建议表示赞赏。
addHiddenClassMatcher()
上的 WebAppContext
import org.eclipse.jetty.ee10.webapp.WebAppContext;
import org.eclipse.jetty.util.ClassMatcher;
WebAppContext webapp = new WebAppContext();
// other init of webapp
webapp.addHiddenClassMatcher(new ClassMatcher("ch.qos.logback"));