web-dev-qa-db-fra.com

Comment utiliser log4j 2.0 et slf4j et Commons Logging ensemble

Je commence actuellement une nouvelle Webapp (fonctionnant sur Tomcat 6) J'ai des composants qui utilisent slf4j et des composants qui utilisent la journalisation commune . Je prévois d'utiliser log4j 2.0 comme implémentation de journal appenders: SocketAppender et SyslogAppender mais également en raison du rechargement de configuration promu sans perte d'événements de journal)

Mes questions sont maintenant les suivantes: - À quelle interface dois-je programmer mes nouvelles classes? loag4j ou slf4j? ou même des communes se connectant?

  • Quel est le moyen préféré de déployer les pots? les mettre dans ma guerre d'application ou est-ce que je les mets dans les bibliothèques Tomcat?

  • de quels bocaux dois-je déployer? log4j (y compris les liaisons slf4j et commons), la journalisation des commons (slf4j-api-1.7.2.jar) et slf4j api (slf4j-api-1.7.2.jar)

14
raudi

A quelle interface est-ce que je programme mes nouvelles classes? loag4j ou slf4j? 

Si vous souhaitez utiliser SLF4J, programmez-le à cette interface. Il offre la plus grande flexibilité pour la mise en œuvre de la journalisation sous-jacente. Le but de slf4j est d'être une interface sur laquelle vous pouvez programmer. Ainsi, à l'avenir, si vous décidez de basculer vers, par exemple, la consignation, vous n'aurez pas à réécrire votre code.

Quel est le moyen préféré de déployer les pots? les mettre dans ma guerre d'application ou est-ce que je les mets dans les bibliothèques Tomcat?

Mettez-les dans votre GUERRE. 

La seule raison (imo) de placer les fichiers JAR dans le répertoire libs de Tomcat est s'ils doivent charger une bibliothèque native. Étant donné que Java ne vous permettra pas de charger la même bibliothèque native à partir de deux chargeurs de classe différents, vous devez les placer dans un emplacement commun. Mais cela ne s'applique pas ici.

Certaines personnes pensent que le répertoire lib est un moyen de gagner de la place. Cela était peut-être valable lorsque les ordinateurs de la "classe serveur" disposaient de 1 Go de RAM, mais ce n'est plus le cas. Et éviter lib signifie que vous éviterez la plupart des problèmes de chargement de classes difficiles à déboguer.

de quels bocaux dois-je déployer? 

  • slf4j-api est l'API de base
  • slf4j-log4j12 achemine la journalisation réelle vers Log4J
  • jcl-over-slf4j intercepte Common Logging et l'achemine via SLF4J (vers Log4J)
  • log4j sera votre cadre de journalisation physique

Je suppose que vous avez déjà une configuration pour Log4J et/ou êtes à l'aise pour l'écrire. Si ce n'est pas le cas, et que tout ce qui vous intéresse, c'est du code qui utilise Log4J en interne, il y a log4j-over-slf4j, qui interceptera les appels Log4J. Ensuite, vous devez choisir un framework, tel que Logback.

(Remarque: au départ, j'avais ajouté des liens vers tous ces packages, mais je n'ai pas assez de représentants pour les publier. Donc voici un lien unique vers le référentiel Maven avec tous les packages SLF4J mis en surbrillance)

22
parsifal

J'utilise slf4j avec log4j2 et j'utilise

slf4j-api-1.7.12.jar
log4j-api-2.2.jar
log4j-core-2.2.jar
log4j-slf4j-impl-2.2.jar
jcl-over-slf4j-1.7.12.jar(get rid of commons logging jars)

si votre serveur d'applications comporte des versions en conflit, vous devrez peut-être remplacer certains paramètres du chargeur de classe spécifiques au fournisseur.

par exemple. dans weblogic 12 c, je l’ai dans mon weblogic.xml dans src/main/webapp/WEB-INF

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app 
xmlns="http://xmlns.Oracle.com/weblogic/weblogic-web-app" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd 
http://xmlns.Oracle.com/weblogic/weblogic-web-app http://xmlns.Oracle.com/weblogic/weblogic-web-app/1.5/weblogic-web-app.xsd">
<container-descriptor>
    <prefer-application-packages>
        <package-name>org.Apache.log4j.*</package-name>
        <package-name>org.Apache.commons.logging.*</package-name>
        <package-name>org.Apache.commons.lang.*</package-name>
        <package-name>org.Apache.commons.io.*</package-name>
        <package-name>org.Apache.commons.collections4.*</package-name>
        <package-name>org.slf4j.*</package-name>
    </prefer-application-packages>
</container-descriptor>
<jsp-descriptor>
    <keepgenerated>true</keepgenerated>
    <debug>true</debug>
</jsp-descriptor>
<context-root>/cnfg</context-root>
</weblogic-web-app>
7
Kalpesh Soni

Veuillez noter que je n’ai pas utilisé Log4J 2.0, bien que j’ai utilisé SLF4J avec Log4J 1.2. Cela étant dit, je répondrais à vos questions comme suit:

  1. Programmez sur SLF4J. Il possède une API simple et agréable qui correspond à tout ce dont vous aurez probablement besoin d’un cadre de journalisation. De plus, si vous décidez pour une raison quelconque de passer à la journalisation ou à Log4J 1.2 ou à une autre fonction au lieu de Log4J 2.0, vous pouvez simplement désactiver les bocaux sur le backend.
  2. Mettez définitivement les pots dans la guerre des applications. Vous ne devriez presque jamais placer de fichiers JAR dans le répertoire lib du serveur d'applications. Sinon, elles affecteront toutes les applications Web sur ce serveur d'applications, pas seulement le vôtre. De plus, les fichiers JAR du répertoire lib du serveur d'applications ne peuvent pas être contrôlés en déployant des applications Web, mais doivent être gérés manuellement.
  3. Il semble que vous ayez besoin de slf4j-api-1.7.2.jar , log4j-to-slf4j-2.0-beta4.jar , log4j-2.0-beta4.jar et log4j-core-2.0-beta4.jar , ainsi que de toutes dépendances. Je suis sûr que Maven apportera les dépendances requises si vous l'utilisez.
1
Eric Galluzzo