我正在将一些网站应用从Log4j 1.12迁移到Log4j2。由于公司政策,我们的log4j.xml文件位置在应用服务器中配置为URL,并且应用程序必须使用JNDI获取它们。 我们实现了一个ServletContextListener
,通过这种方式初始化了log4j基础设施:
public void contextInitialized(ServletContextEvent servletContextEvent) {
...
urlLogConfig = (URL) context.lookup("java:comp/env/"+logLocation);
...
//urlLogConfig -> file:///somepath/log4j.xml
DOMConfigurator.configureAndWatch(urlLogConfig.getPath());
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.log("Log4jConfigurationListener - Shutting down log4j");
LogManager.shutdown();
}
然而,由于log4j2 API的更改,这种方法不再可用。Log4j2提供了lo4j2-web.jar模块,使用
Log4jServletContainerInitializer
来初始化库。这最终会调用Log4jWebInitializerImpl.getConfigURI()
,负责获取配置文件的URI。是否有任何方法可以自定义Log4jWebInitializerImpl的行为,使其从JNDI名称解析xml文件?