Anmeldung in Spring Boot

Anmelden bei Spring Boot

1. Überblick

In diesem kurzen Tutorial werden die wichtigsten Protokollierungsoptionen von Spring Boot erläutert.

Tiefere Informationen zu Logback sind inA Guide To Logback verfügbar, während Log4j2 inIntro to Log4j2 – Appenders, Layouts and Filters eingeführt wird.

Weitere Lektüre:

Festlegen des Protokollierungsgrads im Frühjahrsstart beim Testen

Wenn Sie Testfehler diagnostizieren müssen, indem Sie eine detailliertere Protokollausgabe untersuchen, können Sie hier die Protokollierung in Spring-Apps zum Testzeitpunkt neu konfigurieren.

Read more

Auto-Konfigurationsbericht im Spring Boot anzeigen

Erfahren Sie, welche Beans in Ihrer Spring Boot-Anwendung automatisch konfiguriert werden, indem Sie beim Start einen Bericht zur automatischen Konfiguration erstellen.

Read more

2. Ersteinrichtung

Erstellen wir zunächst ein Spring Boot-Modul. Die empfohlene Methode hierfür ist die Verwendung vonSpring Initializr, die wir in unserenSpring Boot Tutorial behandeln.

Jetzt erstellen wir unsere einzige Klassendatei,LoggingController:

@RestController
public class LoggingController {

    Logger logger = LoggerFactory.getLogger(LoggingController.class);

    @RequestMapping("/")
    public String index() {
        logger.trace("A TRACE Message");
        logger.debug("A DEBUG Message");
        logger.info("An INFO Message");
        logger.warn("A WARN Message");
        logger.error("An ERROR Message");

        return "Howdy! Check out the Logs to see the output...";
    }
}

Sobald wir die Webanwendung geladen haben, wirdwe’ll be able to trigger those logging lines by simply visiting http://localhost:8080/

3. Nullkonfigurationsprotokollierung

Spring Boot ist ein sehr hilfreiches Framework - es ermöglicht uns, die meisten Konfigurationseinstellungen zu vergessen, von denen viele automatisch vorgenommen werden.

Bei der Protokollierung ist die einzige obligatorische AbhängigkeitApache Commons Logging.

Wir müssen es nur importieren, wenn wir Spring 4.x (Spring Boot 1.x) verwenden, da es in Spring 5 (Spring Boot 2.x) vomspring-jcl-Modul von Spring Framework bereitgestellt wird.

We shouldn’t worry about importing spring-jcl at all if we’re using a Spring Boot Starter (was wir fast immer sind). Das liegt daran, dass jeder Starter, wie unserespring-boot-starter-web, vonspring-boot-starter-logging, abhängt, die bereitsspring-jcl für uns ziehen.

When using starters, Logback is used for logging by default.

Spring Boot konfiguriert es mit Mustern und ANSI-Farben vor, um die Standardausgabe besser lesbar zu machen.

Führen Sie nun die Anwendung aus, besuchen Sie die Seitehttp://localhost:8080/und sehen Sie, was in der Konsole passiert:

image

Wie wir im obigen Bild sehen können,the default logging level of the Logger is preset to INFO, meaning thatTRACE and DEBUG messages are not visible.

Um sie zu aktivieren, ohne die Konfiguration zu ändern,we can pass the –debug or –trace arguments on the command line:

java -jar target/spring-boot-logging-0.0.1-SNAPSHOT.jar --trace

Spring Boot auchgives us access to a more fine-grained log level setting via environment variables. Es gibt verschiedene Möglichkeiten, dies zu erreichen.

Zunächst können wir unsere Protokollierungsstufe in unseren VM-Optionen festlegen:

-Dlogging.level.org.springframework=TRACE
-Dlogging.level.com.example=TRACE

Wenn wir Maven verwenden, können wir alternativdefine our log settings via the command line:

mvn spring-boot:run
  -Dspring-boot.run.arguments=--logging.level.org.springframework=TRACE,--logging.level.com.example=TRACE

