Vaut-il la peine d'utiliser slf4j avec log4j2

114

Je ne suis pas en mesure de décider d'utiliser ou non slf4j avec log4j2. Sur la base des publications en ligne, il ne semble pas que les performances soient affectées, mais est-ce vraiment nécessaire.

Aussi ces points régissent en faveur de log4j2:

  • SLF4J force votre application à consigner les chaînes. L'API Log4j 2 prend en charge la journalisation de toute CharSequence si vous souhaitez enregistrer du texte, mais prend également en charge la journalisation de tout objet tel quel.
  • L'API Log4j 2 prend en charge la journalisation des objets Message, les expressions lambda Java 8 et la journalisation sans garbage (elle évite de créer des tableaux vararg et évite de créer des chaînes lors de la journalisation des objets CharSequence).
Andy897
la source
2
Peut être. Que faire si mon serveur d'applications inclut slf4jet se connecte (ou log4jv1)? Dois-je alors être obligé d'installer un troisième enregistreur pour utiliser votre application? Ou peut-être que la sécurité d'entreprise décide que vous ne pouvez utiliser que java.util.loggingdans la production, et alors?
Elliott Frisch
Merci pour l'écriture. Mais, si tout le monde utilise log4j à l'échelle de l'organisation, l'argument ci-dessus ne sera pas valide.
Andy897
4
L'utilisation de SLF4J signifie que le remplacement de l'implémentation est très facile si la politique de l'entreprise change, par exemple lorsque votre entreprise est acquise et que de nouvelles politiques vous sont imposées. Utiliser SLF4J maintenant, lorsque vous écrivez le code, ne prendra pas plus de temps que d'utiliser directement Log4j. Le remplacement des appels Log4j directs plus tard prendra beaucoup de temps. SLF4J est un investissement / assurance gratuit pour l'avenir. Est-ce plus important que les fonctionnalités de l'API Log4j 2? Seul vous (ou la politique de l'entreprise) pouvez en décider.
Andreas
Existe-t-il même un moyen d'utiliser slf4j avec log4j2 si vous le souhaitez? Cette page montre l'utilisation avec log4j - version 1.2 - qui est en fin de vie), mais aucune option pour log4j2. S'il y a un moyen, pourquoi slf4j ne le mentionne-t-il pas?
J Woodchuck

Réponses:

162

Allez-y: programmez vers l'API log4j2 au lieu de slf4j

C'est sûr: l'API Log4j2 offre exactement les mêmes garanties que slf4j - et plus encore.

Maintenant que Log4j2 lui-même est séparé en une API et un module d'implémentation, il n'y a plus aucune valeur à utiliser SLF4J.

Oui, il est bon de garder vos options ouvertes. Vous souhaiterez peut-être passer à une autre implémentation de journalisation ultérieurement.

Au cours des 10 dernières années environ, créer une telle flexibilité dans votre application signifiait utiliser une API wrapper comme SLF4J. Cette flexibilité n'est cependant pas gratuite: l'inconvénient de cette approche est que votre application ne peut pas utiliser l'ensemble de fonctionnalités plus riche de la bibliothèque de journalisation sous-jacente.

Log4j2 offre une solution qui n'exige pas que votre application soit limitée au plus petit dénominateur commun.

La valve d'échappement: log4j-to-slf4j

Log4j2 comprend un log4j-to-slf4jmodule de pont. Toute application codée par rapport à l'API Log4j2 peut choisir de basculer à tout moment l'implémentation de support vers n'importe quelle implémentation conforme à slf4j.

log4j-à-slf4j

Comme mentionné dans la question, l'utilisation de l'API Log4j2 offre directement plus de fonctionnalités et présente des avantages non fonctionnels par rapport à l'utilisation d'une API wrapper telle que slf4j:

  • API de message
  • Lambdas pour la journalisation différée
  • Enregistrer n'importe quel objet au lieu de seulement des chaînes
  • Sans garbage: évitez de créer des varargs ou de créer des chaînes lorsque cela est possible
  • CloseableThreadContext supprime automatiquement les éléments du MDC lorsque vous en avez terminé

(Voir 10 fonctionnalités de l'API Log4j2 non disponibles dans SLF4J pour plus de détails.)

Les applications peuvent utiliser en toute sécurité ces riches fonctionnalités de l'API Log4j2 sans être verrouillées dans l'implémentation principale native de Log4j2.

SLF4J est toujours votre soupape de sécurité, cela ne signifie tout simplement pas que votre application doit plus coder avec l'API SLF4J.


Divulgation: je contribue à Log4j2.


Mise à jour: Il semble y avoir une certaine confusion que la programmation de l'API Log4j2 introduit en quelque sorte une "façade pour une façade". Il n'y a aucune différence à cet égard entre l'API Log4j2 et SLF4J.

Les deux API nécessitent 2 dépendances lors de l'utilisation d'une implémentation native et 4 dépendances pour une implémentation non native. SLF4J et l'API Log4j2 sont identiques à cet égard. Par exemple:

Les dépendances requises sont similaires pour SLF4J et l'API Log4j 2

Remko Popma
la source
7
Je comprends. Permettez-moi de reformuler ma question. Existe-t-il des implémentations indépendantes de l'API log4j2 autres que log4j2?
Ceki
5
L'API Log4j2 et impl ne sont pas "étroitement couplés". Toutes ces implémentations SLF4J sont toutes disponibles: Une application codée par rapport à l'API Log4j2 peut sélectionner la log4j-to-slf4jdépendance au lieu de log4j-coreet choisir l'une de ces implémentations SLF4J que vous avez mentionnées. Le nombre d' implémentations natives de l'API Log4j2 n'est pas pertinent.
Remko Popma
19
Le problème est que vous avez souvent des dépendances sur des bibliothèques qui utilisent elles-mêmes slf4j, il est donc plus facile de s'en tenir à cela.
Davio
18
alors, je devrais utiliser une interface pour une interface pour une implémentation? Oui, non merci ... Slf4j a battu log4j au punch en fournissant une bonne interface à l'implémentation pour la journalisation ... log4j2 devrait simplement implémenter l'api slf4j - s'il y a une fonctionnalité manquante, contribuez-la en retour, si slf4j ne prend pas le nouveau fonctionnalité, alors PEUT-ÊTRE qu'il y ait un cas pour les interfaces api log4j2 ....
RockMeetHardplace
4
@RemkoPopma - vous vous opposez toujours à l'utilisation de l'interface log4j. Oui, je comprends - je peux enchaîner l'interface de log4j2 -> l'interface de slf4j -> quelle que soit l'implémentation, mais je préfère ne pas faire abstraction de l'abstraction - merci mais non merci.
RockMeetHardplace