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

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

40
задан Seth Weiner 15 December 2009 в 19:43
поделиться

4 ответа

Appenders are generally added to the root logger. Here's some pseudocode

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

I'm pretty sure you can do this on other loggers than the root logger as well, though I've never tried that.

25
ответ дан 27 November 2019 в 01:57
поделиться

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

4
ответ дан 27 November 2019 в 01:57
поделиться

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

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

3
ответ дан 27 November 2019 в 01:57
поделиться

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

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

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

0
ответ дан 27 November 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: