以编程方式加载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)));
Configurator.initialize(null, "classpath:conf/logger.xml"); or Configurator.initialize(null, "/full_path/conf/logger.xml");
请注意并且不要同时使用两者。