web-dev-qa-db-fra.com

Comment configurer Spring et SLF4J pour pouvoir me connecter?

J'ai une application Maven & Spring à connecter. Je souhaite utiliser SLF4J.

Je veux mettre tous mes fichiers de configuration dans un répertoire {classpath}/config, y compris log4j.xml, puis init en utilisant un bean spring.

par exemple.

<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass" value="org.springframework.util.Log4jConfigurer"/>
    <property name="targetMethod" value="initLogging"/>
    <property name="arguments">
        <list>
            <value>classpath:config/log4j.xml</value>
        </list>
    </property>
</bean>

Cependant, je reçois cet avertissement et aucune journalisation.

log4j: WARN Aucun ajout de code n'a été trouvé pour le journal (org.springframework.context.support.ClassPathXmlApplicationContext) . log4j: WARN Veuillez initialiser correctement le système log4j . log4j: WARN Voir http://logging.Apache.org/log4j/1.2/faq.html#noconfig pour plus d'informations.

J'ai cherché sur Google et je ne trouve pas un exemple simple pour mettre cela en place. Des idées?

42
Peter Wilkinson

En plus de la réponse de Jatin:

Spring utilise Jakarta Commons Logging en tant qu'API de journalisation. Pour vous connecter à slf4j, vous devez vous assurer que commons-logging ne figure pas dans le chemin d'accès aux classes. jcl-over-slf4j est un jar de remplacement pour la journalisation commune.

Si vous utilisez maven, vous pouvez déterminer d'où provient la consignation de commons à l'aide de mvn dependency:tree et l'exclure de toutes les dépendances le nécessitant à l'aide d'exclusions de dépendance. Cependant, vous devrez peut-être exécuter mvn dependency:tree plusieurs fois, car il ne montre que la première occurrence d'une dépendance transitive.

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>${org.springframework.version}</version>
  <exclusions>
    <exclusion>
      <artifactId>commons-logging</artifactId>
      <groupId>commons-logging</groupId>
    </exclusion>
  </exclusions>
</dependency>
46
Stijn Van Bael

Vous trouverez un exemple à https://github.com/mbogoevici/spring-samples/tree/master/mvc-basic/trunk . Vous devez inclure des dépendances dans votre fichier POM pour activer la journalisation.

<!-- Logging -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${org.slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${org.slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${org.slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
        <scope>runtime</scope>
    </dependency>
26
Jatin

Juste pour être complet, une variante logback-classic:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.6.6</version>
    <scope>runtime</scope>
</dependency>

N'oubliez cependant pas de désactiver la dépendance commons-loggingqui provient de la dépendance Spring comme dans la réponse acceptée (Stijn).

6
Boris Treukhov

Utilisez la configuration de coup pour implémenter le JCL API sur la classpath:

<dependencies>
       <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>3.0.0.RELEASE</version>
          <scope>runtime</scope>
          <exclusions>
             <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
             </exclusion>
          </exclusions>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>jcl-over-slf4j</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.14</version>
          <scope>runtime</scope>
       </dependency>
    </dependencies> 

pour plus d'informations vérifier ici

5
Chandra Sekhar

conserve le fichier log4j dans le package par défaut 

1
TaherT

J'aime la méthode de consignation, et pour slf4j, nous faisons la même configuration:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
    </dependency>

slf4j-log4j12 introduira automatiquement slf4j-api et log4j, il n'est donc pas nécessaire de mettre autant de dépendances

1
Jianyu

Ajoutez simplement lazy-init="false" pour charger avec impatience le bean de configuration log4j dans votre contexte racine. Cela devrait résoudre le message WARN log4j:WARN No appenders could be found for logger

Exemple:

<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="false">

Une meilleure solution serait d’avoir la configuration dans web.xml ou comme paramètre JVM (-Dlog4j.configuration=.../conf/log4j.xml ou avec le préfixe 'file:' comme -Dlog4j.configuration=file:conf/log4j.properties dans certains cas).

0
Nashvi