java.util.logging.Logger имеет другой уровень, чем его корневой Logger - PullRequest
0 голосов
/ 20 февраля 2019

В моем приложении в какой-то момент я установил для корневого 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), в то время как его корневой уровень регистраторов правильно установлен на FINEST.Разве установка уровня для корневого регистратора не должна также устанавливать уровень для всех дочерних регистраторов корневого регистратора?Я делаю что-то не так при получении класса Logger?

1 Ответ

0 голосов
/ 20 февраля 2019

Не следует ли устанавливать уровень для корневого регистратора, а также устанавливать уровень для всех дочерних регистраторов корневого регистратора?

Нет, очевидно, вы создаете новый объект регистратора. 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
...