Comment améliorer le mécanisme de journalisation avec Java8s lambdas

Comment est-il possible, pour améliorer votre mécanisme de journalisation, en n'ayant pas la surcharge de concaténations de chaîne?

Considérons l'exemple suivant:

import java.util.logging.Level;
import java.util.logging.Logger;

public class LoggerTest {
    public static void main(String[] args) {
        //get logger
        Logger log = Logger.getLogger(LoggerTest.class.getName());

        //set log level to INFO (so fine will not be logged)
        log.setLevel(Level.INFO);

        //this line won't log anything, but will evaluate the getValue method
        log.fine("Trace value: " + getValue());
    }

    //example method to get a value with a lot of string concatenation
    private static String getValue() {
        String val = "";

        for (int i = 0; i < 1000; i++) {
            val += "foo";
        }

        return val;
    }
}

La méthode log log.fine(...) sera pas enregistrer quoi que ce soit, parce que le niveau de journalisation est défini à INFO. Le problème, c'est que la méthode getValue seront évalués de toute façon.

Et c'est un gros problème de performances dans les grandes applications avec beaucoup d'instructions de débogage.

Alors, comment résoudre ce problème?

Utiliser les slf4j?
Merci pour l'information! Mais, pensez à vérifier si nous sommes en train de dire log.fine("Trace value: {}", getValue()); il évalue également les getValue méthode dans tous les cas, n'est-ce pas?
oui en effet je pensais que vous étiez juste la concaténation de deux chaînes - je n'avais pas réalisé que c'était de 1000 chaînes!
Dire aussi utiliser slf4j. Pour les 99% de l'exploitation forestière, il va faire de la sémantique 'enregistreur.debug("Regarde-moi maman: {}",me)' . Mais bien sûr, si vous savez que vous allez à la concaténation d'une chaîne d'un millier de fois, puis l'envelopper dans un si(logger.isDebug()).. . Les lambdas est sympa mais je ne suis pas sûr que ça ajoute vraiment quelque chose d'utile et plus efficace.
Pourquoi ne pas simplement utiliser java.util.logging.Logger.info(Fournisseur<String>) et être fait avec elle une fois pour toutes?

OriginalL'auteur bobbel | 2014-02-13