Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

}

Ответ 4

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

Ответ 5

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