web-dev-qa-db-fra.com

Les nouveaux projets doivent-ils utiliser logback au lieu de log4j?

Les nouveaux projets doivent-ils utiliser logback au lieu de log4j comme cadre de journalisation?

Ou avec d'autres mots: "Est-ce que la connexion est meilleure que log4j (en laissant la" fonction "SLF4J de connexion à côté)?"

76
TimmiB

Vous devez utiliser SLF4J + Logback pour la journalisation.

Il fournit des fonctionnalités intéressantes telles que des messages paramétrés et (contrairement à la journalisation commune) un contexte de diagnostic mappé (MDC, javadoc , documentation ).

L'utilisation de SLF4J rend le backend de journalisation échangeable d'une manière assez élégante.

De plus, SLF4J prend en charge le pontage d'autres frameworks de journalisation vers l'implémentation SLF4J réelle que vous utiliserez afin que les événements de journalisation à partir de logiciels tiers apparaîtront dans vos journaux unifiés - à l'exception de Java.util.logging qui ne peuvent pas être pontés de la même manière que les autres frameworks de journalisation.

Bridging jul est expliqué dans le javadocs de SLF4JBridgeHandler.

J'ai eu une très bonne expérience en utilisant la combinaison SLF4J + Logback dans plusieurs projets et le développement de LOG4J est à peu près au point mort.

SLF4J présente les inconvénients restants suivants:

  • Il ne prend pas en charge les varargs pour rester compatible avec Java <1.5
  • Il ne prend pas en charge l'utilisation à la fois d'un message paramétré et d'une exception.
  • Il ne contient pas de support pour un contexte de diagnostic imbriqué (NDC, javadoc ) que LOG4J a.
81
Huxi

L'auteur (de Logback et Log4j) a une liste de raisons de changer à http://logback.qos.ch/reasonsToSwitch.html .

En voici quelques-uns qui m'ont frappé;

  • Implémentation plus rapide

    Sur la base de nos travaux précédents sur log4j, les internes de logback ont ​​été réécrits pour fonctionner environ dix fois plus rapidement sur certains chemins d'exécution critiques. Non seulement les composants de journalisation sont plus rapides, mais ils ont également une plus petite empreinte mémoire.

  • Rechargement automatique des fichiers de configuration

    Logback-classic peut recharger automatiquement son fichier de configuration lors de la modification. Le processus de numérisation est à la fois rapide et sûr car il n'implique pas la création d'un thread séparé pour la numérisation. Cette subtilité technique garantit que la connexion fonctionne bien au sein des serveurs d'applications et plus généralement dans l'environnement JEE.

  • Empiler les traces avec les données d'emballage

    Lorsque la journalisation imprime une exception, la trace de la pile comprendra les données d'empaquetage. Voici un exemple de trace de pile généré par l'application Web logback-demo.

    14: 28: 48.835 [btpool0-7] INFO c.q.l.demo.prime.PrimeAction - 99 n'est pas une valeur valide Java.lang.Exception: 99 n'est pas valide
    sur ch.qos.logback.demo.prime.PrimeAction.execute (PrimeAction.Java:28) [classes /: na] sur org.Apache.struts.action.RequestProcessor.processActionPerform (RequestProcessor.Java:431 ) [struts-1.2.9.jar: 1.2.9] sur org.Apache.struts.action.RequestProcessor.process (RequestProcessor.Java:236) [struts-1.2.9.jar: 1.2.9] sur org.Apache .struts.action.ActionServlet.doPost (ActionServlet.Java:432) [struts-1.2.9.jar: 1.2.9] sur javax.servlet.http.HttpServlet.service (HttpServlet.Java:820) [servlet-api- 2.5-6.1.12.jar: 6.1.12]
    sur org.mortbay.jetty.servlet.ServletHolder.handle (ServletHolder.Java:502) [jetty-6.1.12.jar: 6.1.12] sur ch.qos.logback.demo.UserServletFilter.doFilter ( UserServletFilter.Java:44) [classes /: na] à org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.Java:1115) [jetty-6.1.12.jar: 6.1.12] à org.mortbay .jetty.servlet.ServletHandler.handle (ServletHandler.Java:361) [jetty-6.1.12.jar: 6.1.12] à org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.Java:417) [jetty- 6.1.12.jar: 6.1.12] sur org.mortbay.jetty.handler.ContextHandlerCollection.handle (ContextHandlerCollection.Java:230) [jetty-6.1.12.jar: 6.1.12]

    De ce qui précède, vous pouvez reconnaître que l'application utilise Struts version 1.2.9 et a été déployée sous la version jetty 6.1.12. Ainsi, les traces de pile informeront rapidement le lecteur des classes inversées dans l'exception mais également des versions de package et de package auxquelles elles appartiennent. Lorsque vos clients vous envoient une trace de pile, en tant que développeur, vous n'aurez plus besoin de leur demander de vous envoyer des informations sur les versions des packages qu'ils utilisent. Les informations feront partie de la trace de la pile. Voir "% xThrowable" Conversion Word pour plus de détails.

    Cette fonctionnalité peut être très utile au point que certains utilisateurs la considèrent à tort comme une fonctionnalité de leur IDE.

  • Suppression automatique des anciennes archives de journaux

    En définissant la propriété maxHistory de TimeBasedRollingPolicy ou SizeAndTimeBasedFNATP, vous pouvez contrôler le nombre maximal de fichiers archivés. Si votre politique continue nécessite un roulement mensuel et que vous souhaitez conserver une année de journaux, définissez simplement la propriété maxHistory sur 12. Les fichiers journaux archivés datant de plus de 12 mois seront automatiquement supprimés.

