2010-08-02 2 views
40

Ho un'app di primavera & che desidero accedere. Sono desideroso di usare SLF4J.Come configurare Spring e SLF4J in modo che possa ottenere la registrazione?

Voglio mettere tutti i miei file di configurazione in una directory {classpath}/config che include log4j.xml e quindi init che usa un bean spring.

ad es.

<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> 

Tuttavia, ricevo questo avviso e nessuna registrazione.

log4j: WARN Non è stato possibile trovare appendici per il registratore (org.springframework.context.support.ClassPathXmlApplicationContext). log4j: WARN Si prega di inizializzare correttamente il sistema log4j. log4j: WARN Vedere http://logging.apache.org/log4j/1.2/faq.html#noconfig per ulteriori informazioni.

Ho cercato su Google e non riesco a trovare un semplice esempio su come configurarlo. Qualche idea?

+0

Sto supponendo. Funziona in modo diverso se si tenta un percorso completo * C: /config/log4j.xml * – JoseK

+0

No. La codifica dura non aiuta. = ( –

risposta

43

Oltre alla risposta di Jatin:

Spring usa Jakarta Commons Logging come API di registrazione. Per accedere a slf4j, è necessario assicurarsi che commons-logging non sia sul classpath. jcl-over-slf4j è un barattolo di ricambio per la registrazione di comuni.

Se si utilizza Maven, è possibile rilevare da dove proviene il logging comune utilizzando mvn dependency:tree ed escluderlo da tutte le dipendenze che lo richiedono utilizzando le esclusioni di dipendenza. Potrebbe essere necessario eseguire più volte mvn dependency:tree perché mostra solo la prima occorrenza di una dipendenza transitiva.

<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

Mi piace il terzo approccio d qui - http://slf4j.org/faq.html#excludingJCL - usando artefatti vuoti. Questa opzione è consigliata nella versione corrente del manuale di riferimento Spring. –

26

Troverete un esempio su https://github.com/mbogoevici/spring-samples/tree/master/mvc-basic/trunk. È necessario includere alcune dipendenze nel file POM per abilitare la registrazione.

<!-- 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

L'esempio ha il file di configurazione log4j direttamente nel classpath, non sotto una directory di configurazione che è quello che mi piacerebbe. –

+0

In realtà questo ha aiutato un po 'però. Ora ho fatto il login nella mia app, è solo primavera –

+0

Se una particolare classe si lamenta, è necessario aggiungere il pacchetto richiesto all'elenco dei pacchetti registrati con il programma di registrazione È anche possibile inserirlo in una cartella di configurazione e aggiungere tale cartella al percorso della classe – Jatin

1

mastio file di log4j nel pacchetto predefinito

4

Usa configurazione colpo per l'attuazione del JCL API sul 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> 

Per ulteriori informazioni consulta here

6

Solo per ragioni di completezza, una 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 

Non dimenticare tuttavia a disabilitare la dipendenza commons-logging che spunta dalla dipendenza Spring come nella risposta accettata (Stijn).

1

Mi piace il modo logback, e per slf4j, facciamo la configurazione simile:

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

slf4j-log4j12 introdurrà automaticamente slf4j-api e log4j, quindi non c'è bisogno di mettere tante dipendenze

0

Basta aggiungere lazy-init="false" per caricare avidamente il bean per la configurazione di log4j nel proprio contesto di root. Questo dovrebbe risolvere il messaggio WARN log4j:WARN No appenders could be found for logger

Esempio:

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

Un approccio più meglio sarebbe avere la configurazione in web.xml o come parametro JVM (-Dlog4j.configuration=.../conf/log4j.xml o con 'file:' prefisso -Dlog4j.configuration=file:conf/log4j.properties per alcuni casi)