Динамическое изменение уровня журнала log4j - PullRequest
116 голосов
/ 05 января 2011

Каковы различные подходы для динамического изменения уровня журнала log4j, чтобы мне не пришлось повторно развертывать приложение. Будут ли изменения в этих случаях постоянными?

Ответы [ 7 ]

85 голосов
/ 05 января 2011

File Watchdog

Log4j может просматривать файл log4j.xml на предмет изменений конфигурации.Если вы измените файл log4j, log4j автоматически обновит уровни журнала в соответствии с вашими изменениями.Подробности смотрите в документации org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long).Время ожидания по умолчанию между проверками составляет 60 секунд.Эти изменения будут постоянными, поскольку вы напрямую изменяете файл конфигурации в файловой системе.Все, что вам нужно сделать - это вызвать DOMConfigurator.configureAndWatch () один раз.

Внимание: метод configureAndWatch небезопасен для использования в средах J2EE из-за утечки потока

JMX

Другой способ установить уровень журнала (или переконфигурировать в целом) log4j - использовать JMX.Log4j регистрирует свои регистраторы как JMX MBeans.С помощью консолей серверов приложений MBeanServer (или jconsole.exe JDK) вы можете перенастроить каждый отдельный регистратор.Эти изменения не являются постоянными и будут сброшены в конфигурации, как установлено в файле конфигурации после перезапуска приложения (сервера).

Самодельный

Как описано Аароном, вы можете установитьуровень журнала программно.Вы можете реализовать это в своем приложении так, как вы этого хотите.Например, у вас может быть графический интерфейс, в котором пользователь или администратор изменяет уровень журнала, а затем вызывает методы setLevel() в регистраторе.Сохранять ли вы настройки где-то или нет, решать только вам.

80 голосов
/ 05 января 2011

Изменение уровня журнала просто;изменение других частей конфигурации приведет к более глубокому подходу.

LogManager.getRootLogger().setLevel(Level.DEBUG);

Изменения постоянны в течение жизненного стиля Logger.При повторной инициализации конфигурация будет считана и использована, поскольку настройка уровня во время выполнения не сохраняет изменения уровня.

ОБНОВЛЕНИЕ: Если вы используете Log4j 2, вам следует удалить вызовы на setLevel согласно документации , поскольку этого можно достичь с помощью классов реализации.

Вызовы метода logger.setLevel () или аналогичных методов не поддерживаются в API.Приложения должны удалить их.Эквивалентная функциональность предоставляется в классах реализации Log4j 2, но может сделать приложение подверженным изменениям во внутренних элементах Log4j 2.

5 голосов
/ 31 августа 2015

Log4j2 можно настроить для обновления своей конфигурации, сканируя файл log4j 2 .xml (или эквивалентный) с заданными интервалами. Просто добавьте параметр " monitorInterval " в тег конфигурации. См. Строку 2 примера файла log4j 2 .xml, в котором log4j указывает повторно сканировать свою конфигурацию, если после последнего события журнала прошло более 5 секунд.

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="warn" monitorInterval="5" name="tryItApp" packages="">

    <Appenders>
        <RollingFile name="MY_TRY_IT"
                     fileName="/var/log/tryIt.log"
                     filePattern="/var/log/tryIt-%i.log.gz">
            <Policies>
                <SizeBasedTriggeringPolicy size="25 MB"/>
            </Policies>
            ...
        </RollingFile>
    </Appenders>


    <Loggers>
        <Root level="error">
            <AppenderRef ref="MY_TRY_IT"/>
        </Root>
    </Loggers>

</Configuration>

Существуют дополнительные шаги, чтобы заставить это работать, если вы развертываете экземпляр tomcat, в IDE или при использовании весенней загрузки. Здесь это кажется чем-то за рамками и, вероятно, заслуживает отдельного вопроса.

2 голосов
/ 05 мая 2016

Этот ответ не поможет вам динамически изменить уровень ведения журнала, вам нужно перезапустить службу, если вы нормально перезапускаете службу, используйте приведенное ниже решение

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

, передавая это как параметр JVM (я использую Java 1.7)

Извините, динамическое изменение журнала не будетуровень, он требует перезапуска службы

java -Dlogging.level=DEBUG -cp xxxxxx.jar  xxxxx.java

в файле log4j.properties, я добавил эту запись

log4j.rootLogger=${logging.level},file,stdout

Я пытался

 java -Dlogging.level=DEBUG -cp xxxxxx.jar  xxxxx.java
 java -Dlogging.level=INFO-cp xxxxxx.jar  xxxxx.java
 java -Dlogging.level=OFF -cp xxxxxx.jar  xxxxx.java

Все заработало.надеюсь, это поможет!

У меня есть следующие зависимости в моем pom.xml

<dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
</dependency>

<dependency>
    <groupId>log4j</groupId>
    <artifactId>apache-log4j-extras</artifactId>
    <version>1.2.17</version>
</dependency>
2 голосов
/ 29 января 2016

С log4j 1.x я считаю, что наилучшим способом является использование DOMConfigurator для отправки одного из предопределенного набора конфигураций XML-журнала (скажем, одного для обычного использования и одного для отладки).

Используя их можно сделать что-то вроде этого:

  public static void reconfigurePredefined(String newLoggerConfigName) {
    String name = newLoggerConfigName.toLowerCase();
    if ("default".equals(name)) {
      name = "log4j.xml";
    } else {
      name = "log4j-" + name + ".xml";
    }

    if (Log4jReconfigurator.class.getResource("/" + name) != null) {
      String logConfigPath = Log4jReconfigurator.class.getResource("/" + name).getPath();
      logger.warn("Using log4j configuration: " + logConfigPath);
      try (InputStream defaultIs = Log4jReconfigurator.class.getResourceAsStream("/" + name)) {
        new DOMConfigurator().doConfigure(defaultIs, LogManager.getLoggerRepository());
      } catch (IOException e) {
        logger.error("Failed to reconfigure log4j configuration, could not find file " + logConfigPath + " on the classpath", e);
      } catch (FactoryConfigurationError e) {
        logger.error("Failed to reconfigure log4j configuration, could not load file " + logConfigPath, e);
      }
    } else {
      logger.error("Could not find log4j configuration file " + name + ".xml on classpath");
    }
  }

Просто вызовите его с соответствующим именем конфигурации и убедитесь, что вы поместили шаблоны в путь к классам.

0 голосов
/ 22 июня 2017

Если вы хотите изменить уровень регистрации всех регистраторов, используйте метод ниже. Это перечислит все регистраторы и изменит уровень регистрации на данный уровень. Пожалуйста, убедитесь, что у вас НЕ установлено свойство log4j.appender.loggerName.Threshold=DEBUG в вашем файле log4j.properties.

public static void changeLogLevel(Level level) {
    Enumeration<?> loggers = LogManager.getCurrentLoggers();
    while(loggers.hasMoreElements()) {
        Logger logger = (Logger) loggers.nextElement();
        logger.setLevel(level);
    }
}
0 голосов
/ 16 августа 2016

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

((ch.qos.logback.classic.Logger)LoggerFactory.getLogger(packageName)).setLevel(ch.qos.logback.classic.Level.toLevel(logLevel));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...