web-dev-qa-db-de.com

Wie konfiguriere ich Spring und SLF4J, damit ich protokollieren kann

Ich habe eine Maven & Spring-App, mit der ich mich einloggen möchte. Ich möchte gerne SLF4J verwenden.

Ich möchte alle meine Konfigurationsdateien in ein Verzeichnis {classpath}/config einschließlich log4j.xml und dann mit einem Spring-Bean init einfügen.

z.B.

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

Ich bekomme jedoch diese Warnung und keine Protokollierung.

log4j: WARN Es konnten keine Appenders für den Logger (org.springframework.context.support.ClassPathXmlApplicationContext) ..__ gefunden werden. log4j: WARN Bitte initialisieren Sie das log4j-System ordnungsgemäß . log4j: WARN Siehe http://logging.Apache.org/log4j/1.2/faq.html#noconfig für weitere Informationen.

Ich habe gegoogelt und kann kein einfaches Beispiel für die Einrichtung finden. Irgendwelche Ideen?

42
Peter Wilkinson

Neben Jatins Antwort:

Spring verwendet Jakarta Commons Logging als Protokollierungs-API. Um sich bei slf4j anzumelden, müssen Sie sicherstellen, dass sich commons-logging nicht im Klassenpfad befindet. jcl-over-slf4j ist ein Ersatzgefäß für das Commons-Logging.

Wenn Sie Maven verwenden, können Sie feststellen, woher die Commons-Protokollierung durch die Verwendung von mvn dependency:tree kommt, und sie von allen Abhängigkeiten ausschließen, für die die Verwendung von Abhängigkeiten erforderlich ist. Möglicherweise müssen Sie mvn dependency:tree jedoch mehrmals ausführen, da nur das erste Auftreten einer transitiven Abhängigkeit angezeigt wird.

<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

Ein Beispiel finden Sie unter https://github.com/mbogoevici/spring-samples/tree/master/mvc-basic/trunk . Sie müssen einige Abhängigkeiten in Ihre POM-Datei aufnehmen, um die Protokollierung zu aktivieren.

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

Der Vollständigkeit halber eine 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>

Vergessen Sie jedoch nicht,commons-logging-Abhängigkeit zu deaktivieren die aus der Spring-Abhängigkeit wie in der akzeptierten Antwort (Stijn's) sprießt.

6
Boris Treukhov

Verwenden Sie die Blow-Konfiguration für die Implementierung des JCL API für die 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> 

weitere Informationen finden Sie unter hier

5
Chandra Sekhar

bewahren Sie die log4j-Datei im Standardpaket auf 

1
TaherT

Ich mag den Logback-Weg, und für slf4j machen wir die ähnliche Konfiguration:

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

slf4j-log4j12 führt automatisch slf4j-api und log4j ein. Sie müssen also nicht so viele Abhängigkeiten setzen

1
Jianyu

Fügen Sie einfach lazy-init="false" hinzu, um das Bean für die Konfiguration von log4j in Ihren Root-Kontext zu laden. Das sollte die WARN-Nachricht log4j:WARN No appenders could be found for logger lösen.

Beispiel:

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

Ein besserer Ansatz wäre die Konfiguration in web.xml oder als JVM-Parameter (-Dlog4j.configuration=.../conf/log4j.xml oder mit 'file:' Präfix als -Dlog4j.configuration=file:conf/log4j.properties in einigen Fällen).

0
Nashvi