JDK-8033661: readConfiguration does not cleanly reinitialize the logging system был исправлен в версии Java версии 9, которая добавила метод LogManager.updateConfiguration(Function<String,BiFunction<String,String,String>>). В документации этот метод будет считывать ключи конфигурации и возвращает функцию, возвращаемое значение которой будет применено к полученной конфигурации. Подавая функцию идентичности можно перебирать существующие конфигурационные ключи вместо фактических созданных лесорубов, делая что-то вроде следующего:
Function<String, BiFunction<String,String,String>> consume
= new Function<String, BiFunction<String,String,String>>() {
@Override
public BiFunction<String, String, String> apply(final String k) {
return new BiFunction<String, String, String>() {
@Override
public String apply(String o, String n) {
System.out.println(k +"="+ o);
return o;
}
};
}
};
LogManager.getLogManager().updateConfiguration(consume);
Для JDK 8 и старше, вы должны выполнить одно из следующих действий:
- Прочтите файл logging.properties самостоятельно.
- Переопределите LogManager.readConfiguration(InputStream) для захвата байтов из потока и создания собственного объекта свойств из потока. Без аргумента readConfiguration вызовет этот метод, поэтому данный поток будет файлом свойств в виде байтов.
- Resort to reflection (yuck!).
Простым способом чтения файла свойств является использование класса java.util.Properties.
final Properties props = new Properties();
try {
String v = System.getProperty("java.util.logging.config.file");
if (v == null) {
v = System.getProperty("java.home") + "/lib/logging.properties";
}
final File f = new File(v).getCanonicalFile();
final InputStream in = new FileInputStream(f);
try {
props.load(in);
} finally {
in.close();
}
} catch (final RuntimeException permissionsOrMalformed) {
} catch (final Exception ioe) {
}