Я хочу настроить приложение при запуске, а затем динамически добавлять и удалять его из различных регистраторов по требованию. Я бы предпочел, чтобы log4j сам настроил это приложение и просто брал ссылку на него, когда это необходимо. Если это невозможно, мне придется самому создать экземпляр приложения и удерживать его.
Как я могу получить доступ к настроенным приложениям Log4J во время выполнения?
Ответы (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);
Я почти уверен, что вы можете сделать это и на других регистраторах, кроме корневого регистратора, хотя я никогда не пробовал этого.
Класс Logger имеет методы для getAllAppenders(), getAppender( ), addAppender() и removeAppender(), унаследованные от категория. Однако класс Category устарел, и, кроме того, я никогда не пытался сделать это раньше, но это может быть полезной отправной точкой.
Category
был заменен классом Logger
. Logger
просто наследуется от Category
. Итак, если сам метод Category
не устарел, его вполне можно использовать.
- person Alexander Pogrebnyak; 15.12.2009
Я хочу сделать то же самое. Я хочу настроить приложения в log4j.properties, а затем выбрать некоторые из них и динамически добавить их в rootLogger во время выполнения.
Я не мог понять, как получить доступ к приложениям, кроме как через регистратор, к которому они были подключены, поэтому в итоге я создал фиктивный регистратор и присоединил к нему приложения, чтобы я мог получать их динамически. . Это не идеально, поскольку любые ресурсы, используемые приложениями (например, файлы), создаются заранее, даже если они не используются.
Я бы сделал это так:
- у вас есть добавление, указанное в log4j.properties, но не добавленное в корневой регистратор.
- во время выполнения, когда это необходимо, возьмите log4j.properties, извлеките из него нужные вам свойства, создайте экземпляр вашего приложения и установите его параметры, прочитав извлеченные свойства.
- активировать приложение
- Logger.getRootLogger().addAppender(appender);
- Отключите его, когда закончите его использовать - Logger.getRootLogger().removeAppender(..)
Теперь, если это ваш собственный аппендер, выполнить (2) будет легко, поскольку вы знаете значение свойств и знаете, чего ожидать. В противном случае вы, вероятно, захотите использовать отражение для создания экземпляра класса и вызвать его установщики свойств перед выполнением (3).
Если вы хотите включить/отключить Appenders во время выполнения, я нашел другое решение (хотя и не очень элегантное). Используя конфигурацию log4j, добавьте все Appenders, которые вам понадобятся, как обычно.
Во время выполнения, когда вы хотите «отключить» добавление, добавьте к нему фильтр (org.apache.log4j.spi), который возвращает Filter.DENY для каждого сообщения журнала. Таким образом, никакие сообщения не проходят через этот Appender. Если вы хотите «включить» Appender обратно, просто очистите фильтр, который вы добавили выше.
Я проверил это, и у нас это работает хорошо (log4j 1.2).
Я думаю, что код, который вы ищете, это:
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());
}