Introduksjon til Java Logging

1. Oversikt

Logging er et kraftig hjelpemiddel for å forstå og feilsøke programmets kjøretid. Logger fanger opp og vedvarer viktige data og gjør dem tilgjengelige for analyse når som helst.

Denne artikkelen diskuterer de mest populære java-loggerammene, Log4j 2 og Logback, sammen med forgjengeren Log4j, og berører kort SLF4J, en loggingsfasade som gir et felles grensesnitt for forskjellige loggerammer.

2. Aktivere logging

Alle loggerammene som er diskutert i artikkelen deler forestillingen om loggere, appenders og layouts. Aktivering av logging i prosjektet følger tre vanlige trinn:

  1. Legger til nødvendige biblioteker
  2. Konfigurasjon
  3. Plassere logguttalelser

De kommende avsnittene diskuterer trinnene for hvert rammeverk individuelt.

3. Log4j 2

Log4j 2 er en ny og forbedret versjon av Log4j-loggingsrammeverket. Den mest overbevisende forbedringen er muligheten for asynkron logging. Log4j 2 krever følgende biblioteker:

 org.apache.logging.log4j log4j-api 2.6.1 org.apache.logging.log4j log4j-core 2.6.1 

Siste versjon av log4j-api finner du her og log4j-kjerne - her.

3.1. Konfigurasjon

Konfigurering av Log4j 2 er basert på hovedkonfigurasjonen log4j.xml fil. Den første tingen å konfigurere er appender.

Disse bestemmer hvor loggmeldingen skal sendes. Destinasjonen kan være en konsoll, en fil, stikkontakt osv.

Log4j 2 har mange appenders for forskjellige formål, du kan finne mer informasjon på det offisielle Log4j 2-nettstedet.

La oss ta en titt på et enkelt konfigurasjonseksempel:

Du kan angi et navn for hver appender, for eksempel bruk navn konsoll i stedet for stdout.

Legg merke til Mønsteroppsett element - dette bestemmer hvordan meldingen skal se ut. I vårt eksempel settes mønsteret ut fra mønster param, hvor % d bestemmer datomønster, % s - utdata fra loggnivå, % m - utdata fra logget melding og % n - legger til nytt linjesymbol. Mer informasjon om mønster finner du på den offisielle Log4j 2-siden.

Endelig - for å aktivere en appender (eller flere) må du legge den til seksjon:

3.2. Logger på fil

Noen ganger må du bruke logging til en fil, så vi vil legge til feil logger til vår konfigurasjon:

   % d {åååå-MM-dd HH: mm: ss}% -5p% m% nw 

De Fil appender har flere parametere som kan konfigureres:

  • fil - bestemmer filnavnet til loggfilen
  • legge til - Standardverdien for denne parameteren er sann, noe som betyr at som standard a Fil appender vil legge til en eksisterende fil og ikke trunke den.
  • Mønsteroppsett som ble beskrevet i forrige eksempel.

For å aktivere Fil appender må du legge den til seksjon:

3.3. Asynkron logging

Hvis du vil gjøre Log4j 2 asynkron, må du legge til LMAX disruptor-biblioteket til pom.xml. LMAX disruptor er et låsfritt kommunikasjonsbibliotek mellom trådene.

Legger til disruptor i pom.xml:

 com.lmax disruptor 3.3.4 

Siste versjon av disruptor finner du her.

Hvis du vil bruke LMAX disruptor, må du bruke den i stedet for i konfigurasjonen din.

Eller du kan aktivere asynkron logging ved å angi systemegenskapen Log4jContextSelector til org.apache.logging.log4j.core.async.AsyncLoggerContextSelector.

Du kan selvfølgelig lese mer om konfigurasjonen av Log4j2 async logger og se noen ytelsesdiagrammer på den offisielle Log4j2-siden.

3.4. Bruk

Følgende er et enkelt eksempel som demonstrerer bruken av Log4j for logging:

importer org.apache.logging.log4j.Logger; importer org.apache.logging.log4j.LogManager; offentlig klasse Log4jExample {privat statisk loggerlogger = LogManager.getLogger (Log4jExample.class); public static void main (String [] args) {logger.debug ("Feilsøkingsloggmelding"); logger.info ("Informasjonsloggmelding"); logger.error ("Feilloggmelding"); }}

Etter kjøring vil applikasjonen logge følgende meldinger til både konsoll og filnavn baeldung.log:

2016-06-16 17:02:13 INFO Info loggmelding 2016-06-16 17:02:13 FEIL Feilloggmelding

Hvis du hever rotloggnivået til FEIL:

Utgangen vil se slik ut:

2016-06-16 17:02:13 FEIL Feilloggmelding

Som du kan se, endres loggnivået til øvre parameter, fører til at meldingene med lavere loggnivå ikke blir skrevet ut til appenders.

