以编程方式加载Log4j2配置文件

我想从我的应用程序以编程方式加载Log4j2 XML配置文件。

试过这个:

ConfigurationSource source = new ConfigurationSource(); source.setLocation(logConfigurationFile); Configurator.initialize(null, source); 

和这个:

 ConfigurationSource source = new ConfigurationSource(); source.setLocation(logConfigurationFile); ConfigurationFactory factory = (ConfigurationFactory) XMLConfigurationFactory.getInstance().getConfiguration(source); ConfigurationFactory.setConfigurationFactory(factory); 

但是没有任何作用。

对于最新版本的log4j,以下是加载外部log4j2.xml工作log4j2.xml

 String log4jConfigFile = System.getProperty("user.dir") + File.separator + "log4j2.xml"; ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4jConfigFile)); Configurator.initialize(null, source); 

如果您有一个主要入口点,此代码段可能会为您省去一些麻烦。 必须在创建任何记录器之前触发set属性调用。 此方法适用于类路径上的文件。

 public class TestProcess { static { System.setProperty("log4j.configurationFile", "log4j-alternate.xml"); } private static final Logger log = LoggerFactory.getLogger(TestProcess.class); } 

我自己找到了答案。 有人可能觉得它很有用。

 ConfigurationSource source = new ConfigurationSource(); source.setLocation(logConfigurationFile); source.setFile(new File(logConfigurationFile)); source.setInputStream(new FileInputStream(logConfigurationFile)); Configurator.initialize(null, source); 

如果您使用的是Servlet 3.0 Web应用程序 ,则可以使用Log4jServletContextListener并执行以下操作:

编写一个自定义LogContextListener ,它从Log4jServletContextListener扩展,在web.xml并禁用自动初始化:

  com.example.LogContextListener   isLog4jAutoInitializationDisabled true  

在自定义LogContextListener覆盖contextInitialized并设置配置位置

 public void contextInitialized(ServletContextEvent event) { /* Some logic to calculate where the config file is saved. For * example you can read an environment variable. */ String pathToConfigFile = ... + "/log4j2.xml"; Configurator.initialize(null, pathToConfigFile); super.contextInitialized(event); } 

直接在web.xml配置位置的优点是,您可以根据一些其他信息计算路径,并访问log4j2.xml,即使它位于类路径之外。

以下为我工作,Log4j2与SLF4J包装:

解决方案1:

 public class MyClass { static { try { InputStream inputStream = new FileInputStream("C:/path/to/log4j2.xml"); ConfigurationSource source = new ConfigurationSource(inputStream); Configurator.initialize(null, source); } catch (Exception ex) { // Handle here } } private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class); // LogManager if not using SLF4J public void doSomething() { LOGGER.info(...) } } 

解决方案2:

 static { File log4j2File = new File("C:/path/to/log4j2.xml"); System.setProperty("log4j2.configurationFile", log4j2File.toURI().toString()); } 

需要URI toURI()遵循文件URI方案格式 ,否则抛出MalformedURLException

资料来源:

 final URL log4j = Resources.getResource("log4j2-test.xml"); LoggerContext.getContext(false) .start(new XmlConfiguration(new ConfigurationSource( Resources.asByteSource(log4j).openStream(), log4j))); 

考虑 – https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/config/Configurator.html

 Configurator.initialize(null, "classpath:conf/logger.xml"); or Configurator.initialize(null, "/full_path/conf/logger.xml"); 

请注意并且不要同时使用两者。