SimpleFormatter ignorando a propriedade java.util.logging.SimpleFormatter.format

Estou usando o java.util.logging no GlassFish 4.

Estou definindo minha própria class para inicializar o LogManager definindo a propriedade System: -Djava.util.logging.config.class .

Minha class carrega o arquivo logging.properties , mescla-o com algum outro arquivo de propriedades e faz alguma substituição personalizada.

A seguir, a parte relevante do meu arquivo 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 

Estou usando o FileHandler padrão e configurando-o para usar o SimpleFormatter como formatador.

Mas o java.util.logging.SimpleFormatter.format String está sendo totalmente ignorado. Em vez disso, o SimpleFormatter usa seu formato padrão.

Onde foi que eu errei?

Nos documentos SimpleFormatter, você precisa testar as seguintes condições:

  1. Se essa propriedade não for definida ou a string de formato especificada for ilegal, o formato padrão será específico da implementação.
  2. Se essa propriedade for configurada nas propriedades de log e nas propriedades do sistema, a cadeia de caracteres de formato especificada na propriedade do sistema será usada.
  3. Essa propriedade pode ser definida no arquivo de configuração das propriedades de registro.

Aqui está um caso de teste de amostra que você pode converter e executar no 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()))); } 

Você também precisa verificar se o GlassFish substituiu seu SimpleFormatter pelo ‘com.sun.enterprise.server.logging.UniformLogFormatter’.

 private static void findFormatters() { final ArrayList handlers = new ArrayList<>(); final LogManager manager = LogManager.getLogManager(); synchronized (manager) { final Enumeration 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())); } } 

Se você precisar verificar o access quando as propriedades do sistema estiverem configuradas, poderá instalar um gerenciador de segurança com as opções -Djava.security.debug = access, stack para rastrear quando a propriedade estiver configurada.

Eu estava assumindo que a propriedade do sistema java.util.logging.config.file é definida pelo GF desde o início. Este não é o caso.

Após alguma investigação, percebi que o LogManager foi inicializado duas vezes. Na primeira vez que essa propriedade não existe, a segunda vez acontece.

Eu estava recebendo um erro na primeira boot porque estava contando com essa propriedade, portanto, não inicializei o LogManager corretamente, fazendo com que o SimpleFormatter usasse o formato padrão.

Eu consertei isso alterando meu código e não contando mais com a propriedade System. Isso resolveu o problema.

O GF ainda define a propriedade do sistema java.util.logging.config.file posteriormente.

Eu tive um problema semelhante, mas é fixo. Eu estava executando meu código a partir de um Ant build.xml e minha propriedade java.util.logging.FileHandler.formatter.format não estava sendo aplicada a partir do meu arquivo myLogging.properties, embora outras propriedades tenham sido lidas e aplicadas.

Você está usando uma versão do JRE <1.6.32? O Java Bug 55052 indica que a propriedade java.util.logging.FileHandler.formatter.format não é corretamente lida no arquivo de propriedades e aplicada a versões anteriores do JRE.

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

Eu ainda compilo esse projeto com o JDK 1.6.24, mas o execute com o JDK 1.7.0.6, e a formatação é corretamente lida e aplicada ao meu logger.