2013-03-15 5 views
26

Можно ли программно добавлять приложения Log4J2 с помощью спецификаций из конфигурации XML?Как добавить программные приложения Log4J2 во время выполнения программно?

Я планирую определить все это в log4j2.xml, а затем выбрать appenders ситуативно, как это (не компилировать):

if (arg[0].equals("log")) { 
    Logger.getLogger("loggerNameFromXMLConfig").addAppender("appenderNameFromXMLConfig"); 
} else { 
    //... 
} 
+3

Это всего лишь дубликат, потому что это должен быть вопрос log4j2. Связанный вопрос относится к log4j1 (который даже не раскрывает те же методы, что и log4j2) и slf4j. –

+1

Я не уверен, что те, кто закрыл этот вопрос, знают, что это такое. –

+0

В качестве обходного пути я удалил log4j2 и перенесен в Log4J («Log4J1»), который позволяет динамическое построение из XML-конфигураций. –

ответ

15

Edit: для новейших версий log4j2 см https://stackoverflow.com/a/33472893/1899566 вместо этого.

меня создалось впечатление, что они не хотят, чтобы вы делаете это, но это работает для меня:

if (arg[0].equals("log")) { 
    org.apache.logging.log4j.Logger logger 
    = org.apache.logging.log4j.LogManager.getLogger("loggerNameFromXMLConfig"); 
    org.apache.logging.log4j.core.Logger coreLogger 
    = (org.apache.logging.log4j.core.Logger)logger; 
    org.apache.logging.log4j.core.LoggerContext context 
    = (org.apache.logging.log4j.core.LoggerContext)coreLogger.getContext(); 
    org.apache.logging.log4j.core.config.BaseConfiguration configuration 
    = (org.apache.logging.log4j.core.config.BaseConfiguration)context.getConfiguration(); 

    coreLogger.addAppender(configuration.getAppender("appenderNameFromXMLConfig")); 
} else { 
    //... 
} 
+0

это красивый! :) –

+0

Спасибо - я использовал его для этого - https://codingcraftsman.wordpress.com/2015/04/28/log4j2-mocking-with-mockito-and-junit/ –

18

Было высказано несколько запросов на поддержку лучшей программной конфигурации для Log4j 2. Извините, это заняло так много времени. Начиная с Log4j 2.4, API был добавлен в log4j-core, чтобы облегчить programmatic configuration.

Новый API ConfigurationBuilder позволяет пользователям создавать компоненты определения. С помощью этого API нет необходимости работать непосредственно с реальными объектами конфигурации (такими как LoggerConfig и FileAppender), которые требуют большого количества знаний о том, как Log4j работает под капотом. Определения компонентов добавляются в ConfigurationBuilder, и как только все определения будут собраны, будут созданы все фактические объекты конфигурации (такие как Loggers и Appenders). Он немного похож на синтаксис конфигурации XML, за исключением того, что вы пишете Java-код.

Обратите внимание, что новый API ConfigurationBuilder позволяет коду пользователя создавать новую конфигурацию или полностью заменять существующую конфигурацию. Если ваш вариант использования отличается, и вы хотите программно изменить (а не заменить) существующую конфигурацию после запуска Log4j, вам необходимо будет работать с реальными объектами конфигурации. В этом случае см. Раздел Programmatically Modifying the Current Configuration after Initialization руководства.

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