Logge inn Spring Boot

1. Oversikt

I denne korte opplæringen skal vi utforske de viktigste loggingsalternativene som er tilgjengelige i Spring Boot.

Dypere informasjon om Logback er tilgjengelig i A Guide to Logback, mens Log4j2 introduseres i Intro to Log4j2 - Appenders, Layouts and Filters.

2. Første oppsett

La oss først lage en Spring Boot-modul. Den anbefalte måten å gjøre det på er å bruke Spring Initializr, som vi dekker i vår Boot Boot Tutorial.

La oss nå lage vår eneste klassefil, LoggingController:

@RestController offentlig klasse LoggingController {Logger logger = LoggerFactory.getLogger (LoggingController.class); @RequestMapping ("/") offentlig strengindeks () {logger.trace ("A TRACE Message"); logger.debug ("A DEBUG Message"); logger.info ("En INFO-melding"); logger.warn ("A WARN Message"); logger.error ("En FEIL-melding"); returner "Howdy! Sjekk ut loggene for å se utdataene ..."; }} 

Når vi har lastet inn webapplikasjonen, vi kan utløse disse logglinjene ved å bare besøke // lokal vert: 8080 /.

3. Null konfigurasjonslogging

Spring Boot er et veldig nyttig rammeverk. Det tillater oss å glemme flertallet av konfigurasjonsinnstillingene, hvorav mange den automatisk stiller inn.

I tilfelle logging er den eneste obligatoriske avhengigheten Apache Commons Logging.

Vi trenger å importere den bare når du bruker Spring 4.x (Spring Boot 1.x) siden den er levert av Spring Framework’s vår-jcl modul våren 5 (Spring Boot 2.x).

Vi bør ikke bekymre oss for å importere vår-jcl i det hele tatt hvis vi bruker en Spring Boot Starter (som vi nesten alltid er). Det er fordi hver startpakke, som vår spring-boot-starter-web, kommer an på spring-boot-starter-logging, som allerede trekker inn vår-jcl for oss.

3.1. Standard logglogging

Når du bruker forretter, brukes Logback som standard for logging.

Spring Boot konfigurerer den med mønstre og ANSI-farger for å gjøre standardutgangen mer lesbar.

La oss nå kjøre applikasjonen og besøke // lokal vert: 8080 / side, og se hva som skjer i konsollen:

Som vi kan se, standard loggningsnivå for Logger er forhåndsinnstilt til INFO, noe som betyr at SPOR og DEBUG meldinger er ikke synlige.

For å aktivere dem uten å endre konfigurasjonen, vi kan passere –Debug eller –Spor argumenter på kommandolinjen:

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

3.2. Loggnivåer

Spring Boot også gir oss tilgang til en mer detaljert loggnivåinnstilling via miljøvariabler. Det er flere måter vi kan oppnå dette på.

Først kan vi angi loggenivå innenfor våre VM-alternativer:

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

Alternativt, hvis vi bruker Maven, kan vi definere logginnstillingene våre via kommandolinjen:

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

Når vi jobber med Gradle, kan vi sende logginnstillinger gjennom kommandolinjen. Dette vil kreve innstilling av bootRun oppgave.

Når det er gjort, kjører vi applikasjonen:

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

Hvis vi vil endre ordlighetsgraden permanent, kan vi gjøre det i application.properties filen som beskrevet her:

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

Endelig kan vi endre loggnivået permanent ved å bruke konfigurasjonsfilen for loggingsrammeverk.

Vi nevnte at Spring Boot Starter bruker Logback som standard. La oss se hvordan vi definerer et fragment av en Logback-konfigurasjonsfil der vi setter nivået for to separate pakker:

Husk at hvis loggnivået for en pakke er definert flere ganger ved hjelp av de forskjellige alternativene nevnt ovenfor, men med forskjellige loggnivåer, vil det laveste nivået bli brukt.

Så hvis vi stiller inn loggningsnivåene ved å bruke Logback, Spring Boot og miljøvariabler samtidig, vil loggnivået være SPOR, da det er det laveste blant de etterspurte nivåene.

4. Loggføring av loggkonfigurasjon

Selv om standardkonfigurasjonen er nyttig (for eksempel å komme i gang på null tid under POC-er eller raske eksperimenter), er det sannsynligvis ikke nok for våre daglige behov.

