Странное поведение глобальной настройки уровня ведения журнала java .util.logging - PullRequest
0 голосов
/ 16 марта 2020

У меня довольно простая конфигурация logging.properties:

handlers = java.util.logging.ConsoleHandler
.level = INFO
java.util.logging.ConsoleHandler.level     = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] [%4$s] %5$s %n

Если для .level установлено значение INFO, я получил все свои сообщения INFO и более поздние сообщения, как и ожидалось. Но если я установлю .level в FINE, FINER, FINEST или ALL. Ни одно из сообщений из моего кода не отображается (ни ПРЕДУПРЕЖДЕНИЕ, ни СЕРЬЕЗНОЕ). Все "внутренние" FINE, FINER et c. сообщения отображаются корректно, но не из моего кода.

Я попытался добавить определенный уровень c для своих пакетов:

org.example.mypackage.level = INFO

, но это никак не отразилось на проблеме. Как только глобальный .level установлен на FINE или ниже или ALL, ни одно из сообщений, созданных моим кодом, не отображается независимо от их уровня.

Что здесь не так? Есть ли такое правило (я ничего не нашел в Интернете).

Я запускаю свои тесты, используя maven:

mvn test -Djava.util.logging.config.file=/path/to/my/logging.properties

И мой код, который создает сообщения журнала, выглядит следующим образом:

public class MyClass {
    private static final logger = Logger.getLogger(MyClass.class.getName());

    public void someMethod() {
        logger.log(Level.WARNING, "Warning message");
    }
}

ОБНОВЛЕНИЕ: Это должно быть связано с maven. Как только приложение скомпилировано и запущено само по себе (чисто java SE - без сервера приложений, без контейнеров), проблема больше не является проблемой. Только при запуске с использованием mvn ... ведение журнала ведет себя так, как описано выше.

1 Ответ

0 голосов
/ 17 марта 2020

Это не связано с Maven. Скорее всего, это связано с тем, что org.example.mypackage регистратор не существует, когда вы запускаете свои модульные тесты .

Добавьте в верхнюю часть свой код модульного теста:

private static final Object PINS = new Object[]{Logger.getLogger("org.example.mypackage")};

Как объяснено в ссылке выше, это заставит создать регистратор, который теперь является новым родителем всех дочерних регистраторов в вашем приложении. Это позволяет logging.properties работать. Когда вы запускаете свое полное приложение, у вас, вероятно, есть код, который создает этот регистратор пакетов, поэтому все это работает.

...