Java Language Pitfall - Les frais généraux de création de messages de journal


Exemple

TRACE niveaux de journalisation TRACE et DEBUG sont là pour transmettre des informations détaillées sur le fonctionnement du code donné lors de l'exécution. La définition du niveau de journalisation au-dessus de ces paramètres est généralement recommandée. Toutefois, vous devez veiller à ce que ces instructions n’affectent pas les performances, même si elles sont apparemment désactivées.

Considérez cette déclaration de journal:

// Processing a request of some kind, logging the parameters
LOG.debug("Request coming from " + myInetAddress.toString() 
          + " parameters: " + Arrays.toString(veryLongParamArray));

Même lorsque le niveau de journalisation est défini sur INFO , les arguments transmis à debug() seront évalués à chaque exécution de la ligne. Cela le rend inutile inutilement à plusieurs égards:

  • Concaténation de String : plusieurs instances de String seront créées
  • InetAddress peut même faire une recherche DNS.
  • veryLongParamArray peut être très long - créer un String à partir de celui-ci consomme de la mémoire, prend du temps

Solution

La plupart des structures de journalisation permettent de créer des messages de journalisation à l'aide de chaînes de correctifs et de références d'objets. Le message de journal sera évalué uniquement si le message est réellement consigné. Exemple:

// No toString() evaluation, no string concatenation if debug is disabled
LOG.debug("Request coming from {} parameters: {}", myInetAddress, parameters));

Cela fonctionne très bien tant que tous les paramètres peuvent être convertis en chaînes en utilisant String.valueOf (Object) . Si le calcul du message de journal est plus complexe, le niveau de journalisation peut être vérifié avant la journalisation:

if (LOG.isDebugEnabled()) {
    // Argument expression evaluated only when DEBUG is enabled
    LOG.debug("Request coming from {}, parameters: {}", myInetAddress,
              Arrays.toString(veryLongParamArray);
}

Ici, LOG.debug() avec le Arrays.toString(Obect[]) coûteux Arrays.toString(Obect[]) est traité uniquement lorsque DEBUG est effectivement activé.