"Oh, daar ben je! Weet je nog dat we vandaag weer een les hebben?"

"Nee, ik was gewoon naar je op zoek. Bijna..."

"Uitstekend, laten we dan beginnen. Vandaag wil ik je vertellen over houtkap."

"Het logboek is een lijst met de gebeurtenissen die hebben plaatsgevonden. Bijna als een scheepslogboek of een dagboek. Of Twitter - misschien kun je je daar beter in vinden. Het is niet verwonderlijk dat een logger een object is dat je gebruikt om te loggen."

"Bij programmeren is het gebruikelijk om bijna alles te loggen. En in Java loggen we alles en zelfs een beetje meer."

"Feit is dat Java-programma's heel vaak grote serverapplicaties zijn zonder UI, console, enz. Ze verwerken duizenden gebruikersverzoeken tegelijkertijd en er zijn vaak verschillende fouten. Vooral wanneer verschillende threads met elkaar beginnen te interfereren."

"In feite is de enige manier om in deze omstandigheden te zoeken naar zelden reproduceerbare bugs en mislukkingen, het loggen van alles wat er in elke thread gebeurt."

"Meestal bevat het logboek informatie over methodeargumenten, eventuele gevonden fouten en veel tussentijdse informatie."

"Hoe completer het logboek, hoe gemakkelijker het is om een ​​reeks gebeurtenissen te reproduceren en de oorzaken van storingen of bugs op te sporen."

"Soms bereiken logs meerdere gigabytes per dag. Dit is normaal."

"Een paar gigabytes? O_o"

"Ja. Meestal worden logbestanden automatisch gearchiveerd, met vermelding van de relevante datum."

"Wauw."

"Uh-huh. Aanvankelijk had Java geen eigen logger. Als resultaat werden er verschillende onafhankelijke loggers geschreven. De meest voorkomende hiervan was log4j."

"Een paar jaar later kreeg Java een eigen logger, maar de functionaliteit was veel minder en werd niet veel gebruikt."

"Het is een feit dat Java een officiële logger heeft, maar de hele gemeenschap van Java-programmeurs gebruikt liever andere loggers. "

"Later zijn er nog een aantal loggers geschreven op basis van log4j."

"Toen werd de speciale universele logger slf4j, die nu veel wordt gebruikt, voor hen allemaal geschreven. Het lijkt erg op log4j, dus ik zal het als voorbeeld gebruiken bij het uitleggen van logging."

"Het hele logproces bestaat uit drie delen."

" Verzamel eerst informatie."

" Ten tweede , filter de verzamelde informatie."

" Ten derde , noteer de geselecteerde informatie."

"Laten we beginnen met verzamelen. Hier is een typisch voorbeeld van een klasse die logt:"

Klasse met loggen
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;
  }
 }
}

"Let op de rood gemarkeerde woorden."

" Regel 3  – Maak het logger- object. Zo'n statisch object wordt in bijna elke klasse gemaakt! Nou ja, behalve klassen die niets anders doen dan gegevens opslaan."

" LoggerFactory is een speciale klasse voor het maken van loggers, en getLogger is een van de statische methoden. Het huidige object wordt meestal doorgegeven, maar er zijn verschillende opties mogelijk."

" Regel 7 – Informatie over de methodeaanroep wordt naar de logger geschreven. Merk op dat dit de eerste regel van de methode is. Zodra de methode wordt aangeroepen, schrijven we onmiddellijk informatie naar de log."

"We noemen de debug-methode, wat betekent dat het belang van de informatie op DEBUG-niveau ligt. Dit wordt gebruikt om te filteren. Daar vertel ik je over een paar minuten over."

" Regel 17 - We vangen een uitzondering op en ... schrijven deze onmiddellijk naar het logboek! Dit is precies wat er moet gebeuren. "

"Deze keer noemen we de foutmethode, die meteen aangeeft dat de informatie op ERROR-niveau is"

Logger - 1

'Voorlopig lijkt alles duidelijk. Nou ja, voor zover het midden in ons gesprek duidelijk kan zijn.'

"Geweldig, laten we dan verder gaan met het filteren van berichten."

"Meestal heeft elk logbericht zijn eigen belangrijkheidsniveau, dat u kunt gebruiken om sommige berichten te verwijderen. Hier zijn de belangrijkheidsniveaus die ik noemde:"

Belang niveau Beschrijving
ALLE Alle berichten
SPOOR Fijnmazige foutopsporingsberichten
DEBUGGEN Belangrijke foutopsporingsberichten
INFO Informatieve berichten
WAARSCHUWEN Waarschuwingen
FOUT Fouten
FATAAL Fatale fouten
UIT Geen berichten

Deze niveaus worden ook gebruikt bij het filteren van berichten.

