46 votes

Comment configurer Spring et SLF4J pour obtenir la journalisation ?

J'ai une application maven et spring que je veux connecter. J'ai envie d'utiliser SLF4J.

Je veux placer tous mes fichiers de configuration dans un répertoire {classpath}/config, y compris log4j.xml, puis les initier à l'aide d'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, j'obtiens cet avertissement et aucun enregistrement.

log4j:WARN Aucun appender n'a pu être trouvé pour le logger (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 Internet et je n'ai pas trouvé d'exemple simple de mise en place. Avez-vous une idée ?

0 votes

Je suppose. Est-ce que cela fonctionne différemment si vous essayez un chemin complet <valeur>C:/config/log4j.xml</value>

0 votes

Non. Le codage dur n'aide pas. =(

47voto

Stijn Van Bael Points 2834

En plus de la réponse de Jatin :

Spring utilise Jakarta Commons Logging comme API de journalisation. Afin d'effectuer la journalisation vers slf4j, vous devez vous assurer que commons-logging n'est pas sur le classpath. jcl-over-slf4j est une jarre de remplacement pour commons-logging.

Si vous utilisez maven, vous pouvez détecter d'où vient commons-logging en utilisant mvn dependency:tree et l'exclure de toutes les dépendances qui le nécessitent en utilisant les exclusions de dépendances. Vous devrez peut-être exécuter mvn dependency:tree plusieurs fois cependant, 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>

1 votes

J'aime la troisième approche suggérée ici - slf4j.org/faq.html#exclureJCL - en utilisant des artefacts vides. Cette option est recommandée dans la version actuelle du manuel de référence de Spring.

27voto

Jatin Points 501

Vous trouverez un exemple à l'adresse suivante https://github.com/mbogoevici/spring-samples/tree/master/mvc-basic/trunk . Vous devez inclure certaines 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>

0 votes

Dans l'exemple, le fichier de configuration de log4j se trouve directement dans le classpath, et non dans un répertoire de configuration, comme je le voudrais.

0 votes

En fait, ça m'a un peu aidé. J'ai maintenant l'enregistrement dans mon application, c'est juste le printemps qui se plaint.

0 votes

Si une classe particulière se plaint, vous devez ajouter le paquetage requis à la liste des paquetages enregistrés avec le logger. Vous pouvez également le placer dans un dossier de configuration et ajouter ce dossier au chemin de la classe.

6voto

Boris Treukhov Points 5564

Par souci d'exhaustivité, une logback-classic variante :

<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 pas cependant de désactiver commons-logging dépendance qui jaillit de la dépendance de Spring comme dans la réponse acceptée (de Stijn).

5voto

Chandra Sekhar Points 5388

Utilisez la configuration du coup pour la mise en œuvre de la JCL API sur le 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, consultez aquí

1voto

taher Points 828

Garder le fichier log4j dans le paquetage par défaut

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X