"Å, der er du! Har du husket at vi har en ny leksjon i dag?"

"Nei, jeg var bare ute etter deg. Nesten..."

"Utmerket, så la oss begynne. I dag vil jeg fortelle deg om tømmerhogst."

"Loggen er en liste over hendelsene som har skjedd. Nesten som en skipslogg eller en dagbok. Eller Twitter - kanskje du kan forholde deg bedre til det. Ikke overraskende er en logger et objekt du bruker til logging."

"I programmering er det vanlig å logge nesten alt. Og i Java logger vi alt og enda litt til."

"Faktum er at Java-programmer veldig ofte er store serverapplikasjoner uten brukergrensesnitt, konsoll osv. De behandler tusenvis av brukerforespørsler samtidig, og det er ofte forskjellige feil. Spesielt når forskjellige tråder begynner å forstyrre hverandre."

"Faktisk er den eneste måten å søke etter sjeldent reproduserbare feil og feil under disse omstendighetene å logge alt som skjer på hver tråd."

"Oftest inneholder loggen informasjon om metodeargumenter, eventuelle fanget feil og mye mellomliggende informasjon."

"Jo mer fullstendig loggen er, jo lettere er det å reprodusere en sekvens av hendelser og spore årsakene til feil eller feil."

"Noen ganger når logger flere gigabyte per dag. Dette er normalt."

"Noen få gigabyte? O_o"

"Japp. Oftest blir loggfiler automatisk arkivert, med indikasjon på den aktuelle datoen."

"Wow."

"Uh-he. I utgangspunktet hadde ikke Java sin egen logger. Som et resultat ble det skrevet flere uavhengige loggere. Den vanligste av disse var log4j."

"Noen år senere fikk Java en egen logger, men funksjonaliteten var langt dårligere og den ble ikke mye brukt."

"Det er et faktum at Java har en offisiell logger, men hele fellesskapet av Java-programmerere foretrekker å bruke andre loggere. "

"Senere ble det skrevet flere loggere basert på log4j."

"Da ble den spesielle universalloggeren slf4j, som nå er mye brukt, skrevet for dem alle. Den ligner veldig på log4j, så jeg skal bruke den som et eksempel når jeg skal forklare logging."

"Hele loggingsprosessen består av tre deler."

" Først samle informasjon."

" For det andre , filtrer den innsamlede informasjonen."

" For det tredje , ta opp den valgte informasjonen."

"La oss starte med innsamling. Her er et typisk eksempel på en klasse som logger:"

Klasse med logging
class Manager
{
 private static final Logger logger = LoggerFactory.getLogger(Manager.class);

 public boolean processTask(Task task)
 {
  logger.debug("processTask id = " + task.getId());
  try
  {
   task.start();
   task.progress();
   task.complete();
   return true;
  }
  catch(Exception e)
  {
   logger.error("Unknown error", e);
   return false;
  }
 }
}

"Vær oppmerksom på ordene uthevet i rødt."

" Linje 3  – Lag loggerobjektet . Et slikt statisk objekt lages i nesten hver klasse! Vel, bortsett fra klasser som ikke gjør noe annet enn å lagre data."

" LoggerFactory er en spesiell klasse for å lage loggere, og getLogger er en av dens statiske metoder. Det gjeldende objektet er vanligvis bestått, men ulike alternativer er mulige."

" Linje 7 – Informasjon om metodekallet skrives til loggeren. Merk at dette er den første linjen i metoden. Så snart metoden kalles opp, skriver vi umiddelbart informasjon til loggen."

"Vi kaller feilsøkingsmetoden, som betyr at informasjonens viktighet er DEBUG-nivå. Dette brukes til filtrering. Jeg skal fortelle deg om det om et par minutter."

" Linje 17 – Vi fanger et unntak og... skriver det umiddelbart til loggen! Dette er nøyaktig hva som må gjøres."

"Denne gangen kaller vi feilmetoden, som umiddelbart indikerer at informasjonen er på ERROR-nivå"

Logger - 1

"Alt virker klart foreløpig. Vel, så langt det kan være klart midt i samtalen vår."

"Flott, la oss gå videre til meldingsfiltrering."

"Vanligvis har hver loggmelding sitt eget viktighetsnivå, som du kan bruke til å forkaste noen av meldingene. Her er viktighetsnivåene jeg nevnte:"

Viktighetsnivå Beskrivelse
ALLE Alle meldinger
SPOR Finmaskede feilsøkingsmeldinger
FEIL Viktige feilsøkingsmeldinger
INFO Informasjonsmeldinger
VARSLE Advarsler
FEIL Feil
FATAL Fatale feil
AV Ingen meldinger

Disse nivåene brukes også ved filtrering av meldinger.

Anta at du setter loggingsnivået til WARN. Da vil alle meldinger som er mindre viktige enn WARN bli forkastet: TRACE, DEBUG, INFO.

