gpt4 book ai didi

java - 如何从 JNDI 加载 log4j2 配置文件

转载 作者:行者123 更新时间:2023-12-01 23:34:11 25 4
gpt4 key购买 nike

我正在将一些 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);
}

关于java - 如何从 JNDI 加载 log4j2 配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29389872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com