Можно ли динамически перезагрузить файл log4j.xml / log4j.properties в Tomcat? - PullRequest
34 голосов
/ 22 января 2010

Проблема в том, что всякий раз, когда вы изменяете log4j.properties/log4j.xml, вам необходимо перезапустить tomcat [или, скажем, любой другой сервер]. Есть ли способ перезагрузки конфигурации log4j?

Ответы [ 8 ]

27 голосов
/ 22 января 2010

С http://logging.apache.org/log4j/1.2/faq.html#3.6

Есть ли способ получить log4j для автоматически перезагрузить конфигурацию файл, если он меняется?

Да. И DOMConfigurator, и PropertyConfigurator поддерживает автоматическую перезагрузка через метод configureAndWatch . См. API документацию для получения дополнительной информации. подробности.

Поскольку запускается configureAndWatch отдельная нить wathdog, и потому что нет возможности остановить эту тему в log4j 1.2, configureAndWatch метод небезопасен для использования в J2EE среды, где приложения переработаны.

Сказал, что я успешно использовал метод PropertyConfigurator # configureAndWatch в среде Java EE (веб-сервер Sun One, а не Tomcat).

22 голосов
/ 25 апреля 2013

Начиная с log4j 2.x вы можете периодически перезагружать конфигурацию, в этом примере каждые 30 секунд:

<configuration monitorInterval="30">

Пожалуйста, посмотрите здесь для получения дополнительной информации о конфигурации log4j 2.x:

5 голосов
/ 18 октября 2011

Вы можете написать небольшой код инициализатора с помощью следующих коротких шагов:

  • прослушать "BEFORE_START_EVENT",
  • когда событие происходит (один раз при перезапуске Tomcat), запустите log4j, используя метод configureAndWatch
  • также не забудьте установить отключающий крюк для очистки потока наблюдателя

Подробности смотрите в этом блоге - перезагрузите конфигурацию log4j в tomcat

Они также перенесли его в github .

4 голосов
/ 20 марта 2015

Обновление: если вы используете lg4j2.xml, единственное, что вам понадобится для управления log4j во время выполнения -

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="30">
  <Loggers>
-------
  </Loggers>
</Configuration>

Интервал мониторинга 30 загружает изменения log4j каждые 30 секунд.

Ниже приведено решение, если вы используете более старую версию log4j.

Да, вы можете изменить уровень log4j во время выполнения без необходимости перезагружать сервер, если вы используете spring.

public class OptionalLog4jConfigurer extends Log4jConfigurer implements
 InitializingBean {

public static final Long DEFAULT_REFRESH = 30000L;
 private static final Log LOG = LogFactory
 .getLog(OptionalLog4jConfigurer.class);

private String configLocation;
 private Long refreshInterval;

public OptionalLog4jConfigurer(final String configLocation,
 final Long refreshInterval) {
 this.configLocation = configLocation;

if (refreshInterval == null) {
 this.refreshInterval = DEFAULT_REFRESH;
 }
 else {
 this.refreshInterval = refreshInterval;
 }
 }


 public void afterPropertiesSet() throws Exception {
 if (!StringUtils.isEmpty(this.configLocation)) {
 LOG.info("Log4J configuration is being customized.");

this.initLoggingInternal();
 }
 else {
 LOG
 .info("Using default Log4J configuration. No customization requested");
 }
 }

public String getConfigLocation() {
 return this.configLocation;
 }

public Long getRefreshInterval() {
 return this.refreshInterval;
 }

}

Затем внесите эти изменения в applicationContext.

<bean id="optionalLog4jInitialization"  class="com.skg.jetm.OptionalLog4jConfigurer">
<constructor-arg index="0" type="java.lang.String"  value="${log4j.configuration}" />
<constructor-arg index="1" type="java.lang.Long" value="100" />
 </bean>

Полный код и объяснение можно найти здесь

Динамическое изменение уровня log4j

4 голосов
/ 08 ноября 2011

Вы можете создать действие распорки или сервлет, который перезагрузит файл свойств. Поэтому после редактирования файла log4j.properties вам потребуется вызвать сервлет для его перезагрузки.

Например:

public class Log4JServlet extends HttpServlet{
  private static final long serialVersionUID = 1L;
  protected static Logger log = Logger.getLogger(Log4JTestServlet.class);

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("Reload Log4J prop file");
    String path = "C:\\GlassFishESBv22\\glassfish\\domains\\domain1\\config\\log4j.properties";
    PropertyConfigurator.configure(path);

    /*
    log.debug("debug message");
    log.info("info message");
    log.warn("warn message");
    log.error("error message");
    log.fatal("fatal message");
    */

    }
}
3 голосов
/ 11 июня 2012

Другой способ - настроить Log4jConfigListener * Spring Framework * в web.xml

.
1 голос
/ 23 мая 2017

Ответ Гвидо Гарсии вполне по цели.

Log4j 1 предлагает способ перезагрузки конфигурации log4j в потоке, не поддерживающем JEE.

Так что, если вы находитесь на континенте JEE, вы можете решить свою проблему тривиально:

(A) Создайте таймер @Singleton ejb для периодического сканирования файла log4j.properties

(b) Посмотрите на реализацию log logj watch, предоставленной log4j. То, что он делает, когда пришло время перезаписать файл, довольно просто и удобно:

новый PropertyConfigurator().doConfigure(filename,LogManager.getLoggerRepository());

Просто сделайте то же самое, если отметка времени в вашем файле конфигурации изменится. Вот и все.

0 голосов
/ 31 октября 2016

Другой метод заключается в настройке средства просмотра файлов с использованием Java File WatcherService, как описано ниже, с помощью ссылки и перезагрузки конфигурации Log4J для любых изменений файла.

https://dzone.com/articles/how-watch-file-system-changes

Перезагрузка может быть выполнена с помощью API DOMConfigurator

https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/DOMConfigurator.html

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