2010-11-09 6 views
2

Nous devons introduire la connexion dans notre application. Nous avons décidé d'utiliser log4j c'est un bon choix. Aussi quelqu'un a dit que nous devrions utiliser le modèle singleton pour l'utilisation de log4j quelqu'un peut-il souligner comment et pourquoi?Comment utiliser log4j dans le code?

+1

Considérons slf4j au lieu de log4j. – DwB

+0

qu'est-ce que slf4j? Comment est-ce différent .. –

Répondre

5

Si vous introduisez la journalisation pour la première fois, utilisez Logback. Utilisez le fichier de configuration en tant que suggested here et ajoutez-le au classpath. La journalisation sera automatiquement configurée.

+0

Pourquoi avez-vous mentionné si pour la première fois. En quoi est-ce utile au début? –

+1

Certaines personnes sont bloquées avec log4j même si le monde a avancé ;-). L'introduction d'une meilleure alternative est vraiment difficile une fois que vous avez quelque chose qui fonctionne et que l'équipe est à l'aise avec cela. Il est donc préférable de faire preuve de diligence raisonnable et de trouver une meilleure alternative lors de l'introduction d'un nouveau cadre/technologie.Comment regarder ici pour découvrir pourquoi Logback est meilleur: http://logback.qos.ch/reasonsToSwitch.html –

6

Dans le motif singleton, le champ Logger est statique à la classe:

public class SomeAwesomeClass { 

    private static final Logger logger = Logger.getLogger(SomeAwesomeClass.class); 

} 

L'autre solution est de rendre le (non-statique de champ Logger qui est, chaque instance de SomeAwesomeClass contient une référence à la Logger):

public class SomeAwesomeClass { 

    private final Logger logger = Logger.getLogger(SomeAwesomeClass.class); 

} 

Je ne pense pas que cela fait beaucoup de différence la route que vous choisissez comme je crois Log4j retourne sans cesse le même Logger instance pour chaque instance de SomeAwesomeClass. Vraiment, ce sont juste des références d'objets inutiles, donc vous pouvez aussi bien utiliser le motif singleton.

Cependant, le modèle non-singleton devient nécessaire si vous faites quelque chose comme ceci:

public class SomeAwesomeClass { 

    private final Logger logger = Logger.getLogger(getClass()); 

    public void doSomething() { 
     log.info("Doing something"); 
    } 

} 

public class AwesomerClass extends SomeAwesomeClass { 
} 

plus tard ...

SomeAwesomeClass o = new AwesomerClass(); 
o.doSomething(); 

Dans cet exemple, le champ logger correspondra à AwesomerClass, et non SomeAwesomeClass.

2

La raison pour laquelle Singleton est parfois préférable est que nous voulons qu'une seule instance de l'enregistreur par application, sinon, pour chaque nouvelle instance de l'enregistreur, il y aura un fichier nouvellement créé ou un écrasement d'un journal existant fichier.

Si Log4J est un bon choix ou non dépendra de votre recherche/expérience avec les différents enregistreurs disponibles. Tout dépend de vos préférences (j'utilise Log4J tout le temps car je trouve qu'il est plus facile à configurer, mais je ne suis pas biaisé par les enregistreurs).

les célèbres sont là:

  • Log4J
  • SLF4J
  • Logback
  • propre Logging Java ....

Il y a quelques exemples sur le web qui montre vous comment utiliser les enregistreurs. Here est une brève comparaison pour Log4J vs SLF4J.