2016-02-25 5 views
3

Мы реализовали пользовательские конфигурации фабрики для того, чтобы программно настроить 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)); 

ответ

1

Если вы хотите полная реконфигурация затем использовать заводскую конфигурацию, чтобы создать новую. Затем используйте класс Configurator для замены конфигурации или вызова setConfiguration в LoggerContext.

+0

Спасибо, что сейчас работает. У меня есть другие проблемы, но я не думаю, что они связаны с процессом реконфигурации. Я обновил основную запись, чтобы отразить решение в коде. –

Смежные вопросы