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

Is there a way to get java.util.logging.LogManager to report all loggers for which properties are specified or to access the properties?

在 LogManager 中,方法 getLoggerNames 似乎只对 return 已经实际实例化的记录器显示。但是,可以保留日志记录属性 "in reserve" 直到具有给定名称的记录器被实例化。

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

JDK-8033661: readConfiguration does not cleanly reinitialize the logging system was fixed in Java version 9 which added the LogManager.updateConfiguration(Function<String,BiFunction<String,String,String>>) 方法。根据文档,此方法将读取配置键和 returns 一个函数,其返回值将应用于生成的配置。通过提供身份函数,您可以通过执行以下操作来迭代现有配置键而不是实际创建的记录器:

    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 对象。无参数 readConfiguration 将调用此方法,因此给定流是字节形式的属性文件。
  3. 求助于反思(讨厌!)。

读取属性文件的简单方法是使用 java.util.Properties class。

    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) {
    }