2014-08-27 2 views
1

Я использую java.util.logging на GlassFish 4.SimpleFormatter игнорируя свойство java.util.logging.SimpleFormatter.format

я определяю свой собственный класс, чтобы инициализировать LogManager путем определения свойства системы: -Djava.util.logging.config.class.

Мой класс загружает файл logging.properties, объединяет его с каким-либо другим файлом свойств и выполняет некоторую пользовательскую замену.

Ниже приводится соответствующая часть моего logging.properties файла:

java.util.logging.FileHandler.pattern=C:/Work/server/glassfish/domains/domain1/logs/JMSFileHandler%g.log 
java.util.logging.FileHandler.limit=2000000 
java.util.logging.FileHandler.count=20 
java.util.logging.FileHandler.append=true 
java.util.logging.FileHandler.level=ALL 
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter 
java.util.logging.SimpleFormatter.format=%1$tY:%1$tm:%1$td %1$tH:%1$tM:%1$tS|%4$s: %2$s%n%5$s%n%6$s%n 

Я использую стандартный FileHandler и настройка его для использования в качестве SimpleFormatter форматере.

Но java.util.logging.SimpleFormatter.format Строка полностью игнорируется. Вместо этого SimpleFormatter использует свой формат по умолчанию.

Где я ошибся?

ответ

1

Я предполагал, что системное свойство java.util.logging.config.file задано GF с самого начала. Это не тот случай.

После некоторого расследования я понял, что LogManager инициализируется два раза. В первый раз это свойство не существует, во второй раз.

Я получил ошибку при первой инициализации, потому что я рассчитывал на это свойство, поэтому я не инициализировал LogManager должным образом, в результате чего SimpleFormatter использовал формат по умолчанию.

Я исправил это, изменив свой код и больше не рассчитывая на его свойство System. Это решило проблему.

GF по-прежнему устанавливает системное свойство java.util.logging.config.file позже.

+0

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

2

Из SimpleFormatter документов вы должны проверить наличие следующих условий:

  1. Если это свойство не определенно или данная строка формата является незаконной, формат по умолчанию зависит от конкретной реализации.
  2. Если это свойство установлено как в свойствах ведения журнала, так и в свойствах системы, будет использоваться строка формата, указанная в системном свойстве.
  3. Это свойство может быть определено в файле конфигурации свойств ведения журнала.

Вот пример тестового примера, который вы можете конвертировать и запускать под GlassFish.

public static void main(String[] args) throws Exception { 
    final String format = "%1$tY:%1$tm:%1$td %1$tH:%1$tM:%1$tS|%4$s: %2$s%n%5$s%n%6$s%n"; 
    final String key = "java.util.logging.SimpleFormatter.format"; 
    test(format); 
    test(System.getProperty(key, format)); 
    test(LogManager.getLogManager().getProperty(key)); 
    FileHandler f = new FileHandler(); 
    System.out.println(f.getFormatter()); 
    f.close(); 
} 

private static void test(String format) { 
    LogRecord record = new LogRecord(Level.INFO, ""); 
    System.out.println(String.format(format, 
         new java.util.Date(record.getMillis()), 
         record.getSourceClassName(), 
         record.getLoggerName(), 
         record.getLevel().getLocalizedName(), 
         record.getMessage(), 
         String.valueOf(record.getThrown()))); 
} 

Кроме того, необходимо проверить, если GlassFish заменить ваш SimpleFormatter с 'com.sun.enterprise.server.logging.UniformLogFormatter'.

private static void findFormatters() { 
    final ArrayList<Handler> handlers = new ArrayList<>(); 
    final LogManager manager = LogManager.getLogManager(); 
    synchronized (manager) { 
     final Enumeration<String> e = manager.getLoggerNames(); 
     while (e.hasMoreElements()) { 
      final Logger l = manager.getLogger(e.nextElement()); 
      if (l != null) { 
       Collections.addAll(handlers, l.getHandlers()); 
      } 
     } 
    } 

    for (Handler h : handlers) { 
     Formatter f = h.getFormatter(); 
     System.out.println(h.getClass().getName() + "=" + (f == null ? "" : f.getClass().getName())); 
    } 
} 

Если вам необходимо проверить доступ, когда свойства системы установлены вы можете установить менеджер безопасности с -Djava.security.debug=access,stack вариантов трассировки, когда свойство устанавливается.

+0

> Вам также необходимо проверить, заменил ли GlassFish ваш SimpleFormatter на «com.sun.enterprise.server.logging.UniformLogFormatter». Нет, это не так. – Roland

+0

Нет Системное свойство, называемое «java.util.logging.SimpleFormatter.format» – Roland

+0

Свойство LogManager «java.util.logging.SimpleFormatter.format» - это именно тот формат, который я указал. Тем не менее статический 'java.util.logging.SimpleFormatter.format' является форматом по умолчанию String, а не тем, который я указал. – Roland

0

У меня была аналогичная проблема, но она исправлена. Я запускал свой код из Ant build.xml, а мое свойство java.util.logging.FileHandler.formatter.format не применялось к моему файлу myLogging.properties, хотя были прочитаны и применены другие свойства.

Вы используете версию JRE < 1.6.32? Java Bug 55052 указывает, что свойство java.util.logging.FileHandler.formatter.format неправильно считывается из файла свойств и применяется для более ранних версий JRE.

См: https://issues.apache.org/bugzilla/show_bug.cgi?id=55052

Я до сих пор скомпилировать этот проект с JDK 1.6.24, но запустить его с JDK 1.7.0.6 и форматирование правильно читать и применять к моему регистратору.

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