Stel dat u het logboekniveau instelt op WARN. Dan worden alle berichten die minder belangrijk zijn dan WARN verwijderd: TRACE, DEBUG, INFO.

Als u het filterniveau instelt op FATAL, worden zelfs ERROR-berichten verwijderd.

"Er worden nog twee belangrijkheidsniveaus gebruikt bij het filteren: UIT, waarmee alle berichten worden verwijderd; en ALLE, waarmee alle berichten worden weergegeven (niets wordt verwijderd)."

"Hoe en waar stel ik filteren in?"

"Ik zal het je zonder verder oponthoud vertellen."

"Meestal worden log4j-loggerinstellingen opgegeven in het log4j.properties-bestand."

U kunt in dit bestand meerdere appender-objecten specificeren. Er worden gegevens naar deze objecten geschreven. Er zijn gegevensbronnen en er zijn appenders - objecten die tegengestelde doelen hebben. Objecten waar gegevens in stromen als water.

"Hier zijn enkele voorbeelden:"

Inloggen op de console
# 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}

Regels 1 en 4 - Dit zijn opmerkingen

Regel 2 – We geven het logniveau aan dat we willen. Alle minder belangrijke niveaus (DEBUG, TRACE) worden verwijderd.

Op dezelfde plaats voegen we een komma toe en geven vervolgens de naam aan van het object (dat we zelf bedenken) waarnaar het logboek zal worden geschreven. Regels 5-9 bevatten de instellingen.

Regel 5 – We specificeren het type appender ( ConsoleAppender ).

Regel 6 – We geven precies aan waar we schrijven ( System.out. ).

Regel 7 – We stellen de klasse in die de conversiepatronen beheert (PatternLayout).

Regel 8 – We stellen het conversiepatroon in dat zal worden gebruikt voor schrijven. In het bovenstaande voorbeeld is dit de datum en tijd.

"En zo ziet schrijven naar een bestand eruit:"

Aanmelden bij een bestand
# 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

"Regel 2 stelt het berichtfilterniveau en de naam van het appender-object (sink) in."

"Regel 5 - We specificeren het type bestandstoevoeging ( RollingFileAppender )."

"Regel 6 - We specificeren de naam van het bestand waarnaar het logboek zal worden geschreven."

"Regel 7 - We specificeren de maximale loggrootte. Wanneer deze limiet wordt overschreden, wordt een nieuw bestand gemaakt."

"Regel 8 - We specificeren het aantal oude logbestanden dat moet worden opgeslagen."

"Regels 9-10 - Stel het conversiepatroon in."

'Ik weet niet wat hier gebeurt, maar ik kan het wel raden. Dat is bemoedigend.'

"Dat is geweldig. Dan is hier een voorbeeld van hoe je een log naar een bestand en de console schrijft:"

Aanmelden bij de console en een bestand
# 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, dus dat kan? Dat is geweldig!"

"Ja. Je kunt zoveel appenders declareren als je wilt en ze allemaal aanpassen."

Bovendien kan elke appender zeer flexibele instellingen hebben voor het filteren van berichten. We kunnen niet alleen een individueel filterniveau voor berichten toewijzen aan elke appender, maar we kunnen ook berichten per pakket filteren! Daarom moet je een klasse specificeren bij het maken van een logger (ik heb het over LoggerFactory.getLogger ).

"Bijvoorbeeld:"

Aanmelden bij de console en een bestand
# 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

"Regels 6 en 15 - We stellen ons eigen filterniveau in voor elke appender."

"Regels 20-23 - We specificeren de pakketnaam en het filterniveau voor zijn berichten. Log4j.logger is een voorvoegsel: de pakketnaam is oranje gemarkeerd."

"Echt waar? Dat kan zelfs. Nou, cool!"

"Trouwens, noch log4j noch slf4j zijn opgenomen in de JDK. Je moet ze apart downloaden. Dat kan hier . Maar er is een andere manier:"

" Stap 1 .Voeg import toe aan de klas:"

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

" Stap 2. Plaats de cursor op deze regels en druk op Alt+Enter in IntelliJ IDEA"

" Stap 3 . Kies het menu-item 'Bestandsbestand op web'.'

" Stap 4. Kies 'slf4j-log4j13.jar'"

" Stap 5. Specificeer waar u de bibliotheek (jar) wilt downloaden"

" Stap 6. Gebruik de klassen die je nodig hebt."

"Ho! Wat een dag is dit geweest. Zoveel nieuws en zoveel cools!"

"Hier is nog een goed artikel over logboekregistratie: https://docs.oracle.com/javase/10/core/java-logging-overview.htm#JSCOR-GUID-48004124-2C00-49F7-A640-0C0DDA271DBC "

"Oké, zo is het genoeg. Rustig aan, programmeur."