java.util.logging.Logger имеет другой уровень, чем его корневой Logger
В моем приложении в какой-то момент я установил корневой логгер java.util.logging
и все это обработчики Level.FINEST
как это:
Logger.getLogger("").setLevel(Level.FINEST);
for (Handler handler : Logger.getLogger("").getHandlers()) {
handler.setLevel(Level.FINEST);
}
Позже я создам класс Logger следующим образом:
private static final Logger JAVA_LOG = Logger.getLogger(MyClass.class.getName());
Теперь этот уровень регистраторов INFO
(который, по-видимому, используется по умолчанию для JUL), в то время как его уровень Loggers root правильно установлен на FINEST
, Разве установка уровня для корневого регистратора не должна также устанавливать уровень для всех дочерних регистраторов корневого регистратора? Я делаю что-то не так при получении класса Logger?
2 ответа
Разве установка уровня для корневого регистратора не должна также устанавливать уровень для всех дочерних регистраторов корневого регистратора?
Нет, очевидно, вы создаете новый объект Logger. Javadoc для getLogger гласит:
Если новый регистратор создан, его уровень журнала будет настроен на основе конфигурации LogManager, и он также будет настроен на отправку выходных данных журнала обработчикам его родителя.
Обратите внимание, что даже если ранее существовал объект Logger с таким же именем, вы не можете полагаться на getLogger
вернуть тот же объект, который мог бы быть собран мусором, если нет строгой ссылки на объект.
Если ваша цель состоит в том, чтобы создать все объекты Logger в вашем проекте с одним и тем же уровнем журнала, вы должны делать это не программно, а по конфигурации. Вот где java.util.logging
пригодится. Общее преимущество заключается в том, что вы можете запускать свое приложение на разных уровнях журнала, даже не меняя ни одной строки кода.
Просто отредактируйте ваш конфигурационный файл (который по сути является вышеупомянутым LogManager configuration
). Это называется logging.properties
и находится в вашем каталоге JRE. Там вы можете отредактировать последний абзац и настроить уровни журнала для всего проекта или суженного класса:
############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################
myProject.MyClass.level = FINE
myProject.MyOtherNotSoImportantClass.level = INFO
mySecondProject.MainClass.level = NONE
Еще лучшим решением является копирование logging.properties
в каталог вашего проекта и вызвать ваше приложение с
java -Djava.util.logging.config.file=./src/test/resources/logging.properties
The accepted answer is completely valid and I totally agree with it.
That said, I would like to add this tidbit of knowledge... do with it what you will.
private static final Logger JAVA_LOG = Logger.getLogger(MyClass.class.getName());
static { JAVA_LOG.setLevel(null); }
This will tell it to inherit its ancestors log level. Logger.setLevel() javadoc
If the new level is null, it means that this node should inherit its level from its nearest ancestor with a specific (non-null) level value.