Bei der Arbeit mit Gradle können wir die Protokolleinstellungen über die Befehlszeile übergeben. Dies erfordertsetting the bootRun task. Sobald dies erledigt ist, können wir die Anwendung ausführen:

./gradlew bootRun -Pargs=--logging.level.org.springframework=TRACE,--logging.level.com.example=TRACE

Wenn wir die Ausführlichkeit dauerhaft ändern möchten, können wir dies in der Dateiapplication.properties wie beschriebenhere tun:

logging.level.root=WARN
logging.level.com.example=TRACE

Schließlich können wirchange the logging level permanently by using our logging framework configuration file.

Wir haben bereits erwähnt, dass Logback standardmäßig in Spring Boot Starter verwendet wird. Lassen Sie uns sehen, wie Sie ein Fragment einer Logback-Konfigurationsdatei definieren, in der wir die Ebene für zwei separate Pakete festlegen:


Es ist erwähnenswert, dassif the log level for a package is defined multiple timesdie verschiedenen oben genannten Optionen verwendet,with different log levels, the lowest level will be usedjedoch.

Wenn wir also in unseren obigen Beispielen die Protokollierungsstufen gleichzeitig mit Logback-, Spring Boot- und Umgebungsvariablen festlegen, beträgt die ProtokollierungsstufeTRACE, da sie die niedrigste unter den angeforderten Ebenen ist.

4. Logback-Konfigurationsprotokollierung

Obwohl die Standardkonfiguration nützlich ist (z. B. um während POCs oder schnellen Experimenten in null Zeit zu beginnen), reicht sie höchstwahrscheinlich nicht für unseren täglichen Bedarf aus.

Sehen wir unshow to include a Logback configuration mit einer anderen Farbe und einem anderen Protokollierungsmuster an, mit separaten Spezifikationen für die Ausgabe vonconsole undfile und mit einem anständigenrolling policy, um zu vermeiden, dass große Protokolldateien generiert werden.

Zunächst sollten wir uns für eine Lösung entscheiden, die es ermöglicht, nur unsere Protokollierungseinstellungen zu verarbeiten, anstattapplication.properties, zu verschmutzen, die üblicherweise für viele andere Anwendungseinstellungen verwendet werden.

When a file in the classpath has one of the following names, Spring Boot will automatically load it über der Standardkonfiguration:

  • logback-spring.xml

  • logback.xml

  • logback-spring.groovy

  • logback.groovy

Spring recommends using the -spring variant über den einfachen, wann immer möglich, wie beschriebenhere.

