在LogManager中,方法getLoggerNames似乎只返回已经实际实例化的记录器。但是,记录属性可以保留"保留"直到具有给定名称的记录器被实例化。
有没有办法获取我们有设置的记录器的完整列表,或者至少获取当前属性set / map,而无需从我自己的代码中读取原始文件?
答案 0 :(得分:2)
JDK-8033661: readConfiguration does not cleanly reinitialize the logging system,其中添加了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及更早版本,您必须执行以下操作之一:
阅读属性文件的简便方法是使用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) {
}