如何从 JNDI 加载 log4j2 配置文件
How to load log4j2 configuration file from JNDI
我正在将一些 Web 应用程序从 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 文件?
怎么样:
...
import org.apache.logging.log4j.core.config.Configurator;
...
private LoggerContext loggerContext;
public void contextInitialized(ServletContextEvent servletContextEvent) {
...
urlLogConfig = (URL) context.lookup("java:comp/env/"+logLocation);
...
//urlLogConfig -> file:///somepath/log4j.xml
ServletContext servletContext = servletContextEvent.getServletContext();
String contextName = servletContext.getServletContextName();
Classloader classloader = this.getClass().getClassloader();
loggerContext = Configurator.initialize(contextName, classloader, urlLogConfig.toURI());
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.log("Log4jConfigurationListener - Shutting down log4j");
if (loggerContext != null)
Configurator.shutdown(loggerContext);
}
我正在将一些 Web 应用程序从 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 文件?
怎么样:
...
import org.apache.logging.log4j.core.config.Configurator;
...
private LoggerContext loggerContext;
public void contextInitialized(ServletContextEvent servletContextEvent) {
...
urlLogConfig = (URL) context.lookup("java:comp/env/"+logLocation);
...
//urlLogConfig -> file:///somepath/log4j.xml
ServletContext servletContext = servletContextEvent.getServletContext();
String contextName = servletContext.getServletContextName();
Classloader classloader = this.getClass().getClassloader();
loggerContext = Configurator.initialize(contextName, classloader, urlLogConfig.toURI());
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.log("Log4jConfigurationListener - Shutting down log4j");
if (loggerContext != null)
Configurator.shutdown(loggerContext);
}