Inloggen Spring Boot

1. Overzicht

In deze korte tutorial gaan we de belangrijkste logboekregistratie-opties verkennen die beschikbaar zijn in Spring Boot.

Meer informatie over Logback is beschikbaar in A Guide to Logback, terwijl Log4j2 wordt geïntroduceerd in Intro to Log4j2 - Appenders, Layouts en Filters.

2. Eerste installatie

Laten we eerst een Spring Boot-module maken. De aanbevolen manier om dit te doen is door Spring Initializr te gebruiken, die we behandelen in onze Spring Boot Tutorial.

Laten we nu ons enige klassenbestand maken, LoggingController:

@RestController openbare klasse LoggingController {Logger logger = LoggerFactory.getLogger (LoggingController.class); @RequestMapping ("/") public String index () {logger.trace ("A TRACE-bericht"); logger.debug ("EEN DEBUG-bericht"); logger.info ("Een INFO-bericht"); logger.warn ("A WARN Message"); logger.error ("Een foutbericht"); return "Howdy! Bekijk de Logs om de output te zien ..."; }} 

Zodra we de webapplicatie hebben geladen, we kunnen die logboekregels activeren door simpelweg te bezoeken // localhost: 8080 /.

3. Geen configuratielogging

Spring Boot is een zeer nuttig framework. Het stelt ons in staat om de meeste configuratie-instellingen te vergeten, waarvan er vele eigenwijs automatisch worden afgestemd.

In het geval van logboekregistratie is de enige verplichte afhankelijkheid Apache Commons-logboekregistratie.

We hoeven het alleen te importeren als u Spring 4.x (Spring Boot 1.x) gebruikt, aangezien het wordt geleverd door Spring Framework's spring-jcl module in Spring 5 (Spring Boot 2.x).

We hoeven ons geen zorgen te maken over importeren spring-jcl helemaal als we een Spring Boot Starter gebruiken (wat we bijna altijd zijn). Dat komt omdat elke starter, zoals onze spring-boot-starter-web, hangt af van spring-boot-starter-logging, die al trekt spring-jcl voor ons.

3.1. Standaard logboekregistratie

Bij gebruik van starters wordt Logback standaard gebruikt voor logboekregistratie.

Spring Boot configureert het vooraf met patronen en ANSI-kleuren om de standaarduitvoer beter leesbaar te maken.

Laten we nu de applicatie starten en het // localhost: 8080 / pagina, en kijk wat er gebeurt in de console:

Zoals we kunnen zien, het standaard logniveau van de logger is vooraf ingesteld op INFO, wat betekent dat SPOOR en DEBUG berichten zijn niet zichtbaar.

Om ze te activeren zonder de configuratie te wijzigen, we kunnen de –Debug of -spoor argumenten op de opdrachtregel:

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

3.2. Log Niveaus

Spring Boot ook geeft ons toegang tot een meer fijnmazig logniveau-instelling via omgevingsvariabelen. Er zijn verschillende manieren waarop we dit kunnen bereiken.

Ten eerste kunnen we ons logboekregistratieniveau instellen binnen onze VM-opties:

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

Als alternatief, als we Maven gebruiken, kunnen we dat definieer onze log-instellingen via de opdrachtregel:

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

Wanneer we met Gradle werken, kunnen we logboekinstellingen doorgeven via de opdrachtregel. Dit vereist het instellen van de bootRun taak.

Zodra dat is gebeurd, voeren we de applicatie uit:

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

Als we de breedsprakigheid permanent willen wijzigen, kunnen we dat doen in de application.properties bestand zoals hier beschreven:

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

Eindelijk kunnen we verander het logboekregistratieniveau permanent met behulp van ons logging framework-configuratiebestand.

We hebben vermeld dat Spring Boot Starter standaard Logback gebruikt. Laten we eens kijken hoe we een fragment van een Logback-configuratiebestand kunnen definiëren waarin we het niveau voor twee afzonderlijke pakketten instellen:

Onthoud dat als het logboekniveau voor een pakket meerdere keren is gedefinieerd met behulp van de verschillende hierboven genoemde opties, maar met verschillende logniveaus wordt het laagste niveau gebruikt.

Dus als we de logboekregistratieniveaus instellen met behulp van Logback, Spring Boot en omgevingsvariabelen tegelijkertijd, is het logniveau SPOOR, aangezien het de laagste van de gevraagde niveaus is.

4. Logboekregistratie van configuratie