Metode logger.error kan også brukes til å logge et unntak som oppstod:

prøv {// Her kan noen unntak kastes} catch (Unntak e) {logger.error ("Feilloggmelding", kastbar); }

3.5. Pakke nivå konfigurasjon

La oss si at du må vise meldinger med loggnivået TRACE - for eksempel fra en bestemt pakke som f.eks com.baeldung.log4j2:

logger.trace ("Trace log message");

For alle andre pakker vil du bare logge INFO-meldinger.

Husk at TRACE er lavere enn rotloggnivået INFO som vi spesifiserte i konfigurasjonen.

For å aktivere logging bare for en av pakkene, må du legge til følgende avsnitt før til din log4j.xml:

Det vil gjøre det mulig å logge for com.baeldung.log4j pakken og utdataene dine vil se ut som:

2016-06-16 17:02:13 TRACE Sporloggmelding 2016-06-16 17:02:13 DEBUG Feilsøkingsloggmelding 2016-06-16 17:02:13 INFO Info loggmelding 2016-06-16 17:02 : 13 FEIL Feilloggmelding

4. Tilbakekobling

Logback er ment å være en forbedret versjon av Log4j, utviklet av samme utvikler som laget Log4j.

Logback har også mange flere funksjoner sammenlignet med Log4j, med mange av dem som også blir introdusert i Log4j 2. Her ser du raskt på fordelene med Logback på det offisielle nettstedet.

La oss starte med å legge til følgende avhengighet til pom.xml:

 ch.qos.logback logback-classic 1.1.7 

Denne avhengigheten vil trekke inn ytterligere to avhengigheter, den logback-core og slf4j-api. Merk at den nyeste versjonen av Logback finner du her.

4.1. Konfigurasjon

La oss nå se på et eksempel på Logback-konfigurasjon:

 # Console appender # Pattern of log message for console appender% d {yyyy-MM-dd HH: mm: ss}% -5p% m% n # File appender baeldung.log false # Pattern of log message for file appender% d { åååå-MM-dd HH: mm: ss}% -5p% m% n # Overstyr loggnivå for spesifisert pakke 

Logback bruker SLF4J som grensesnitt, så du må importere SLF4J Logger og LoggerFactory.

4.2. SLF4J

SLF4J gir et felles grensesnitt og abstraksjon for de fleste Java-loggerammene. Det fungerer som en fasade og gir standardisert API for å få tilgang til de underliggende funksjonene i loggingsrammeverket.

Logback bruker SLF4J som native API for funksjonaliteten. Følgende er eksemplet ved bruk av logglogging:

importer org.slf4j.Logger; importer org.slf4j.LoggerFactory; offentlig klasse Log4jExample {privat statisk loggerlogger = LoggerFactory.getLogger (Log4jExample.class); public static void main (String [] args) {logger.debug ("Feilsøkingsloggmelding"); logger.info ("Informasjonsloggmelding"); logger.error ("Feilloggmelding"); }}

Utgangen forblir den samme som i tidligere eksempler.

5. Log4J

Til slutt, la oss ta en titt på det ærverdige Log4j-loggingsrammeverket.

På dette tidspunktet er det selvfølgelig utdatert, men verdt å diskutere da det legger grunnlaget for sine mer moderne etterfølgere.

Mange av konfigurasjonsdetaljene samsvarer med de som er diskutert i Log4j 2-delen.

5.1. Konfigurasjon

Først og fremst må du legge til Log4j-biblioteket i prosjektene dine pom.xml:

 log4j log4j 1.2.17 

Her bør du kunne finne den nyeste versjonen av Log4j.

La oss se på et komplett eksempel på enkel Log4j-konfigurasjon med bare en konsollappender:

er åpen tagg for hele konfigurasjonen som har en egenskap - feilsøke. Det avgjør om du vil legge til Log4j feilsøkingsinformasjon i loggene.

5.2. Bruk

Etter at du har lagt til Log4j bibliotek og konfigurasjon, kan du bruke logger i koden din. La oss ta en titt på et enkelt eksempel:

importer org.apache.log4j.Logger; offentlig klasse Log4jExample {privat statisk loggerlogger = Logger.getLogger (Log4jExample.class); public static void main (String [] args) {logger.debug ("Feilsøkingsloggmelding"); logger.info ("Informasjonsloggmelding"); logger.error ("Feilloggmelding"); }}

6. Konklusjon

Denne artikkelen viser veldig enkle eksempler på hvordan du kan bruke forskjellige loggingsrammeverk som Log4j, Log4j2 og Logback. Den dekker enkle konfigurasjonseksempler for alle de nevnte rammene.

Eksemplene som følger artikkelen finner du på GitHub.


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