Каковы различные подходы к изменению уровня журнала log4j динамически, так что мне не придется передислоцировать приложение. Будут ли изменения постоянными в этих случаях?
Динамическое изменение уровня журнала log4j
Ответ 1
Изменение уровня журнала просто; изменение других частей конфигурации будет более глубоким.
LogManager.getRootLogger().setLevel(Level.DEBUG);
Изменения постоянны в жизни cyle Logger
. При повторной инициализации конфигурация будет считана и использована, поскольку установка уровня во время выполнения не сохраняет изменения уровня.
ОБНОВЛЕНИЕ:. Если вы используете Log4j 2, вы должны удалить вызовы setLevel
в документации , поскольку это может быть достигнуто посредством классы реализации.
Вызовы в logger.setLevel() или аналогичные методы не поддерживаются в API. Приложения должны удалить их. Эквивалентная функциональность приведенные в классах реализации Log4j 2, но могут приложение восприимчиво к изменениям в внутренних компонентах Log4j 2.
Ответ 2
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 (или JDK jconsole.exe), вы можете перенастроить каждый отдельный регистратор. Эти изменения не являются постоянными и будут reset для конфигурации, установленной в файле конфигурации после перезапуска приложения (сервера).
Self-Made
Как описано Aaron, вы можете установить уровень журнала программно. Вы можете реализовать его в своем приложении так, как вам бы хотелось. Например, у вас может быть графический интерфейс, в котором пользователь или администратор изменяет уровень журнала, а затем вызывает методы setLevel()
в журнале. Сохраняете ли вы настройки где-то или нет, зависит от вас.
Ответ 3
Log4j2 может быть настроен для обновления своей конфигурации путем сканирования файла log4j 2.xml (или эквивалентного) с заданными интервалами. Просто добавьте параметр monitorInterval в тег конфигурации. См. Строку 2 примера файла .xml log4j 2, в которой 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 или при использовании весенней загрузки. Здесь это выглядит несколько не по теме и, вероятно, заслуживает отдельного вопроса.
Ответ 4
С 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");
}
}
Просто вызовите это с соответствующим именем конфигурации и убедитесь, что вы помещаете шаблоны в путь к классам.
Ответ 5
Этот ответ не поможет вам динамически изменить уровень ведения журнала, вам необходимо перезапустить службу, если вы нормально перезапускаете службу, воспользуйтесь приведенным ниже решением.
Я сделал это, чтобы изменить уровень журнала 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>
Ответ 6
решение monitorInterval, разработанное Кимбаллом Робинсоном, хорошо работает в "spring-boot-starter-log4j2 2.1.5 RELEASE". (У меня недостаточно точек для голосования).
Ответ 7
Если вы хотите изменить уровень ведения журнала для всех регистраторов, используйте метод ниже. Это перечислит все регистраторы и изменит уровень ведения журнала на заданный уровень. Убедитесь, что у вас НЕ есть свойство 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);
}
}
Ответ 8
Вы можете использовать следующий фрагмент кода
((ch.qos.logback.classic.Logger)LoggerFactory.getLogger(packageName)).setLevel(ch.qos.logback.classic.Level.toLevel(logLevel));