Hvis du setter filtreringsnivået til FATAL, vil til og med FEIL-meldinger bli forkastet.

"Det er ytterligere to viktighetsnivåer som brukes ved filtrering: AV, som forkaster alle meldinger; og ALL, som viser alle meldinger (ingenting er forkastet)."

"Hvordan og hvor setter jeg opp filtrering?"

"Jeg skal fortelle deg det uten videre."

"Vanligvis er log4j loggerinnstillinger spesifisert i log4j.properties-filen."

Du kan spesifisere flere vedleggsobjekter i denne filen. Data skrives til disse objektene. Det er datakilder, og det er vedlegg - objekter som har motsatte formål. Objekter som data strømmer inn i som vann.

"Her er noen eksempler:"

Logger til konsollen
# Root logger option
log4j.rootLogger = INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

Linje 1 og 4 – Dette er kommentarer

Linje 2 – Vi angir loggingsnivået vi ønsker. Alle mindre viktige nivåer (DEBUG, TRACE) vil bli forkastet.

På samme sted legger vi til et komma og angir deretter navnet på objektet (som vi selv finner på) som loggen skal skrives til. Linje 5-9 inneholder innstillingene.

Linje 5 – Vi spesifiserer typen vedlegg ( ConsoleAppender ).

Linje 6 – Vi angir nøyaktig hvor vi skriver ( System.out. ).

Linje 7 – Vi setter klassen som skal administrere konverteringsmønstre (PatternLayout).

Linje 8 – Vi setter konverteringsmønsteret som skal brukes til å skrive. I eksemplet ovenfor er det dato og klokkeslett.

"Og her er hvordan skriving til en fil ser ut:"

Logger til en fil
# Root logger option
log4j.rootLogger = INFO, file

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

"Linje 2 angir meldingsfiltreringsnivået og navnet på vedleggsobjektet (vasken)."

"Linje 5 – Vi spesifiserer filtilleggstypen ( RollingFileAppender )."

"Linje 6 – Vi spesifiserer navnet på filen som loggen skal skrives til."

"Linje 7 – Vi spesifiserer maksimal loggstørrelse. Når denne størrelsesgrensen overskrides, opprettes en ny fil."

"Linje 8 – Vi angir antall gamle loggfiler som skal lagres."

"Linje 9-10 – Angi konverteringsmønsteret."

"Jeg vet ikke hva som skjer her, men jeg kan gjette det. Det er oppmuntrende."

"Det er flott. Så her er et eksempel på hvordan du skriver en logg til en fil og konsollen:"

Logger til konsollen og en fil
# Root logger option
log4j.rootLogger = INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

"Ah, så du kan gjøre det? Det er flott!"

"Jepp. Du kan deklarere så mange vedlegg du vil og tilpasse hver enkelt."

Videre kan hver vedlegg ha svært fleksible innstillinger for meldingsfiltrering. Ikke bare kan vi tilordne et individuelt meldingsfiltreringsnivå til hver vedlegg, men vi kan også filtrere meldinger etter pakke! Det er derfor du må spesifisere en klasse når du oppretter en logger (jeg snakker om LoggerFactory.getLogger ).

"For eksempel:"

Logger til konsollen og en fil
# Root logger option
log4j.rootLogger = INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.threshold = DEBUG
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold = ERROR
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

log4j.logger.org.springframework = ERROR
log4j.logger.org.hibernate = ERROR
log4j.logger.com.codegym = DEBUG
log4j.logger.org.apache.cxf = ERROR

"Linje 6 og 15 – Vi setter vårt eget filtreringsnivå for hver vedlegg."

"Linje 20-23 – Vi spesifiserer pakkenavnet og filtreringsnivået for meldingene. Log4j.logger er et prefiks: pakkenavnet er uthevet i oransje."

"Virkelig? Du kan til og med gjøre det. Vel, kult!"

"Forresten, verken log4j eller slf4j er inkludert i JDK. Du må laste dem ned separat. Du kan gjøre det her . Men det er en annen måte:"

" Trinn 1 .Legg til importer til klassen:"

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

" Trinn 2. Sett markøren på disse linjene og trykk Alt+Enter i IntelliJ IDEA"

" Trinn 3. Velg menyelementet "Filjar på nettet".

" Trinn 4. Velg 'slf4j-log4j13.jar'"

" Trinn 5. Spesifiser hvor du vil laste ned biblioteket (jar)"

" Trinn 6. Bruk klassene du trenger."

"Wow! For en dag dette har vært. Så mye som er nytt og så mye som er kult!"

"Her er en annen god artikkel om logging: https://docs.oracle.com/javase/10/core/java-logging-overview.htm#JSCOR-GUID-48004124-2C00-49F7-A640-0C0DDA271DBC "

"Ok, det er nok. Slapp av, programmerer."