43 votes

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

Dave Syer (SpringSource) écrit dans son blog:

Malheureusement, la pire chose à propos de la journalisation commune, et ce qui la rend impopulaire avec de nouveaux outils, est également l'algorithme de découverte à l'exécution.

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

76voto

Pascal Thivent Points 295221

Pourquoi? Quel est le problème avec son moteur d'exécution à la découverte de l'algorithme? La Performance?

Non, ce n'est pas la performance, c'est du chargeur de classe de la douleur. JCL processus de découverte s'appuie sur le chargeur de classe hacks pour trouver la structure de journalisation au moment de l'exécution, mais ce mécanisme conduit à de nombreux problèmes, y compris un comportement inattendu, difficile à déboguer classloading à des problèmes résultant de l'accroissement de la complexité. C'est bien capturée par Ceki (l'auteur de Log4J, SLF4J et Logback) de Réfléchir à nouveau avant l'adoption de l'commons-logging API (qui mentionne aussi des fuites de mémoire, les problèmes observés avec JCL).

Et c'est pourquoi SLF4J, qui utilise static bindings, a été créé.

Ceki d'être l'auteur de SLF4J, vous pourriez penser que ses articles sont biaisées, mais, croyez-moi, ils ne le sont pas et il fournit beaucoup de références (preuves) pour prouver son point.

Pour résumer:

  • Oui, JCL est connu pour être brisé, mieux de rester loin de lui.
  • Si vous souhaitez utiliser un enregistrement de façade (pas tous les projets de besoin), l'utilisation SLF4J.
  • SLF4J fournit un JCL-à-SLF4J pont pour les cadres encore en utilisant JCL comme le Printemps :(
  • Je trouve Logback, Log4J successeur, pour être une meilleure implémentation de journalisation.
  • Logback implémente nativement le SLF4J API. Cela signifie que si vous utilisez Logback, vous êtes réellement en utilisant le SLF4J API.

Voir aussi

12voto

krock Points 13537

Commons logging est un poids léger de journalisation de la façade qui est placé sur le dessus du poids lourd API de journalisation être que log4j, java.util.l'exploitation forestière ou d'une autre pris en charge API de journalisation.

La découverte de l'algorithme est ce que commons logging utilise pour déterminer les API de journalisation vous utilisez au moment de l'exécution de sorte qu'il peut diriger le journal des appels via son API pour le sous-API de journalisation. L'avantage de ceci est que si vous vouliez créer une bibliothèque qui ne journalisation, vous ne voulez pas à attacher les utilisateurs de votre bibliothèque en particulier des poids lourds, système de journalisation. Les appelants de votre code pouvez configurer la journalisation via log4j, java.util.la journalisation etc. et les communes de l'enregistrement de l'avant à l'API au moment de l'exécution.

Commune de rognes pour commons logging:

  • Même si vous ne l'utilisez pas, une bibliothèque dont vous dépendez peut donc vous devez l'inclure dans votre classpath de toute façon.
  • Exécute la découverte de l'algorithme pour chaque chargeur de classes que vous voulez faire la connexion, qui peut produire des résultats non souhaités alors assurez-vous de mettre commons-logging.jar dans le droit du chargeur de classe.
  • Une plus grande complexité que le sous-jacent de journalisation.
  • Moins de fonctionnalités que sous-jacente de journalisation.

Une perception de la complexité accrue ainsi que l'imprévisibilité des complexes classpath hiérarchies, sans les avantages perçus des utilisateurs de commons-logging agité. Étant donné aussi que ce choix peut être forcé de vous ne pas rendre les utilisateurs sympathique. Voir cet article pour un argument convaincant contre l'utilisation de commons-logging.

2voto

Carl Smotricz Points 36400

Je ne peux pas parler de "cru impopulaire" aspect, je ne peux parler que pour moi-même:

Commons Logging est une façade, sur le dessus de ce que votre "réel" de journalisation peut être: Log4j, Logback ou quoi que ce soit.

L'idée d'un enregistrement de la façade est que votre application gains de la flexibilité de décider à l'exécution de journalisation mise en œuvre qu'il veut travailler avec. Les façades sont assez intelligents pour trouver des implémentations de journalisation au moment de l'exécution.

Mes anciennes applications Java utiliser Log4j, directement. Fonctionne très bien, je ne vois pas la nécessité de les modifier. Ma plus récente de Java applications utilisent probablement Logback. Je pense que la capacité à choisir de manière dynamique une journalisation est quelque chose qu'aucun de mes applications n'auront jamais besoin. Bien sûr, d'autres peuples kilométrage peut varier.


EDIT: on dirait que je eu tort à propos de la justification de l'Commons Logging. Les liens donnés par @Pascal Thivent, en particulier la première, expliquer ce beaucoup mieux.

1voto

Commons Logging contient la logique pour déterminer au moment de l'exécution si l'utilisation de log4j ou java.util.la journalisation.*.

Que le code utilisé pour être brisé, pour l'essentiel, qu'en travaillant avec JUIL.

Sur la base des expériences avec cette, slf4j a été écrit qui utilise statique de la liaison (ou, je ne sais pas avec la version 1.6) pour choisir le cadre approprié pour l'utilisation de log4j, JUL ou la log4j fourche logback (et plus), et il comprend un pont pour permettre aux Communes code d'enregistrement à utiliser slf4j de manière transparente.

Si vous le pouvez, puis allez slf4j.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X