"Ó, itt vagy! Emlékszel arra, hogy ma van egy újabb leckénk?"

– Nem, csak téged kerestelek. Majdnem…

"Remek, akkor kezdjük. Ma a fakitermelésről szeretnék mesélni."

"A napló a megtörtént események listája. Majdnem olyan, mint egy hajónapló vagy egy napló. Vagy a Twitter – talán jobban kapcsolódhat ehhez. Nem meglepő módon a logger egy olyan objektum, amelyet naplózásra használ."

"A programozásban az a szokás, hogy szinte mindent naplózunk. A Java-ban pedig mindent és még egy kicsit többet is naplózunk."

"Az tény, hogy a Java programok nagyon gyakran nagy szerveralkalmazások UI, konzol stb. nélkül. Egyszerre több ezer felhasználói kérést dolgoznak fel, és gyakran előfordulnak különféle hibák. Főleg, ha a különböző szálak kezdik zavarni egymást."

"Valójában az egyetlen módja annak, hogy ilyen körülmények között ritkán reprodukálható hibákat és hibákat keressünk, az az, hogy minden szálon naplózza az eseményeket."

"Leggyakrabban a napló információkat tartalmaz a metódus argumentumáról, az esetleges elkapott hibákról és sok köztes információt."

"Minél teljesebb a napló, annál könnyebben reprodukálható az események sorozata, és nyomon követhető a hibák vagy hibák okai."

"Néha a naplók elérik a napi több gigabájtot. Ez normális."

"Néhány gigabájt? O_o"

"Igen. A naplófájlokat leggyakrabban a rendszer automatikusan archiválja, a megfelelő dátum feltüntetésével."

– Hú.

"Húúúú. Kezdetben a Java-nak nem volt saját naplózója. Ennek eredményeként több független naplózó is készült. Ezek közül a leggyakoribb a log4j volt."

"Néhány évvel később a Java kapott egy saját loggert, de a funkcionalitása jóval gyengébb volt, és nem használták széles körben."

"Tény, hogy a Java-nak van hivatalos naplózója, de a Java programozók teljes közössége előszeretettel használ más naplózókat. "

"Később több log4j alapján több logger is készült."

"Aztán mindegyikhez megírták a speciális univerzális, ma már széles körben használt slf4j loggert. Nagyon hasonlít a log4j-hez, ezért a naplózás elmagyarázásakor ezt használom példaként."

"A teljes fakitermelési folyamat három részből áll."

" Először is gyűjts információkat."

" Másodszor szűrje le az összegyűjtött információkat."

" Harmadszor , rögzítse a kiválasztott információkat."

"Kezdjük a gyűjtéssel. Íme egy tipikus példa egy osztályra, amely naplózza:"

Osztály fakitermeléssel
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;
  }
 }
}

– Figyeljen a pirossal kiemelt szavakra!

" 3. sor  – A naplózó objektum létrehozása. Ilyen statikus objektum szinte minden osztályban létrejön! Nos, kivéve azokat az osztályokat, amelyek az adatok tárolásán kívül nem csinálnak mást."

" A LoggerFactory egy speciális osztály a naplózók létrehozására, a getLogger pedig az egyik statikus metódusa. Általában az aktuális objektum átadásra kerül, de többféle lehetőség is lehetséges."

" 7. sor – A metódushívás információi beírásra kerülnek a naplózóba. Vegye figyelembe, hogy ez a metódus első sora. A metódus meghívásakor azonnal információkat írunk a naplóba."

"Mi a debug módszert hívjuk, ami azt jelenti, hogy az információ fontossága DEBUG szint. Ezt használják szűrésre. Pár perc múlva elmondom."

" 17. sor – Elkapunk egy kivételt és... azonnal írjuk a naplóba! Pontosan ezt kell tenni."

"Ezúttal a hibamódszert hívjuk, amely azonnal jelzi, hogy az információ HIBA szintű"

Logger - 1

"Egyelőre minden világosnak tűnik. Nos, amennyire ez a beszélgetésünk közepén világos lehet."

– Remek, akkor térjünk át az üzenetszűrésre.

"Általában minden naplóüzenetnek megvan a maga fontossági szintje, amellyel elvethet néhány üzenetet. Íme, az általam említett fontossági szintek:

Fontossági szint Leírás
MINDEN Minden üzenet
NYOM Finomszemcsés hibakeresési üzenetek
DEBUG Fontos hibakeresési üzenetek
INFO Tájékoztató üzenetek
FIGYELMEZTET Figyelmeztetések
HIBA Hibák
HALÁLOS Végzetes hibák
KI Nincsenek üzenetek

Ezeket a szinteket az üzenetek szűrésekor is használják.

