Как я могу получить доступ к настроенным приложениям Log4J во время выполнения? - PullRequest
38 голосов
/ 15 декабря 2009

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

Ответы [ 5 ]

24 голосов
/ 15 декабря 2009

Добавители обычно добавляются в корневой логгер. Вот какой-то псевдокод

// 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);

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

3 голосов
/ 28 января 2010

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

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

3 голосов
/ 15 декабря 2009

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

0 голосов
/ 08 апреля 2015

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

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

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

0 голосов
/ 14 февраля 2010

Я бы сделал это так:

  1. Ваш appender указан в log4j.properties, но не добавлен в корневой логгер.
  2. во время выполнения, при необходимости, захватите log4j.properties, извлеките из него нужные вам свойства, создайте экземпляр приложения и установите его параметры, прочитав извлеченные свойства.
  3. активировать приложение
  4. Logger.getRootLogger () addAppender (Appender);.
  5. Отключите его по окончании использования - Logger.getRootLogger (). RemoveAppender (..)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...