Quel est le problème avec l’algorithme de découverte d’exécution d’Apache Commons Logging

Dave Syer (SpringSource) écrit sur son blog:

Malheureusement, l’algorithme de découverte du runtime est la pire chose à propos de la journalisation des commons et de son impopularité avec les nouveaux outils.

Pourquoi? Quel est le problème avec son algorithme de découverte d’exécution? Performance?

Pourquoi? Quel est le problème avec son algorithme de découverte d’exécution? Performance?

Non, ce n’est pas la performance, c’est la douleur du chargeur de classe . Le processus de découverte JCL s’appuie sur les hacks de classloader pour trouver la structure de journalisation à l’exécution, mais ce mécanisme entraîne de nombreux problèmes, notamment un comportement inattendu, un problème de débogage de classe difficile à résoudre et une complexité accrue. Ceci est bien capturé par Ceki (l’auteur de Log4J, SLF4J et Logback) dans Think again avant d’adopter l’API commons-logging (qui mentionne également les problèmes de memory leaks observés avec JCL).

Et c’est pourquoi SLF4J, qui utilise des liaisons statiques, a été créé.

Ceki étant l’auteur de SLF4J, vous pourriez penser que ses articles sont biaisés mais, croyez-moi, ils ne le sont pas et il fournit de nombreuses références (preuves) pour prouver son sharepoint vue.

Pour résumer:

  • Oui, JCL est connu pour être cassé, mieux vaut le restr.
  • Si vous souhaitez utiliser une façade de journalisation (tous les projets n’en ont pas besoin), utilisez SLF4J.
  • SLF4J fournit un pont JCL vers SLF4J pour les frameworks utilisant toujours JCL comme Spring 🙁
  • Je trouve que Logback, le successeur de Log4J, est une implémentation de journalisation supérieure.
  • Logback implémente nativement l’API SLF4J. Cela signifie que si vous utilisez Logback, vous utilisez réellement l’API SLF4J.

Voir également

  • Commons Commonsing était de ma faute
  • Réfléchissez avant d’adopter l’API de consignation des données
  • SLF4J Vs JCL / Reliure dynamic Vs Reliure statique

La journalisation de Commons est une façade de journalisation légère placée au-dessus de l’API de journalisation lourde, à savoir log4j , java.util.logging ou une autre API de journalisation prise en charge.

L’ algorithme de découverte est ce que la consignation journal utilise pour déterminer quelle API de journalisation vous utilisez lors de l’exécution afin de pouvoir diriger les appels de journal via son API vers l’API de consignation sous-jacente. L’avantage de ceci est que si vous souhaitez créer une bibliothèque chargée de la journalisation, vous ne souhaitez pas associer les utilisateurs de votre bibliothèque à un système de consignation particulier. Les appelants de votre code peuvent configurer la journalisation via log4j, java.util.logging, etc., et la journalisation des commons sera transmise à cette API lors de l’exécution.

Points communs pour la journalisation des biens communs:

  • Même si vous ne l’utilisez pas, une bibliothèque dont vous dépendez peut donc être incluse dans votre classpath.
  • Exécute l’algorithme de découverte pour chaque chargeur de classe que vous souhaitez connecter, ce qui peut produire des résultats indésirables . Assurez-vous donc de mettre commons-logging.jar dans le chargeur de classes approprié.
  • Plus grande complexité que le cadre de journalisation sous-jacent.
  • Moins de fonctionnalités que la structure de journalisation sous-jacente.

Une plus grande complexité perçue et une imprévisibilité dans les hiérarchies de classes complexes, sans aucun avantage perçu, rendent les utilisateurs de commons-logging agités. Étant donné que ce choix peut vous être imposé, les utilisateurs ne sont pas sympathiques. Voir cet article pour un argument convaincant contre l’utilisation de commons-logging.

Je ne peux pas parler de l’aspect “cru impopulaire”, je ne peux que parler pour moi-même:

Commons Logging est une façade par-dessus tout ce que votre “vrai” cadre de journalisation peut être: Log4j, Logback ou autre.

L’idée d’une façade de journalisation est que votre application dispose de la flexibilité nécessaire pour décider lors de l’exécution quelle implémentation de journalisation elle souhaite utiliser. Les façades sont assez intelligentes pour trouver des implémentations de journalisation à l’exécution.

Mes anciennes applications Java utilisent directement Log4j. Fonctionne bien, je ne vois pas la nécessité de les changer. Mes nouvelles applications Java utiliseront probablement Logback. Je pense que la capacité de choisir dynamicment une structure de journalisation est quelque chose dont aucune de mes applications n’aura besoin. Bien sûr, le kilométrage des autres peuples peut varier.


EDIT: On dirait que je me suis trompé sur la raison d’être de Commons Logging. Les liens donnés par @Pascal Thivent, en particulier le premier, expliquent cela beaucoup mieux.

Commons Logging contient une logique pour déterminer lors de l’exécution si vous souhaitez utiliser log4j ou java.util.logging. *.

Auparavant, ce code était sérieusement cassé, travaillant essentiellement avec JUL.

Sur la base des expériences avec ceci, slf4j a été écrit qui utilise la liaison statique (ou utilisé, je ne suis pas sûr avec la version 1.6) pour choisir le cadre approprié pour utiliser log4j, JUL ou log4j fork logback (et plus), et un pont permettant au code de journalisation Commons existant d’utiliser slf4j de manière transparente.

Si vous le pouvez, alors optez pour slf4j.