web-dev-qa-db-fra.com

Est-il nécessaire d'effectuer une vérification if (log.isDebugEnabled ()) {...}?

est-il nécessaire de faire une vérification if explicite (log.isDebugEnabled ()) {...}?

Je veux dire que j'ai vu un article mentionner que log.debug ("quelque chose") fait un appel implicite pour voir si la journalisation en mode débogage a été activée, avant de procéder à la journalisation. Suis-je en train de manquer quelque chose ou y a-t-il une étape intermédiaire à effectuer avant de l'utiliser?

Merci!

log.debug("ResultSet rs is retrieved from OracleTypes");

contre

if(log.isDebugEnabled()){
     log.debug("ResultSet rs is retrieved from OracleTypes");
}

Edit: A écrit sur ceci: http://Java.sg/whether-to-do-a-isdebugenabled-checking-before-printing-out-your-log-statement/

44
Oh Chin Boon

La déclaration:

if(log.isDebugEnabled()){

Est utilisé uniquement pour des raisons de performances. Son utilisation est facultative car elle est appelée par la méthode log en interne.

Mais maintenant, vous demandez si cette vérification est effectuée en interne, alors pourquoi devrais-je l'utiliser? C'est très simple: si vous enregistrez quelque chose d'aussi simple que ceci:

log.debug("ResultSet rs is retrieved from OracleTypes");

Ensuite, vous n'avez pas besoin de faire de vérification. Si vous composez une chaîne à enregistrer à l'aide de l'opérateur d'ajout (+) comme ceci:

log.debug("[" + System.getTimeInMillis() + "] ResultSet rs is retrieved from OracleTypes");

Dans ce cas, vous devez vérifier si le journal est activé ou non, car si ce n'est pas le cas, même si le journal n'est pas créé, la composition de la chaîne l'est. Et je dois vous rappeler que l'utilisation de l'opérateur "+" pour concaténer des chaînes est très inefficace.

79
Filipe Palrinhas

Je sais que c'est vieux, mais pour tous ceux qui trouvent ça ...

Si vous utilisez SLF4J, vous pouvez éviter l'appel isDebugEnabled (), en utilisant la mise en forme de la messagerie.

Par exemple, au lieu de:

Object entry = new SomeObject();
logger.debug("The entry is " + entry + ".");

Utilisation:

Object entry = new SomeObject();
logger.debug("The entry is {}.", entry);

La mise en forme du message ne sera évaluée que si le débogage est activé.

Ainsi, pour les cas simples, vous pouvez éviter isDebugEnabled ().

Mais dans le cas où la construction d'un des paramètres pourrait être coûteuse, vous voudriez toujours utiliser isDebugEnabled () (même avec SLF4J).

Par exemple:

if (logger.isDebugEnabled()) {
    logger.debug("Here is the SQL: {}", sqlWrapper.buildSQL());  // assume buildSQL() is an expensive operation
}

Dans ce cas, vous ne voulez pas évaluer buildSQL () à moins que le débogage ne soit réellement activé.

Avec SLF4J, il y a un débat sur son utilisation toujours vs son utilisation sélective. Cela se résume vraiment à vos préférences personnelles. Vous voudrez peut-être l'utiliser partout, pour vous prémunir contre un autre développeur (inconsciemment) changeant votre message de journal en quelque chose de plus complexe/coûteux à l'avenir.

43
yngwietiger

Les versions récentes de Logger rationalisent cela, il n'y a donc pas beaucoup de différence.

La plus grande différence est que vous n'avez pas à créer les éléments à enregistrer - parfois, il y a beaucoup d'ajouts de chaînes en cours.

8
Bohemian

J'ai vérifié avec le code ci-dessous en effectuant la vérification dans mon code par rapport à ne pas effectuer la vérification. Fait intéressant, si la vérification est effectuée dans notre code pour une instruction de 4 journaux exécutée un million de fois, cela prend 400 ms supplémentaires. J'utilise SLF4J 1.6.6. Si vous pouvez vous permettre de perdre 400 ms par million de demandes, vous n'avez pas besoin du contrôle.

    long startTime = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        if (logger.isTraceEnabled()) {
            logger.trace(request.getUserID());
            logger.trace(request.getEntitlementResource().getResourceString());
            logger.trace(request.getEntitlementResource().getActionString());
            logger.trace(request.getContextMap());
        }
    }
    long endTime = System.currentTimeMillis();
    logger.fatal("With Check Enabled : " + (endTime - startTime) + " ms");

    startTime = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {

        logger.trace(request.getUserID());
        logger.trace(request.getEntitlementResource().getResourceString());
        logger.trace(request.getEntitlementResource().getActionString());
        logger.trace(request.getContextMap());

    }
    endTime = System.currentTimeMillis();
    logger.fatal("With Check Disabled : " + (endTime - startTime)  + " ms");

---PRODUCTION---

* 2016-01-07 10: 49: 11,501 ERREUR [: http-bio-8080-exec-3] [com.citi.cmb.entitlement.service.EntitlementServiceImpl] [] - Avec vérification activée: 661 ms

07/01/2016 10: 49: 57,141 ERREUR [: http-bio-8080-exec-3] [com.citi.cmb.entitlement.service.EntitlementServiceImpl] [] - Avec vérification désactivée: 1043 ms

7
Ashraff Ali Wahab

La raison pour laquelle cela est fait est pour des raisons de performances. Si vous vérifiez d'abord, le log.debug(... l'instruction ne doit pas être évaluée.

Il est en effet fonctionnellement le même.

1
wjans