Подтвердить что ты не робот

Изменение глобальной настройки для экземпляров Logger

Я использую java.util.logging.Logger в качестве механизма ведения журнала для своего приложения. Каждый класс использует собственный логгер, т.е. Каждый класс имеет:

private final Logger logger = Logger.getLogger(this.getClass().getName());

Я хочу установить уровень ведения журнала для всех моих классов и иметь возможность его изменять (т.е. иметь настройку в одном месте). Есть ли способ сделать это, другой, который использует глобальную переменную Level и вручную устанавливает для нее каждый регистратор?

4b9b3361

Ответ 1

Как сказал Andy , в большинстве случаев вы должны использовать файл свойств и аргумент VM, поэтому он не зависит от вашего кода.

Но если вы хотите по какой-то причине пойти по программному пути (у меня тоже была веская причина в одном случае), вы также можете получить доступ к обработчикам:

Logger rootLogger = LogManager.getLogManager().getLogger("");
rootLogger.setLevel(Level.INFO);
for (Handler h : rootLogger.getHandlers()) {
    h.setLevel(Level.INFO);
}

EDIT Я добавил setLevel в корневой журнал, как указал поисковик27 в .

Обработчики - это обработчики файлов или консолей, которые вы настраиваете с помощью свойств или программно тоже.

Или измените фильтры следующим образом:

Logger rootLogger = LogManager.getLogManager().getLogger("");
rootLogger.setFilter(new Filter() {
    @Override
    public boolean isLoggable(LogRecord record) {
            return "something".equals(record.getLoggerName());
    }
});

Ответ 2

Один простой способ - использовать файл свойств журнала, включив этот аргумент VM:

-Djava.util.logging.config.file="logging.properties" 

где "logging.properties" - это путь к файлу, содержащему конфигурацию ведения журнала. Для относительных путей рабочий каталог процесса является значительным.

В этом файле введите следующую строку:

.level= INFO

Этот параметр устанавливает глобальный уровень, который может быть переопределен для определенных обработчиков и регистраторов. Например, определенный уровень регистратора можно переопределить следующим образом:

 com.xyz.foo.level = SEVERE

Вы можете получить шаблон для файла свойств журнала из jre6\lib\logging.properties.

Ответ 3

Поэтому я не совсем люблю ответы на все вопросы, поэтому я собираюсь перезвонить.

Использование файла конфигурации

Вы видите много ответов, в которых говорится о том, что вы используете файл конфигурации, потому что это лучшая практика. Я хочу лучше объяснить, как это сделать программно, но прежде чем я это сделаю, я хочу сказать, что я могу видеть, откуда они берутся, и в настроении быть объективным, я немного просветю вас (особенно потому, что никто не говорит почему его плохая практика). Я действительно хочу поделиться тем, что кто-то сказал в отдельном ответе StackOverflow, который связан с установкой уровня регистратора программно (Почему сообщения журнала Level.FINE не отображаются?)

Это не рекомендуется, поскольку это приведет к переопределению глобальной конфигурации. Использование этого во всей базе кода приведет к возможно неуправляемой конфигурации регистратора.

В этой заметке я думаю, что у Энди Томаса есть хороший ответ, связанный с тем, что он не выполняет программно.

Программная установка уровня

Говоря об этом, я хочу немного подробнее остановиться на нем программно, потому что я думаю, что он использует его.

Представьте себе сценарий, в котором вы пишете что-то с интерфейсом командной строки, и у вас есть возможность указать многословие вашего исполнения или даже куда оно идет (как в динамических файлах журнала). Возможно, я ошибаюсь, но вы, вероятно, не захотите сделать это статически в файле .conf. Тем более, если вы не хотите, чтобы ваша пользовательская база отвечала за настройку этих вещей (по любой произвольной причине) в файле конфигурации. Однако это происходит за счет вышеуказанной цитаты. Вот пример того, как вы можете делать это программно, сохраняя все существующие обработчики на любом уровне, на котором они уже есть, и только FileHandler принимают новый уровень:

public static void setDebugLevel(Level newLvl) {
    Logger rootLogger = LogManager.getLogManager().getLogger("");
    Handler[] handlers = rootLogger.getHandlers();
    rootLogger.setLevel(newLvl);
    for (Handler h : handlers) {
        if(h instanceof FileHandler)
            h.setLevel(newLvl);
    }
}

Я хотел расширить это, по принятому ответу по одной причине в частности. При программировании вы просто хотите удостовериться, что вы установили уровень для регистратора и обработчика (ов). Как он работает, будет ли он проверяться, слишком ли низкий запрос для регистратора, и если он его отбросит. Тогда обработчик имеет одинаковую проверку, поэтому вам нужно убедиться, что оба регистратора и обработчики установлены на нужный вам уровень.

Ответ 4

One-liner Java 8 подходит для morja answer:

Arrays.stream(LogManager.getLogManager().getLogger("").getHandlers()).forEach(h -> h.setLevel(Level.INFO));

Ответ 5

Вы должны сделать это в конфигурации java.util.logging, а не в коде.

my.app.package.level=SEVERE