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

Как я могу получить доступ к настроенным приложениям Log4J во время выполнения?

Я хочу настроить приложение при запуске, а затем динамически добавлять и удалять его из разных журналов по запросу. Я бы предпочел, чтобы log4j сам настраивал этот appender и просто хватался за ссылку, когда это необходимо. Если это невозможно, мне придется создать экземпляр приложения и удерживать его.

4b9b3361

Ответ 1

Агенты добавляются в корневой журнал. Здесь некоторый псевдокод

// get the root logger and remove the appender we want
Logger logger = Logger.getRootLogger();
Appender appender = logger.getAppender("foo");
logger.removeAppender(appender)

// when we want to add it back...
logger.addAppender(appender);

Я уверен, что вы можете сделать это на других регистраторах, кроме корневого регистратора, хотя я никогда не пробовал это.

Ответ 2

Logger класс имеет методы getAllAppenders(), getAppender(), addAppender() и removeAppender(), унаследованный от Category. Однако класс категории устарел, и, кроме того, я никогда не пытался это делать раньше, но это может быть полезной отправной точкой.

Ответ 3

Я хочу сделать то же самое. Я хочу настроить appenders в log4j.properties, а затем выбрать некоторые и добавить динамический файл rootLogger во время выполнения.

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

Ответ 4

Я бы сделал это следующим образом:

  • У вас есть приложение, указанное в log4j.properties, но не добавленное в корневой журнал.
  • во время выполнения, при необходимости, grab log4j.properties, извлеките из него нужные вам свойства, создайте экземпляр своего приложения и задайте его параметры, прочитав извлеченные свойства.
  • активировать appender
  • Logger.getRootLogger() addAppender (Appender);.
  • Удалите его, когда закончите использовать его - Logger.getRootLogger(). removeAppender (..)

Теперь, если это ваш собственный appender, делать (2) было бы легко, так как вы знаете значение свойств и знаете, чего ожидать. В противном случае вы, вероятно, захотите использовать отражение, чтобы создать экземпляр класса и вызвать его настройки свойств перед выполнением (3).

Ответ 5

Если это включение/отключение Appenders во время выполнения, которое вы хотите сделать, я нашел другое решение (хотя и не очень элегантное). Используя конфигурацию log4j, добавьте все необходимые вам приложения, как обычно.

Во время выполнения, когда вы хотите "отключить" приложение, добавьте к нему фильтр (org.apache.log4j.spi), который возвращает Filter.DENY для каждого сообщения журнала. Таким образом, для этого Appender нет сообщений. Когда вы хотите "включить" Appender обратно, просто очистите фильтр, который вы добавили выше.

Я тестировал это, и он хорошо работает для нас (log4j 1.2).