Программно загружать конфигурационный файл Log4j2

17

Я хочу загрузить файл конфигурации 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);

Но пока ничего не работает.

    
задан HashimR 13.01.2014 в 05:21
источник

5 ответов

9

Нашел ответ сам. Кто-то может найти это полезным.

ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
source.setFile(new File(logConfigurationFile));
source.setInputStream(new FileInputStream(logConfigurationFile));
Configurator.initialize(null, source);
    
ответ дан HashimR 13.01.2014 в 10:37
источник
20

Для новейшей версии log4j, вот что должно работать для загрузки внешнего log4j2.xml :

String log4jConfigFile = System.getProperty("user.dir") + File.separator + "log4j2.xml";
ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4jConfigFile));
Configurator.initialize(null, source);
    
ответ дан switch_java3 24.02.2015 в 17:32
источник
10

Если у вас есть одна основная точка входа, этот фрагмент кода может сэкономить вам определенную проблему. Вызов свойства set должен срабатывать до создания любых журналов. Этот подход работает с файлами в пути к классам.

public class TestProcess {
    static {
        System.setProperty("log4j.configurationFile", "log4j-alternate.xml");
    }

    private static final Logger log = LoggerFactory.getLogger(TestProcess.class);

}
    
ответ дан dcompiled 17.09.2014 в 05:01
источник
1

Если вы используете веб-приложение Servlet 3.0 , вы можете использовать Log4jServletContextListener и выполните следующие действия:

Напишите пользовательский LogContextListener , который простирается от Log4jServletContextListener , настройте его в web.xml и отключите автоматическую инициализацию:

<listener>
    <listener-class>com.example.LogContextListener</listener-class>
</listener>
<context-param>
    <param-name>isLog4jAutoInitializationDisabled</param-name>
    <param-value>true</param-value>
</context-param>

В вашем пользовательском 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, даже если это вне вашего пути к классам.

    
ответ дан lanoxx 01.05.2015 в 23:09
источник
0
final URL log4j = Resources.getResource("log4j2-test.xml");
LoggerContext.getContext(false)
  .start(new XmlConfiguration(new ConfigurationSource(
    Resources.asByteSource(log4j).openStream(),
    log4j)));
    
ответ дан TJR 01.03.2017 в 07:09
источник