2014-09-21 2 views
0

Я хочу, чтобы мой регистратор с FileHandler использовал настройки, определенные в моем файле конфигурации. Должен ли я использовать Logger.getLogger или Logger.addHandler (new FileHandler()) после того, как я использовал LogManager.readConfiguration (InputStream) или еще больше? Другими словами, каков порядок, в котором я должен делать следующие 3 вещи (getLogger, addHandler, readConfigurations), полагая, что он имеет отношение к порядку и не что-то еще?Как заставить Logger использовать конфигурации из LogManager.readConfigurations?

Мне не удалось найти много примеров этого, и те, которые я нашел, имели LogManager.readConfiguration после Logger.getLogger, но это, похоже, не работает.

Вот конфигурационный файл:

handlers = java.util.logging.FileHandler 

.level = ALL 

# Default 
java.util.logging.FileHandler.limit = 10000000 
java.util.logging.FileHandler.count = 10 
java.util.logging.FileHandler.append = true 
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter 
java.util.logging.FileHandler.level = FINE 

EDIT: Вот часть кода, относящегося к конфигурации.

String configFilename = "C:\\Users\\dalawh\\Documents\\config.properties"; 
LogManager manager = LogManager.getLogManager(); 
String property = manager.getProperty(this.getClass().getPackage().getName()); //DEBUGGING 
LogManager.getLogManager().readConfiguration(new FileInputStream(configFilename)); 
String property2 = manager.getProperty(this.getClass().getPackage().getName()); //DEBUGGING 

Logger logger = java.util.logging.Logger.getLogger(this.getClass().getPackage().getName()); 
String property3 = manager.getProperty(this.getClass().getPackage().getName()); //DEBUGGING 
String filename = "C:\\Users\\dalawh\\Documents\\log.log"; 
this.fileHandler = new FileHandler(filename); 
this.logger.addHandler(this.fileHandler); 

ответ

1

Относительно этого является: configure Logger via global config file.

Вызов LogManager.readConfiguration определит, что вернет logger.getLogger. Если вы определяете обработчик в вашем файле свойств getLogger, вам, возможно, не придется добавлять обработчик позже. Так что вы ищете:

  1. LogManager.readConfiguration
  2. Logger.getLogger и store a strong reference to it
  3. Создать новый обработчик
  4. Logger.addHandler

Если определить java.util.logging.config.file как системного свойства в вашем сценарии запуска, вам не нужно писать какой-либо код.

-Djava.util.logging.config.file="path to file"

Для получения более подробной информации читайте документацию на уровне LogManager класса.

Если вы не можете определить это свойство при запуске, вы можете обратиться к методу LogManager.readConfiguration(InputStream) для выполнения настройки. Вам не нужно вызывать какие-либо другие методы, если вы не используете JDK-8033661 readConfiguration does not cleanly reinitialize the logging system или JDK-5035854 LogManager.readConfiguration does not properly modify existing loggers.

Если ни одна из этих опций не работает, вы можете прибегнуть к простому регистратору и при необходимости вызвать методы настройки.

Чтобы решить проблему, добавьте следующее:

String configFilename = "C:\\Users\\dalawh\\Documents\\config.properties"; 
System.out.println(new File(configFilename).length()); 
LogManager manager = LogManager.getLogManager(); 
LogManager.getLogManager().readConfiguration(new FileInputStream(configFilename)); 
String property = manager.getProperty("java.util.logging.FileHandler.formatter"); //DEBUGGING 
System.out.println(property); 
  1. Если java.util.logging.SimpleFormatter печатается, то вы знаете, что вы haved настроили LogManager.
  2. Если ничего не напечатано, исключение было выбрано или вы установили пустое значение в свой файл свойств.
  3. Если NULL напечатан, ваш конфигурационный файл является неправильным или что-то сбрасывает LogManager.

Вот простой тест, подтверждающий, что работает менеджер журналов.

public class LogManagerTest { 

    public static void main(String[] arg) throws IOException { 
     read(LogManager.getLogManager(), create()); 
     FileHandler h = new FileHandler(); 
     h.close(); 
     System.out.println(h.getFormatter()); 
    } 

    private static Properties create() { 
     Properties props = new Properties(); 
     props.setProperty("java.util.logging.FileHandler.formatter", 
       "java.util.logging.SimpleFormatter"); 
     return props; 
    } 

    private static void read(LogManager manager, Properties props) throws IOException { 
     final ByteArrayOutputStream out = new ByteArrayOutputStream(512); 
     props.store(out, "No comment"); 
     manager.readConfiguration(new ByteArrayInputStream(out.toByteArray())); 
    } 
} 
+0

Благодарим за дополнительную информацию, но это не совсем то, что я ищу. Я уже использую LogManager.readConfiguration (InputStream), чтобы прочитать конфигурацию из файла, который у меня есть, который я указал в InputStream. Мой вопрос в том, каков порядок, в котором я должен делать следующие 3 вещи (getLogger, addHandler, readConfigurations), предполагая, что он имеет отношение к порядку и не что-то еще? – dalawh

+0

@dalawh Я отредактировал ответ. – jmehrens

+0

Логгер по-прежнему использует конфигурацию по умолчанию. Я прочитал конфигурацию из файла, который у меня есть, затем я получил Logger, а затем добавил FileHandler в Logger, но Logger все еще регистрировался в xml вместо того, чтобы использовать простой форматтер, как указано в файле конфигурации. – dalawh

Смежные вопросы