Мы реализовали пользовательские конфигурации фабрики для того, чтобы программно настроить Log4J2:Log4J2 Programmatic реконфигурации
ConfigurationFactory.setConfigurationFactory(new MyConfigurationFactory());
Первоначальная конфигурация работает правильно.
У нас есть некоторые слушатели в нашем коде, которые запускают глобальное событие конфигурации обновления. Когда это произойдет, нам нужно полностью переконфигурировать Log4J.
Я попробовал несколько вариантов, чтобы сообщить Log4J 'reconfigure', но ни один из них не адекватно воссоздает Appenders с новой конфигурацией.
Вот ближе всего я нашел, но это не работает для Appender конфигурации:
ConfigurationFactory.setConfigurationFactory(new MyConfigurationFactory());
LoggerContext ctx = (LoggerContext) LogManager.getContext();
ctx.reconfigure();
ctx.updateLoggers();
Как я могу вызвать от глобального события перенастроить в Log4J2 так, что она будет падать всю свою конфигурацию, а затем полностью настроить себя?
Редактировать: После дальнейшего изучения и отладки, похоже, что конфигурация регистратора также не обновляется. Начальный уровень, установленный для регистратора, остается неизменным. Новый экземпляр неизменяемого класса org.apache.logging.log4j.core.Logger.PrivateConfig
не построен.
Edit 2: мне удалось реализовать решение, которое работает, однако реализация ужасна, и я могу только предположить, что это работает случайно не дизайн:
LoggerContext ctx = (LoggerContext) ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).getContext();
for(org.apache.logging.log4j.core.Logger l : ctx.getLoggers())
{
l.getContext().onChange((Reconfigurable) ctx.getConfiguration());
}
ctx.reconfigure();
Моя работа заключается в реализации общие рамки для поддержки программной реконфигурации, поэтому важно, чтобы реализация не была хрупкой/ошибочной. Я надеюсь, что есть правильно способ переконфигурировать Log4J2 в полном объеме, а не код, подобный этому, который я бы рассмотрел.
Редактировать 3: Решение: В соответствии с принятым ответом ниже, я изменил свой код на следующее:
ConfigurationFactory configFactory = new MyConfigurationFactory();
ConfigurationFactory.setConfigurationFactory(configFactory);
org.apache.logging.log4j.core.LoggerContext ctx = (org.apache.logging.log4j.core.LoggerContext) LogManager
.getContext(false);
ctx.start(configFactory.getConfiguration(ConfigurationSource.NULL_SOURCE));
Спасибо, что сейчас работает. У меня есть другие проблемы, но я не думаю, что они связаны с процессом реконфигурации. Я обновил основную запись, чтобы отразить решение в коде. –