Il peut y avoir un biais, mais le même type a écrit les deux frameworks et s'il dit utiliser Logback sur Log4j, il vaut probablement la peine d'être écouté.

20
James McMahon

J'utiliserais slf4j pour la journalisation dans tous les cas. Cela vous permet de choisir le backend de journalisation réel que vous souhaitez utiliser, au moment du déploiement au lieu du temps de code.

Cela s'est avéré très précieux pour moi. Cela me permet d'utiliser log4j dans les anciennes JVM, et de me connecter dans 1.5+ JVM, ainsi que Java.util.logging si nécessaire.

10

Logback more Java EE conscient:
en général (du code à la documentation), il faut garder à l'esprit les conteneurs - comment plusieurs applications coexistent, comment les chargeurs de classe sont implémentés, etc. Contextes pour les enregistreurs, JNDI, configuration JMX inclus, etc.

du développeur prospectif presque identique, Logback ajoute la journalisation paramétrée (pas besoin d'utiliser if (logger.isDebugEnabled ()) pour éviter la surcharge de concaténation de chaînes)

Log4j - seul plus géant est l'ancien support JVM, petit (IMO) NDC (Logback uniquement MDC), certaines extensions. Par exemple, j'ai écrit l'extension pour configureAndWatch pour Log4j, rien de tel pour Logback

2
webstranger

Je pense que votre décision devrait se résumer à la même chose que si vous décidiez d'utiliser log4j ou Jakarta Commons Logging - développez-vous une bibliothèque qui sera incluse dans d'autres applications? Si tel est le cas, il ne semble pas juste de forcer les utilisateurs de votre bibliothèque à utiliser également la bibliothèque de journalisation de leur choix.

Si la réponse est non, je choisirais simplement ce qui est plus simple à ajouter et ce avec quoi vous êtes plus à l'aise. On dirait que logback est tout aussi extensible et fiable que log4j, donc si vous êtes à l'aise avec son utilisation, allez-y.

1
matt b

le log4j original et le logback ont ​​été conçus et implémentés par le même gars.

plusieurs outils open source ont utilisé SLF4J. Je ne vois pas de lacunes importantes dans cet outil. Donc, à moins que vous n'ayez beaucoup d'extensions à log4j dans votre base de code, je continuerais avec logback.

1
anjanb