2017-06-05 2 views
0

Ich habe fast zwei Tage lang meinen Kopf gegen die Wand geschlagen und habe alle Vorschläge, die ich in den Antworten auf einige Fragen gefunden habe, ohne jede Freude ausprobiert. Spring scheint ordnungsgemäß zu protokollieren, aber nichts wird von meinen Anwendungsklassen protokolliert. Ich benutze Spring Boot 1.5.3 und baue eine App, die log4j verwendet und in einem Tomcat-Container ausgeführt wird (also nicht den eingebetteten Tomcat-Container von Spring). Hier sind die Abhängigkeiten, die in meiner ursprünglichen pom.xml waren:Warum protokollieren meine Klassen nicht, aber Spring protokolliert (Spring Boot mit Maven und log4j)?

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.5.3.RELEASE</version> 
</parent> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <exclusions> 
      <exclusion> 
       <groupId>ch.qos.logback</groupId> 
       <artifactId>logback-classic</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-tomcat</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.jboss.logging</groupId> 
       <artifactId>jboss-logging</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.hibernate</groupId> 
       <artifactId>hibernate-validator</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-logging</artifactId> 
      </exclusion> 
      <exclusion> 
       <artifactId>log4j-over-slf4j</artifactId> 
       <groupId>org.slf4j</groupId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-jcl</artifactId> 
     <version>2.7</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.7</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-logging</groupId> 
     <artifactId>commons-logging</artifactId> 
     <version>1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-web</artifactId> 
     <version>2.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-slf4j-impl</artifactId> 
     <version>2.7</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-log4j2</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.0.1</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

Ich versuchte, die vorgeschlagene Lösung von @ M.Deinum ohne Änderung Ergebnis: Frühling erfolgreich angemeldet, meine Klassen nicht. Die pom.xml in diesem Fall sah wie folgt aus:

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.5.3.RELEASE</version> 
</parent> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-logging</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-log4j2</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-tomcat</artifactId> 
     <scope>provided</scope> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.0.1</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

Ich habe die folgende Konfigurationsdatei an der Wurzel meiner app Klassenpfad:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="DEBUG"> 
    <Appenders> 
     <Console name="Console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
     </Console> 
    </Appenders> 
    <Loggers> 
     <Logger name="org.springframework.beans.factory" level="DEBUG"/> 
     <Root level="DEBUG"> 
      <AppenderRef ref="Console"/> 
     </Root> 
    </Loggers> 
</Configuration> 

Die Abhängigkeiten zur Zeit in meinem pom.xml sind nur Das Neueste in einer langen Reihe von Permutationen, die ich ausprobiert habe, mit Code aus der Spring Framework Referenz 4.3.8.RELEASE und mehreren Fragen, die hier auf stackoverflow beantwortet wurden.

+0

Zeigen Sie Ihre Klassenstufe Logging Beispiel zusammen mit Logger Initialisierung – Zico

+0

entfernen die alle ohne (nur ausschließen' Feder-boot-logging') und fügen Sie (dann Sie erhalten eine unterstützte und gemanagte Version –

+0

@Zico Ich bin mir nicht sicher, ob das Ihre Frage beantwortet, aber meine Klassen importieren 'org.apache.logging.log4j.LogManager' und' org.apache.logging.log4j.Logger'. Klassen (die alle Singleton-Spring-Beans sind) erstellen 'private statische finale Loggerlogger = LogManager.getLogger (ThisClass.class);' und versuchen, durch Aufruf von 'logger.debug zu loggen (" etwas Text, der niemals in die Logdatei geschrieben wird ")) '. – Thom

Antwort

1

Bereinigen Sie Ihre Abhängigkeiten, Sie schließen zu viel aus und enthalten zu viel. Spring Boot hat separate Starter für alle unterstützten Logging-Pakete, einfach diese verwenden.

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <exclusions>    
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-logging</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-log4j2</artifactId> 
    </dependency> 

</dependencies> 

Dies spiegelt sich auch in der reference guide erläutert.

Jetzt, wenn Sie Protokollierung verwenden möchten, stellen Sie sicher, dass Sie die SLF4J-API und nicht Log4j2 direkt durchlaufen (da dies sehr frühe Initialisierung auslösen und das Setup von Spring Boot beeinträchtigen kann).

Um einen deploybaren Krieg zu erzeugen, müssen Sie einige der Abhängigkeiten mit dem Geltungsbereich provided nicht ausschließen. Das wird auch in der reference guide beschrieben. die `Feder-boot-Starter-log4j2` statt einzelner Abhängigkeiten

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-tomcat</artifactId> 
    <scope>provided</scope> 
</dependency> 
+0

Ich habe versucht, was Sie beschrieben. Bitte überprüfen Sie meine Ergänzung zu meinem ursprünglichen Beitrag, es zeigt th Ich überarbeite pom.xml mit den gleichen Ergebnissen wie zuvor. – Thom

+0

Wie in meiner Antwort erwähnt, verwenden Sie die Slf4j API für die Protokollierung, anstatt direkt die log4j2 Logger aufzurufen. –

Verwandte Themen