La oss se hvordan du inkluderer en Logback-konfigurasjon med et annet farge- og loggmønster, med separate spesifikasjoner for konsoll og fil produksjon, og med en anstendig rullerende politikk for å unngå å generere store loggfiler.

Først bør vi finne en løsning som gjør det mulig å håndtere loggeinnstillingene alene i stedet for å forurense application.properties, som ofte brukes i mange andre applikasjonsinnstillinger.

Når en fil i klassestien har ett av følgende navn, vil Spring Boot automatisk laste den inn over standardkonfigurasjonen:

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

Våren anbefaler å bruke -vår variant over de slette når det er mulig, som beskrevet her.

La oss skrive en enkel logback-spring.xml:

      % svart (% d {ISO8601})% høydepunkt (% - 5 nivå) [% blå (% t)]% gul (% C {1.}):% msg% n% kastbar $ {LOGS} / spring-boot- logger.log% d% p% C {1.} [% t]% m% n $ {LOGS} / arkivert / spring-boot-logger-% d {åååå-MM-dd}.% i.log 10 MB 

Og når vi kjører applikasjonen, her er utdataene:

Som vi kan se, logger det seg nå SPOR og DEBUG meldinger, og det generelle konsollmønsteret er både tekstmessig og kromatisk annerledes enn før.

Den logger også nå på en fil i en /tømmerstokker mappen som er opprettet under den nåværende banen og arkiverer den gjennom en rullerende policy.

5. Log4j2-konfigurasjonslogging

Mens Apache Commons Logging er kjernen, og Logback er referanseimplementeringen, er alle rutene til de andre loggbibliotekene allerede inkludert for å gjøre det enkelt å bytte til dem.

For å kunne bruke annet loggbibliotek enn Logback, må vi imidlertid ekskludere det fra våre avhengigheter.

For hver startpakke som denne (den er den eneste i eksemplet vårt, men vi kan ha mange av dem):

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

vi må gjøre det om til en tynn versjon, og (bare en gang) legge til vårt alternative bibliotek, her gjennom selve en startpakke:

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

På dette punktet må vi plassere en fil i klassestien med en av følgende:

  • log4j2-spring.xml
  • log4j2.xml

Vi skriver ut gjennom Log4j2 (over SLF4J) uten ytterligere modifikasjoner.

La oss skrive en enkel log4j2-spring.xml:

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

Og når vi kjører applikasjonen, her er utdataene:

Som vi kan se, er utdataene ganske forskjellige fra Logback-en - et bevis på at vi bruker Log4j2 fullt ut nå.

I tillegg til XML-konfigurasjonen tillater Log4j2 oss også å bruke en YAML- eller JSON-konfigurasjon, beskrevet her.

6. Log4j2 Uten SLF4J

Vi kan også bruke Log4j2 naturlig, uten å gå gjennom SLF4J.

For å gjøre det bruker vi ganske enkelt de opprinnelige klassene:

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

Vi trenger ikke utføre noen andre modifikasjoner av standard Log4j2 Spring Boot-konfigurasjon.

Vi kan nå utnytte de splitter nye funksjonene til Log4j2 uten å bli sittende fast med det gamle SLF4J-grensesnittet. Men vi er også knyttet til denne implementeringen, og vi må skrive om koden vår når vi bytter til et annet loggingsrammeverk.

7. Logging With Lombok

I eksemplene vi har sett så langt har vi måttet erklære en forekomst av en logger fra loggerammene våre.

Denne kjelekoden kan være irriterende. Vi kan unngå det ved å bruke forskjellige merknader introdusert av Lombok.

Vi må først legge til Lombok-avhengigheten i byggeskriptet vårt for å jobbe med det:

 org.projectlombok lombok 1.18.4 gitt 

7.1. @ Slf4j og @CommonsLog

SLF4J og Apache Commons Logging API gir oss fleksibilitet til å endre loggingsrammeverket vårt uten å påvirke koden vår.

Og det kan vi bruk Lomboks @ Slf4j og @CommonsLog kommentarer for å legge til riktig loggerforekomst i klassen vår: org.slf4j.Logger for SLF4J og org.apache.commons.logging.Log for logging av Apache Commons.

For å se disse merknadene i aksjon, la oss lage en klasse som ligner på LoggingController men uten en logger-forekomst. Vi kaller det som LombokLoggingController og kommentere den med @ Slf4j:

