Питання Завантажте файл конфігурації 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);

Але нічого не працює.


23
2018-01-13 04:21


походження


з усіма зворотними несумісними змінами, внесеними до перезавантаження конфігурації в log4j2, було б сенс вказати, яку версію AP4 і сервера log4j2 ви використовуєте ... - Yordan Georgiev


Відповіді:


Для новітньої версії log4j, ось що має працювати для завантаження зовнішнього log4j2.xml:

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

29
2018-02-24 16:32



Ви повинні мати можливість просто користуватися Configurator.initialize(null, "fileName"); - Conor Svensson
Так, @Conor це правильно. Дякую! - switch_java3


Якщо у вас є одна головна точка входу, цей фрагмент коду може заощадити вам деякі труднощі. Визначений виклик властивостей повинен запуститись перед створенням будь-яких реєстраторів. Цей підхід працює з файлами на шляху classpath.

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

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

}

13
2017-09-17 03:01



Це працювало чудово, я намагався встановити власність на Конструктора, але це не спрацювало. Статичний блок вирішено. - another


Сама знайшла відповідь. Хтось може вважати це корисним.

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

12
2018-01-13 09:37



Я намагаюсь зробити те ж саме, але не можу виконати навіть за допомогою наведеного вище коду. У вас є веб-залежність log4j2 у вашому проекті? Мій log4j2.xml знаходиться за межами шляху classpath, і я намагаюся завантажити його в Spring Bean, який має метод @PostConstruct. - ColinMc
Мій файл конфігурації журналу xml був поза шлях classpath. - HashimR
Чи була ваша програма веб-програмою? Я повинен згадати, я також використовую slf4j для абстрактного log4j2. - ColinMc
Так, це була веб-програма. І я також використовував slf4j для маршрутизації jcl журнали до log4j2. - HashimR
гаразд круто! ця відповідь базується на сервере 2,5 ... так чи інакше чудово, що його робота! - HashimR


Якщо ви використовуєте a Веб-додаток 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, навіть якщо він знаходиться поза межами вашого path classpath.


2
2018-05-01 21:09





Нижче працював для мене, 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());
}

Потрібно toURI() слідувати Формат схеми файлів URI, ще він кидає MalformedURLException.

Джерела:


2
2017-07-07 11:19





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

0
2018-03-01 06:09



Просто FYI для цього - будьте обережні, використовуючи "log4j2-test.xml" для тестування речей. Якщо це є в будь-якій з папок, log4j2 перевіряє, що він буде використовувати його за допомогою "log4j2.xml" і змусить вас думати, що ваш головний варіант цього працював, коли це насправді не відбулося. Я не пробував ваш код, але у мене була проблема з попереднім фрагментом коду. Я використовував "log4j2-test.xml", думаючи, що все було головним під час виконання, лише щоб виявити, що це було головним, оскільки log4j2 спочатку шукає "log4j2-test.xml", а потім "log4j2.xml" logging.apache.org/log4j/2.0/manual/... - adpro


Враховуючи - 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");

Будьте обізнані і не використовуйте обидва одночасно.


0
2018-03-17 09:43