Я хочу настроить приложение при запуске, а затем динамически добавлять и удалять его из разных журналов по запросу. Я бы предпочел, чтобы log4j сам настраивал этот appender и просто хватался за ссылку, когда это необходимо. Если это невозможно, мне придется создать экземпляр приложения и удерживать его.
Как я могу получить доступ к настроенным приложениям Log4J во время выполнения?
Ответ 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).