Schreiben wir ein einfacheslogback-spring.xml:




    

    
        
            
                %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
            
        
    

    
        ${LOGS}/spring-boot-logger.log
        
            %d %p %C{1.} [%t] %m%n
        

        
            
            ${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
            
            
                10MB
            
        
    

    
    
        
        
    

    
    
        
        
    

Und wenn wir die Anwendung ausführen, ist hier die Ausgabe:

 

image

Wie wir sehen können, werden jetztTRACE undDEBUG Nachrichten protokolliert, und das gesamte Konsolenmuster unterscheidet sich sowohl textlich als auch chromatisch von zuvor.

Es meldet jetzt auch eine Datei in einem/logs-Ordner an, der unter dem aktuellen Pfad erstellt wurde, und archiviert sie über eine fortlaufende Richtlinie.

5. Log4j2-Konfigurationsprotokollierung

Während die Apache Commons-Protokollierung im Mittelpunkt steht und die Referenzimplementierung "Logback" bereitgestellt wird, sind alle Routings zu den anderen Protokollierungsbibliotheken bereits enthalten, um den Wechsel zu ihnen zu vereinfachen.

In order to use any logging library other than Logback, though, we need to exclude it from our dependencies.

Für jeden Starter wie diesen (es ist der einzige in unserem Beispiel, aber wir könnten viele davon haben):


    org.springframework.boot
    spring-boot-starter-web

wir müssen es in eine dünne Version verwandeln und (nur einmal) unsere alternative Bibliothek hinzufügen, hier durch einen Starter selbst:


    org.springframework.boot
    spring-boot-starter-web
    
        
            org.springframework.boot
            spring-boot-starter-logging
        
    


    org.springframework.boot
    spring-boot-starter-log4j2

Zu diesem Zeitpunkt müssen wir eine Datei in den Klassenpfad einfügen, die wie folgt benannt ist:

  • log4j2-spring.xml

  • log4j2.xml

Wir drucken ohne weitere Änderungen über Log4j2 (über SLF4J).

Schreiben wir ein einfacheslog4j2-spring.xml:



    
        
            
        

        
            
                %d %p %C{1.} [%t] %m%n
            
            
                
                
                
                
            
        
    

    
        
        
            
            
        

        
        
    

Und wenn wir die Anwendung ausführen, ist hier die Ausgabe:

 

image

Wie wir sehen können, unterscheidet sich die Ausgabe erheblich von der von Logback - ein Beweis dafür, dass wir Log4j2 jetzt vollständig verwenden.

Zusätzlich zur XML-Konfiguration können wir mit Log4j2 auch eine YAML- oder JSON-Konfiguration verwenden, wie inhere beschrieben.

6. Log4j2 Ohne SLF4J

Wir können Log4j2 auch nativ verwenden, ohne SLF4J zu passieren.

Dazu müssen wir einfach die nativen Klassen verwenden:

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
// [...]
Logger logger = LogManager.getLogger(LoggingController.class);

Wir müssen keine weiteren Änderungen an der Standard-Spring Boot-Konfiguration von Log4j2 vornehmen.

Wir können jetzt die brandneuen Funktionen von Log4j2 nutzen, ohne an der alten SLF4J-Schnittstelle hängen zu bleiben. Wir sind jedoch auch an diese Implementierung gebunden und müssen unseren Code neu schreiben, wenn wir uns für einen Wechsel zu einem anderen Protokollierungsframework entscheiden.

7. Mit Lombok loggen

In den Beispielen haben wirso far, we’ve had to declare an instance of a logger aus unserem Protokollierungsframework gesehen. Dieser Boilerplate-Code kann ärgerlich sein, und wir können ihn vermeiden, indem wir verschiedene von Lombok eingeführte Anmerkungen verwenden.

Wir müssen zuerst die Lombok-Abhängigkeit in unser Build-Skript einfügen, um damit arbeiten zu können:


    org.projectlombok
    lombok
    1.18.4
    provided

7.1. @Slf4j und@CommonsLog

Mit den Protokollierungs-APIs SLF4J und Apache Commons können wir unser Protokollierungs-Framework flexibel ändern, ohne dass dies Auswirkungen auf unseren Code hat.

Und wir könnenuse Lombok’s @Slf4j and @CommonsLog annotations, um die richtige Logger-Instanz zu unserer Klasse hinzuzufügen:org.slf4j.Logger für SLF4J undorg.apache.commons.logging.Log für Apache Commons Logging.

Um diese Anmerkungen in Aktion zu sehen, erstellen wir eine Klasse ähnlichLoggingController, jedoch ohne Logger-Instanz. Wir nennen esLombokLoggingController und kommentieren es mit@Slf4j:

@RestController
@Slf4j
public class LombokLoggingController {

    @RequestMapping("/lombok")
    public String index() {
        log.trace("A TRACE Message");
        log.debug("A DEBUG Message");
        log.info("An INFO Message");
        log.warn("A WARN Message");
        log.error("An ERROR Message");

        return "Howdy! Check out the Logs to see the output...";
    }
}

Beachten Sie, dass wir das Snippet nur ein wenig angepasst haben undlog als Logger-Instanz verwendet haben. Dies liegt daran, dass durch Hinzufügen der Anmerkung@Slf4j automatisch ein Feld mit dem Namenlog hinzugefügt wird.

MitZero-Configuration Logging,the application will use underlying logging implementation Logback für die Protokollierung. In ähnlicher Weise wird die Log4j2-Implementierung für die Protokollierung mit Log4j2-Configuration Logging verwendet.

Wir erhalten das gleiche Verhalten, wenn wir die Annotation@Slf4j durch@CommonsLog. ersetzen

7.2. @Log4j2

Wir können die Annotation@Log4j2 verwenden, um Log4j2 direkt zu verwenden. Daher nehmen wir eine einfache Änderung anLombokLoggingController vor, um@Log4j2 anstelle von@Slf4j oder@CommonsLog zu verwenden:

@RestController
@Log4j2
public class LombokLoggingController {

    @RequestMapping("/lombok")
    public String index() {
        log.trace("A TRACE Message");
        log.debug("A DEBUG Message");
        log.info("An INFO Message");
        log.warn("A WARN Message");
        log.error("An ERROR Message");

        return "Howdy! Check out the Logs to see the output...";
    }
}

Abgesehen von der Protokollierung gibt es weitere Anmerkungen von Lombok, die dazu beitragen, unseren Code sauber und ordentlich zu halten. Weitere Informationen dazu finden Sie inIntroduction to Project Lombok, und wir haben auch ein Tutorial zuSetting up Lombok with Eclipse and IntelliJ.

8. Vorsicht vor Java-Util-Logging

Spring Boot unterstützt auch die JDK-Protokollierung über die Konfigurationsdatei vonlogging.properties.

Es gibt jedoch Fälle, in denen es keine gute Idee ist, es zu verwenden. Vonthe documentation:

Es sind Probleme beim Laden von Klassen mit der Java-Util-Protokollierung bekannt, die Probleme verursachen, wenn sie von einer ausführbaren JAR-Datei ausgeführt werden. Wir empfehlen Ihnen, dies zu vermeiden, wenn Sie von einem ausführbaren jar ausführen, sofern dies möglich ist.

Bei Verwendung von Spring 4 empfiehlt es sich außerdem,commons-logging in pom.xml manuell auszuschließen, um mögliche Konflikte zwischen den Protokollierungsbibliotheken zu vermeiden. Spring 5 erledigt dies stattdessen automatisch, sodass wir bei Verwendung von Spring Boot 2 nichts tun müssen.

9. JANSI unter Windows

Während Unix-basierte Betriebssysteme wie Linux und Mac OS X standardmäßig ANSI-Farbcodes unterstützen, ist auf einer Windows-Konsole alles leider einfarbig.

Windows kann ANSI-Farben über eine Bibliothek namens JANSI erhalten.

Wir sollten jedoch auf die möglichen Nachteile beim Laden von Klassen achten.

Wir müssen es in der Konfiguration wie folgt importieren und explizit aktivieren:


    
        true
        
            [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n
        
    
    

ANSI-Escape-Sequenzen werden von Haus aus auf vielen Plattformen unterstützt, unter Windows jedoch nicht standardmäßig. To enable ANSI support add the Jansi jar to our application and set property log4j.skipJansi to false. Damit kann Log4j Jansi verwenden, um ANSI-Escape-Codes beim Schreiben in die Konsole hinzuzufügen.

Note
Vor Log4j 2.10 war Jansi standardmäßig aktiviert. Die Tatsache, dass Jansi nativen Code benötigt, bedeutet, dassJansi can only be loaded by a single class loader. Für Webanwendungen bedeutet diesthe Jansi jar has to be in the web container’s classpath. Um Probleme für Webanwendungen zu vermeiden, versucht Log4j nicht mehr automatisch, Jansi ohne explizite Konfiguration ab Log4j 2.10 zu laden.

Es ist auch wichtig zu wissen, dass:

  • Die Dokumentationsseite vonlayoutenthält nützliche Log4j2-JANSI-Informationen im Abschnitthighlight{pattern}{style}

  • Während JANSI die Ausgabe einfärben kann, bleibt das Spring Boot-Banner (nativ oder angepasst über diebanner.txt-Datei) einfarbig

10. Fazit

Wir haben die wichtigsten Möglichkeiten zur Schnittstelle mit den wichtigsten Protokollierungsframeworks innerhalb eines Spring Boot-Projekts gesehen.

Wir haben auch die wichtigsten Vorteile und Fallstricke jeder Lösung untersucht.

Wie immer ist der vollständige Quellcodeover on Github verfügbar.