2017-05-25 3 views
-1

Nous utilisons java.util.loggingVarArgs à java.util.logging java 8

void log(Level level, Throwable thrown, Supplier<String> msgSupplier) 

et quelques méthodes pratiques comme

logp(Level level, String sourceClass, String sourceMethod, 
               String msg, Object params[]) 

Mais aucune méthode varargs. Comment venir? Est-ce sembler une amélioration future ou est-il une bonne raison de ne pas avoir quelque chose comme:

public void log(Level level, Throwable t, String msg, Object... params) { 
     // throw new RuntimeException("No yet impl"); 
     if (!isLoggable(level)) { 
      return; 
     } 
     LogRecord lr = new LogRecord(level, msg); 
     lr.setParameters(params); 
     if (t != null) { 
      lr.setThrown(t); 
     } 
     doLog(lr); 
    } 

J'ai créé aide:

public static void log(Logger logger, Level level, Throwable t, String msg, Object... params) { 
     // throw new RuntimeException("No yet impl"); 
     if (!logger.isLoggable(level)) { 
      return; 
     } 
     LogRecord lr = new LogRecord(level, msg); 
     lr.setParameters(params); 
     if (t != null) { 
      lr.setThrown(t); 
     } 
     logger.log(lr); 
    } 

aurait aimé avoir appelé dolog au lieu de journal dans la dernière ligne , mais doLog est une aide privée! Je ne sais pas pourquoi, car il n'y a aucun moyen pour moi de définir le paquet, etc - souhaite qu'il soit

public void doLog (LogRecord lr) au lieu de privé.

Quoi qu'il en soit, pour que nous fassions les mêmes choses, la méthode suivante nous permet d'utiliser notre propre méthode varargs?

// resource bundle and then call "void log(LogRecord)". 
private void doLog(LogRecord lr) { 
    lr.setLoggerName(name); 
    final LoggerBundle lb = getEffectiveLoggerBundle(); 
    final ResourceBundle bundle = lb.userBundle; 
    final String ebname = lb.resourceBundleName; 
    if (ebname != null && bundle != null) { 
     lr.setResourceBundleName(ebname); 
     lr.setResourceBundle(bundle); 
    } 
    log(lr); 
} 
+0

Ceci est basé sur l'opinion. 'java.util.logging' a été introduit dans Java 1.4. Pourquoi n'a-t-il pas profité de toutes les fonctionnalités des versions ultérieures de Java? Personne ne le sait sauf les auteurs du paquet. Probablement parce qu'ils ont de meilleures choses à faire. – Michael

+2

Ancienne API. Sun et Oracle ne voyaient aucun besoin de mise à jour. Vous pouvez envisager d'utiliser slf4j pour abstraire l'implémentation et obtenir des varargs. –

+0

Je seconde cela. SLF4J est la norme de l'industrie ces jours-ci. Il a une meilleure API et est entièrement compatible avec JUL. –

Répondre

3

Mais aucune méthode varargs. Comment venir? Cela semble-t-il comme une amélioration future ...

Il ya plusieurs demandes pour Use varargs in java.util.logging.Logger sur le site OpenJDK au fil des ans. L'API n'était pas vraiment maintained after JDK 5. La journalisation a été mise à jour dans le JDK 8 pour Lambda Expressions mais le guide de journalisation n'a pas été mis à jour pour les meilleures pratiques, juste quelques exemples dans le java.util.logging.Logger.

J'ai créé aide public static void log(Logger logger, Level level, Throwable t, String msg, Object... params)

Vous pouvez utiliser la version en How can I log with params with a thrown? car il conservera la classe correcte et nom de la méthode parce que l'appelant est toujours responsable de la publication enregistrement du journal.

est-il une bonne raison de ne pas avoir quelque chose comme log(Level level, Throwable t, String msg, Object... params)

Il est probablement plus sûr. Oracle ran a survey et il est clair qu'ils préféreraient que vous utilisiez une référence lambda ou une méthode avec l'une des méthodes log qui prend un Supplier<String> et s'appuient sur le java.util.Formatter fournissant le support de var-args.

} catch (IllegalArgumentException iae) { 
    logger.log(Level.SEVERE, iae,() -> String.format("%1$s is too many.", count)); 
} 

Sucrée syntaxe lambda sur les légumes!

+0

Oui J'ai testé un journal lorsque le niveau du journal est activé et désactivé, ce qui donne une fonction moins performante. J'aurais aimé avoir varargs. Nous prévoyons de déplacer cela vers l'API log4j2 bientôt, de toute façon le backend est log4j2 – tgkprog