Si vous vous connectez à partir du code de la bibliothèque?

38

Si je développe une bibliothèque Java, est-ce une bonne pratique d’émettre des instructions de journal à partir du code de la bibliothèque?

La journalisation dans la bibliothèque rendra le débogage et le dépannage plus transparents. Par contre, je n'aime pas ajouter des instructions de journalisation à mon code de bibliothèque. Y a-t-il des implications de performances à prendre en compte?

danois
la source

Réponses:

33

Oui tu devrais. L'utilisation d'une façade de journalisation telle que SLF4J vous offre une flexibilité sans surcharger vos utilisateurs avec un cadre de journalisation particulier.

Les auteurs de composants et de bibliothèques largement distribués peuvent coder contre l'interface SLF4J afin d'éviter d'imposer un cadre de journalisation à l'utilisateur final du composant ou de la bibliothèque. Ainsi, l'utilisateur final peut choisir l'infrastructure de journalisation souhaitée au moment du déploiement en insérant la liaison slf4j correspondante sur le chemin d'accès aux classes, laquelle peut être modifiée ultérieurement en remplaçant une liaison existante par une autre sur le chemin d'accès aux classes, puis en redémarrant l'application. Cette approche s’est révélée simple et très robuste.

De plus, si vos utilisateurs n'incluent pas de fichier jar SLF4J (figurant dans le guide de l' utilisateur ):

À partir de la version 1.6.0 de SLF4J, si aucune liaison n'est trouvée sur le chemin de classe, slf4j-api utilisera par défaut une implémentation sans opération, qui ignore toutes les demandes de journal.

Si vous êtes préoccupé par les conséquences de la journalisation sur les performances, consultez cette entrée de la FAQ SLF4J . L'idée est que vous fournissiez des paramètres pour consigner les instructions au lieu de les ajouter à une chaîne inline:

Les deux lignes suivantes donneront exactement le même résultat. Toutefois, la seconde forme surperformera la première par un facteur d'au moins 30, dans le cas d'une instruction de journalisation désactivée.

logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

SLF4J est-il encore une autre façade d’exploitation forestière?

Sur le plan conceptuel, SLF4J est très similaire à JCL. En tant que tel, cela peut être considéré comme une autre façade forestière. Cependant, SLF4J est beaucoup plus simple à concevoir et peut-être plus robuste. En un mot, SLF4J évite les problèmes de chargeur de classe qui affligent [Jakarta Commons Logging].

Mike Partridge
la source
Y at-il une bonne bibliothèque open source qui se connecte dans le code de la bibliothèque que vous pouvez pointer? afin que nous puissions voir comment cela se fait?
utilisateur1870400
Le framework Spring est une bibliothèque Java assez connue qui le fait; dans leur cas, ils ont choisi JCL.
Mike Partridge
17

Oui , vous devriez vous connecter à partir du code de votre bibliothèque. Cela vous aidera non seulement à vous développer, mais les utilisateurs de la bibliothèque le trouveront utile. N'oubliez pas que vous pouvez toujours définir les niveaux de journalisation pour afficher uniquement les instructions de journal dont vous avez besoin, et qu'ils peuvent faire de même.

J'utilisais récemment Mybatis , un outil ORM open source. Je déboguais un problème pour lequel une requête qui, à mon avis, aurait dû être correcte ne renvoyait aucun résultat. Il s’agissait d’une requête paramétrée et, Mybatis ayant ouvert une session dans son code de bibliothèque, j’ai pu l’activer et voir la requête en cours d’exécution. Il était facile de dire que j'ai échangé deux paramètres. Sans me connecter à la bibliothèque, je n'aurais pas pu trouver le problème presque aussi rapidement.

Michael K
la source