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:
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.