Изменение глобальной настройки для экземпляров Logger
Я использую java.util.logging.Logger в качестве механизма ведения журнала для своего приложения. Каждый класс использует собственный логгер, т.е. Каждый класс имеет:
private final Logger logger = Logger.getLogger(this.getClass().getName());
Я хочу установить уровень ведения журнала для всех моих классов и иметь возможность его изменять (т.е. иметь настройку в одном месте). Есть ли способ сделать это, другой, который использует глобальную переменную Level
и вручную устанавливает для нее каждый регистратор?
Ответы
Ответ 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