有没有办法让java.util.logging.LogManager报告指定了属性的所有记录器或访问属性?

时间:2016-05-06 19:39:15

标签: java java.util.logging

在LogManager中,方法getLoggerNames似乎只返回已经实际实例化的记录器。但是,记录属性可以保留"保留"直到具有给定名称的记录器被实例化。

有没有办法获取我们有设置的记录器的完整列表,或者至少获取当前属性set / map,而无需从我自己的代码中读取原始文件?

1 个答案:

答案 0 :(得分:2)

在Java版本9中修复了

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及更早版本,您必须执行以下操作之一:

  1. 自己阅读logging.properties文件。
  2. 覆盖LogManager.readConfiguration(InputStream)以从流中捕获字节,并从流中创建自己的Properties对象。 no arg readConfiguration将调用此方法,因此给定的流是属性文件作为字节。
  3. 诉诸于反思(哎呀!)。
  4. 阅读属性文件的简便方法是使用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) {
        }