Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

От 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 Web Server, а не Tomcat).

Ответ 2

Вы можете сообщить log4j периодически перезагружать конфигурацию в этом примере каждые 30 секунд:

<configuration monitorInterval="30">

Обратитесь here за дополнительной информацией о конфигурации log4j:

Ответ 3

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

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

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

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

Ответ 4

Вы можете создать действие strut или сервлет, который перезагружает файл свойств. Поэтому после редактирования файла 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");
    */

    }
}

Ответ 5

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

Ответ 6

Обновление. Если вы используете 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

Ответ 7

Другой метод - настроить наблюдателя файлов с помощью 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

Ответ 8

Ответ Guido Garcia вполне подходит.

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

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

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

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

new PropertyConfigurator().doConfigure(filename,LogManager.getLoggerRepository());

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