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

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


person Seth Weiner    schedule 15.12.2009    source источник
comment
Я хочу сделать то же самое. Я хочу настроить приложения в log4j.properties, а затем выбрать некоторые из них и динамически добавить их в rootLogger во время выполнения.   -  person Joel    schedule 28.01.2010


Ответы (6)


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

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

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

person Alan Krueger    schedule 15.12.2009
comment
Верно, я знаю, что могу извлечь приложение из Logger, если оно уже настроено для подключения к нему. Однако я ищу способ получить добавление, настроенное при запуске, которое НЕ уже подключено к регистратору. - person Seth Weiner; 15.12.2009

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

person Thomas Owens    schedule 15.12.2009
comment
Category был заменен классом Logger. Logger просто наследуется от Category. Итак, если сам метод Category не устарел, его вполне можно использовать. - person Alexander Pogrebnyak; 15.12.2009
comment
Разве использование getAppender() или getAllAppenders() не предполагает, что приложение уже находится в регистраторе? Я хочу настроить Appender при запуске, но не привязывать его к каким-либо категориям при запуске. Только во время выполнения я мог бы использовать его для вызова addAppender() в регистраторе. - person Seth Weiner; 15.12.2009
comment
Это, наверное, то, что я закончу делать. - person Seth Weiner; 15.12.2009

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

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

person Joel    schedule 28.01.2010
comment
Я думаю, что это действительно единственное решение. Реестр приложений является частным для PropertyConfigurator или DOMConfigurator. PropertyConfigurator даже очищает свой реестр после завершения. - person James; 20.07.2011

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

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

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

person Dima    schedule 13.02.2010

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

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

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

person nLogN    schedule 08.04.2015

Я думаю, что код, который вы ищете, это:

import org.apache.log4j.Appender;

import org.apache.log4j.Logger;

//stuff

    Enumeration enm = Logger.getRootLogger().getAllAppenders();
    Appender appender = null;
    while(enm.hasMoreElements()){
        appender = (Appender)enm.nextElement();
        System.out.println("appender.getName():"+appender.getName());
    }
person john ktejik    schedule 25.05.2021