Hoewel de standaardconfiguratie handig is (bijvoorbeeld om binnen nul te beginnen tijdens POC's of snelle experimenten), is deze waarschijnlijk niet genoeg voor onze dagelijkse behoeften.

Laten we kijken hoe u een Logback-configuratie toevoegt met een andere kleur en logpatroon, met aparte specificaties voor troosten en het dossier output, en met een fatsoenlijke doorlopend beleid om te voorkomen dat er enorme logbestanden worden gegenereerd.

Ten eerste moeten we een oplossing vinden waarmee we onze logboekinstellingen alleen kunnen verwerken in plaats van te vervuilen application.properties, die vaak wordt gebruikt voor veel andere applicatie-instellingen.

Als een bestand in het klassenpad een van de volgende namen heeft, zal Spring Boot het automatisch laden over de standaardconfiguratie:

  • logback-spring.xml
  • logback.xml
  • logback-spring.groovy
  • logback.groovy

Spring raadt het gebruik van de -voorjaar variant over de gewone waar mogelijk, zoals hier beschreven.

Laten we een simpel schrijven logback-spring.xml:

      % zwart (% d {ISO8601})% highlight (% - 5level) [% blauw (% t)]% geel (% C {1.}):% msg% n% throwable $ {LOGS} / spring-boot- logger.log% d% p% C {1.} [% t]% m% n $ {LOGS} / gearchiveerd / spring-boot-logger-% d {jjjj-MM-dd}.% i.log 10MB 

En wanneer we de applicatie uitvoeren, is hier de uitvoer:

Zoals we kunnen zien, logt het nu in SPOOR en DEBUG berichten, en het algemene consolepatroon is zowel tekstueel als chromatisch anders dan voorheen.

Het logt nu ook in op een bestand in een / logs map aangemaakt onder het huidige pad en archiveert deze via een doorlopend beleid.

5. Log4j2-configuratielogboek

Terwijl Apache Commons Logging de kern vormt, en Logback de referentie-implementatie is, zijn alle routings naar de andere logboekregistratiebibliotheken al opgenomen om het gemakkelijk te maken om ernaar over te schakelen.

Om een ​​andere logboekbibliotheek dan Logback te gebruiken, moeten we deze echter uitsluiten van onze afhankelijkheden.

Voor elke starter zoals deze (het is de enige in ons voorbeeld, maar we kunnen er veel van hebben):

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

we moeten er een magere versie van maken en (slechts één keer) onze alternatieve bibliotheek toevoegen, hier via een starter zelf:

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

Op dit punt moeten we in het klassenpad een bestand plaatsen met de naam een ​​van de volgende:

  • log4j2-spring.xml
  • log4j2.xml

We printen via Log4j2 (via SLF4J) zonder verdere aanpassingen.

Laten we een simpel schrijven log4j2-spring.xml:

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

En wanneer we de applicatie uitvoeren, is hier de uitvoer:

Zoals we kunnen zien, is de uitvoer behoorlijk anders dan die van Logback - een bewijs dat we Log4j2 nu volledig gebruiken.

Naast de XML-configuratie stelt Log4j2 ons in staat om ook een YAML- of JSON-configuratie te gebruiken, die hier wordt beschreven.

6. Log4j2 Zonder SLF4J

We kunnen Log4j2 ook native gebruiken, zonder via SLF4J te gaan.

Om dat te doen, gebruiken we gewoon de native klassen:

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

We hoeven geen andere wijziging uit te voeren in de standaard Log4j2 Spring Boot-configuratie.

We kunnen nu de gloednieuwe functies van Log4j2 benutten zonder vast te lopen aan de oude SLF4J-interface. Maar we zijn ook gebonden aan deze implementatie en we zullen onze code moeten herschrijven wanneer we overschakelen naar een ander logging-framework.

7. Loggen met Lombok

In de voorbeelden die we hebben gezien tot nu toe hebben we een instantie van een logger moeten declareren vanuit ons logging framework.

Deze standaardcode kan vervelend zijn. We kunnen het vermijden door verschillende annotaties te gebruiken die door Lombok zijn geïntroduceerd.

We zullen eerst de Lombok-afhankelijkheid in ons build-script moeten toevoegen om ermee te werken:

 org.projectlombok lombok 1.18.4 voorzien 

7.1. @ Slf4j en @CommonsLog

SLF4J en Apache Commons Logging API's geven ons de flexibiliteit om ons logging framework te wijzigen zonder impact op onze code.

En we kunnen gebruik Lombok's @ Slf4j en @CommonsLog annotaties om de juiste logger-instantie aan onze klas toe te voegen: org.slf4j.Logger voor SLF4J en org.apache.commons.logging.Log voor Apache Commons-logboekregistratie.

Laten we, om deze annotaties in actie te zien, een klasse maken die lijkt op LoggingController maar zonder een logger-instantie. We noemen het zo LombokLoggingController en annoteer het met @ Slf4j:

@RestController @ Slf4j openbare klasse LombokLoggingController {@RequestMapping ("/ lombok") openbare String-index () {log.trace ("A TRACE-bericht"); log.debug ("A DEBUG-bericht"); log.info ("Een INFO-bericht"); log.warn ("A WARN Message"); log.error ("Een foutbericht"); return "Howdy! Bekijk de Logs om de output te zien ..."; }}

Merk op dat we het fragment een beetje hebben aangepast met logboek als onze logger-instantie. Dit komt omdat het toevoegen van de annotatie @ Slf4j voegt automatisch een veld toe met de naam logboek.

Met Logboekregistratie zonder configuratie, de toepassing zal de onderliggende logboekregistratie-implementatie Logback gebruiken voor logboekregistratie. Evenzo wordt de Log4j2-implementatie gebruikt voor logboekregistratie met Log4j2-configuratielogboekregistratie.

We krijgen hetzelfde gedrag wanneer we de annotatie vervangen @ Slf4j met @CommonsLog.

7.2. @ Log4j2

We kunnen de annotatie gebruiken @ Log4j2 om Log4j2 rechtstreeks te gebruiken. We brengen dus een eenvoudige wijziging aan in LombokLoggingController gebruiken @ Log4j2 in plaats van @ Slf4j of @CommonsLog:

@RestController @ Log4j2 openbare klasse LombokLoggingController {@RequestMapping ("/ lombok") openbare String-index () {log.trace ("A TRACE-bericht"); log.debug ("EEN DEBUG-bericht"); log.info ("Een INFO-bericht"); log.warn ("A WARN Message"); log.error ("Een foutbericht"); return "Howdy! Bekijk de Logs om de output te zien ..."; }} 

Behalve logboekregistratie zijn er andere annotaties van Lombok die helpen onze code schoon en netjes te houden. Meer informatie over hen is beschikbaar in Inleiding tot Project Lombok, en we hebben ook een tutorial over het opzetten van Lombok met Eclipse en IntelliJ.

8. Pas op voor Java Util Logging

Spring Boot ondersteunt ook JDK-logboekregistratie via het logging.properties configuratiebestand.

Er zijn echter gevallen waarin het geen goed idee is om het te gebruiken. Uit de documentatie:

Er zijn bekende classloading-problemen met Java Util Logging die problemen veroorzaken bij het uitvoeren vanuit een ‘executable jar '. We raden je aan om het, indien mogelijk, te vermijden wanneer je draait vanuit een ‘uitvoerbare jar '.

Het is ook een goede gewoonte om Spring 4 handmatig uit te sluiten commons-logging in pom.xml, om mogelijke botsingen tussen de logboekbibliotheken te voorkomen. Spring 5 verwerkt het in plaats daarvan automatisch, dus we hoeven niets te doen als we Spring Boot 2 gebruiken.

9. JANSI op Windows

Hoewel Unix-gebaseerde besturingssystemen zoals Linux en Mac OS X standaard ANSI-kleurcodes ondersteunen, zal op een Windows-console alles helaas monochroom zijn.

Windows kan ANSI-kleuren verkrijgen via een bibliotheek met de naam JANSI.

We moeten echter letten op de mogelijke nadelen van het laden van klassen.

We moeten het als volgt importeren en expliciet activeren in de configuratie:

Inloggen:

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

Log4j2:

ANSI-escape-reeksen worden standaard op veel platforms ondersteund, maar niet standaard op Windows. Om ANSI-ondersteuning in te schakelen, voegt u de Jansi-pot toe aan onze applicatie en stelt u de eigenschap in log4j.skipJansi naar false. Hierdoor kan Log4j Jansi gebruiken om ANSI-escape-codes toe te voegen bij het schrijven naar de console.

Opmerking: vóór Log4j 2.10 was Jansi standaard ingeschakeld. Het feit dat Jansi native code vereist, betekent dat Jansi kan alleen worden geladen door een enkele klasse lader. Voor webapplicaties betekent dit de Jansi-pot moet in het klassenpad van de webcontainer staan. Om problemen voor webapplicaties te voorkomen, probeert Log4j niet langer automatisch Jansi te laden zonder expliciete configuratie vanaf Log4j 2.10.

Het is ook vermeldenswaard:

  • De lay-outdocumentatiepagina bevat nuttige Log4j2 JANSI-informatie in het markeer {pattern} {style} sectie.
  • Hoewel JANSI de uitvoer kan kleuren, is Spring Boot's Banner (native of aangepast via het banner.txt bestand) blijft monochroom.

10. Conclusie

We hebben de belangrijkste manieren gezien om te communiceren met de belangrijkste frameworks voor logboekregistratie vanuit een Spring Boot-project.

We hebben ook de belangrijkste voordelen en valkuilen van elke oplossing onderzocht.

Zoals altijd is de volledige broncode beschikbaar op GitHub.