@RestController @ Slf4j offentlig klasse LombokLoggingController {@RequestMapping ("/ lombok") offentlig strengindeks () {log.trace ("A TRACE Message"); log.debug ("A DEBUG Message"); log.info ("En INFO-melding"); log.warn ("A WARN Message"); log.error ("En FEIL-melding"); returner "Howdy! Sjekk ut loggene for å se utdataene ..."; }}

Vær oppmerksom på at vi har justert kodebiten litt Logg som vår loggerinstans. Dette er fordi du legger til kommentaren @ Slf4j legger automatisk til et felt som heter Logg.

Med Nullkonfigurasjonslogging, applikasjonen vil bruke underliggende loggføring implementering Logback for logging. Tilsvarende brukes Log4j2-implementering for logging med Log4j2-Configuration Logging.

Vi får samme oppførsel når vi erstatter kommentaren @ Slf4j med @CommonsLog.

7.2. @ Log4j2

Vi kan bruke kommentaren @ Log4j2 for å bruke Log4j2 direkte. Så, vi gjør en enkel endring av LombokLoggingController å bruke @ Log4j2 i stedet for @ Slf4j eller @CommonsLog:

@RestController @ Log4j2 offentlig klasse LombokLoggingController {@RequestMapping ("/ lombok") offentlig strengindeks () {log.trace ("A TRACE Message"); log.debug ("A DEBUG Message"); log.info ("En INFO-melding"); log.warn ("A WARN Message"); log.error ("En FEIL-melding"); returner "Howdy! Sjekk ut loggene for å se utdataene ..."; }} 

Annet enn logging, er det andre kommentarer fra Lombok som hjelper med å holde koden vår ren og ryddig. Mer informasjon om dem er tilgjengelig i Introduksjon til Project Lombok, og vi har også en veiledning om å sette opp Lombok With Eclipse og IntelliJ.

8. Vokt deg for Java Util Logging

Spring Boot støtter også JDK-logging, gjennom logging.egenskaper konfigurasjonsfil.

Det er tilfeller der det ikke er en god ide å bruke den. Fra dokumentasjonen:

Det er kjente problemer med klasselasting med Java Util Logging som forårsaker problemer når du kjører fra en 'kjørbar krukke'. Vi anbefaler at du unngår det når du kjører fra en 'kjørbar krukke' hvis det er mulig.

Det er også en god praksis når du bruker Spring 4 til å ekskludere manuelt commons-logging i pom.xml, for å unngå potensielle sammenstøt mellom loggbibliotekene. Spring 5 håndterer den i stedet automatisk, så vi trenger ikke gjøre noe når du bruker Spring Boot 2.

9. JANSI på Windows

Mens Unix-baserte operativsystemer som Linux og Mac OS X støtter ANSI-fargekoder som standard, på en Windows-konsoll, vil alt dessverre være monokromatisk.

Windows kan få ANSI-farger gjennom et bibliotek som heter JANSI.

Vi bør imidlertid være oppmerksomme på de mulige ulempene i klassen.

Vi må importere og eksplisitt aktivere den i konfigurasjonen som følger:

Tilbakekobling:

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

Log4j2:

ANSI escape-sekvenser støttes naturlig på mange plattformer, men er ikke som standard på Windows. For å aktivere ANSI-støtte, legg Jansi jar til applikasjonen vår og angi eiendom log4j.skipJansi til falsk. Dette gjør at Log4j kan bruke Jansi til å legge til ANSI-rømningskoder når du skriver til konsollen.

Merk: Før Log4j 2.10 var Jansi aktivert som standard. Det faktum at Jansi krever innfødt kode, betyr det Jansi kan bare lastes av en enkeltklasser. For webapplikasjoner betyr dette Jansi-krukken må være i nettbeholderens klassevei. For å unngå å forårsake problemer for webapplikasjoner, prøver Log4j ikke lenger automatisk å laste Jansi uten eksplisitt konfigurasjon fra Log4j 2.10 og utover.

Det er også verdt å merke seg:

  • Layoutdokumentasjonssiden inneholder nyttige Log4j2 JANSI-informasjon i uthev {mønster} {stil} seksjon.
  • Mens JANSI kan farge utgangen, er Spring Boot's Banner (innfødt eller tilpasset gjennom banner.txt fil) forblir monokromatisk.

10. Konklusjon

Vi har sett de viktigste måtene å grensesnitt med de store loggerammene fra et Spring Boot-prosjekt.

Vi undersøkte også de viktigste fordelene og fallgruvene ved hver løsning.

Som alltid er hele kildekoden tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found