Tegyük fel, hogy a naplózási szintet WARN értékre állítja. Ekkor a WARN-nál kevésbé fontos üzenetek el lesznek vetve: TRACE, DEBUG, INFO.

Ha a szűrési szintet FATAL-ra állítja, akkor még az ERROR üzenetek is el lesznek vetve.

"A szűrésnél még két fontossági szint használatos: KI, amely minden üzenetet elvet; és ALL, amely az összes üzenetet mutatja (semmi sem kerül elvetésre)."

"Hogyan és hol állíthatom be a szűrést?"

– Minden további nélkül elmondom.

"Általában a log4j naplózó beállításai a log4j.properties fájlban vannak megadva."

Ebben a fájlban több hozzáfűző objektumot is megadhat. Az adatok ezekre az objektumokra íródnak. Vannak adatforrások, és vannak hozzáfűzők – olyan objektumok, amelyeknek ellentétes célja van. Objektumok, amelyekbe az adatok vízként áramlanak.

"Íme néhány példa:"

Naplózás a konzolra
# 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}

1. és 4. sor – Ezek megjegyzések

2. sor – Jelöljük a kívánt naplózási szintet. Minden kevésbé fontos szint (DEBUG, TRACE) el lesz dobva.

Ugyanitt vesszőt adunk, majd megadjuk annak az objektumnak a nevét (amit magunk találunk ki), amelyre a napló írni fog. Az 5-9. sorok a beállításokat tartalmazzák.

5. sor – Megadjuk a hozzáfűző típusát ( ConsoleAppender ).

6. sor – Pontosan jelezzük, hogy hova írunk ( System.out. ).

7. sor – Beállítjuk az osztályt, amely kezeli a konverziós mintákat (PatternLayout).

8. sor – Beállítjuk az íráshoz használt konverziós mintát. A fenti példában ez a dátum és az idő.

"És így néz ki egy fájlba írás:"

Naplózás egy fájlba
# 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

"A 2. sor beállítja az üzenetszűrési szintet és a hozzáfűző objektum (nyelő) nevét."

"5. sor – Megadjuk a fájlhozzáfűző típusát ( RollingFileAppender )."

"6. sor – Megadjuk annak a fájlnak a nevét, amelybe a napló kerül írni."

"7. sor – Meghatározzuk a maximális naplóméretet. A méretkorlát túllépése esetén új fájl jön létre."

"8. sor – Meghatározzuk a tárolandó régi naplófájlok számát."

"9-10. sor – Állítsa be az átalakítási mintát."

– Nem tudom, mi történik itt, de sejthetem. Ez biztató.

"Ez nagyszerű. Akkor itt van egy példa arra, hogyan kell naplót írni egy fájlba és a konzolba:"

Naplózás a konzolra és egy fájlra
# 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, szóval meg tudod csinálni? Ez nagyszerű!"

"Igen. Annyi függeléket deklarálhat, amennyit csak akar, és mindegyiket testreszabhatja."

Ezen túlmenően minden egyes csatoló nagyon rugalmas beállításokkal rendelkezhet az üzenetszűréshez. Nem csak az egyes mellékletekhez rendelhetünk egyedi üzenetszűrési szintet, hanem csomagonként is szűrhetjük az üzeneteket! Emiatt meg kell adni egy osztályt a naplózó készítésekor ( a LoggerFactory.getLoggerről beszélek ).

"Például:"

Naplózás a konzolra és egy fájlra
# 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

"6. és 15. sor – Minden egyes függelékhez saját szűrési szintet állítunk be."

"20-23. sor – Megadjuk a csomag nevét és az üzeneteinek szűrési szintjét. A Log4j.logger egy előtag: a csomag neve narancssárgával van kiemelve."

"Tényleg? Még azt is megteheti. Nos, klassz!"

"Egyébként sem log4j, sem slf4j nem szerepel a JDK-ban. Ezeket külön kell letölteni. Itt megteheti . De van egy másik mód is:"

" 1. lépés . Importálás hozzáadása az osztályhoz:"

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

" 2. lépés . Vigye a kurzort ezekre a sorokra, és nyomja meg az Alt+Enter billentyűket az IntelliJ IDEA alkalmazásban"

" 3. lépés . Válassza a "File jar on web" menüpontot.

" 4. lépés . Válassza az "slf4j-log4j13.jar" lehetőséget

" 5. lépés . Adja meg, hol töltse le a könyvtárat (jar)"

" 6. lépés . Használja a szükséges osztályokat."

"Hűha! Micsoda nap volt ez. Annyi újdonság és annyira klassz!"

"Íme egy másik jó cikk a naplózásról: https://docs.oracle.com/javase/10/core/java-logging-overview.htm#JSCOR-GUID-48004124-2C00-49F7-A640-0C0DDA271DBC "

"Rendben, elég volt. Menj nyugi, programozó."