2016-05-06 1 views
1

В LogManager метод getLoggerNames, похоже, возвращает только те журналы, которые были фактически созданы. Однако свойства регистрации могут храниться «в резерве» до тех пор, пока не будет создан экземпляр регистратора с заданным именем.Есть ли способ получить java.util.logging.LogManager для отчета обо всех регистраторах, для которых указаны свойства или для доступа к свойствам?

Есть ли способ получить полный список регистраторов, для которых у нас есть настройки, или, по крайней мере, получить текущие свойства/карту, не читая исходный файл из моего собственного кода?

ответ

2

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 и старше, вы должны выполнить одно из следующих действий:

  1. Прочтите файл logging.properties самостоятельно.
  2. Переопределите LogManager.readConfiguration(InputStream) для захвата байтов из потока и создания собственного объекта свойств из потока. Без аргумента readConfiguration вызовет этот метод, поэтому данный поток будет файлом свойств в виде байтов.
  3. 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) { 
    } 
Смежные вопросы