"Oh, iată-te! Ți-ai amintit că avem o altă lecție astăzi?"
"Nu, doar te cautam. Aproape..."
"Excelent, atunci să începem. Azi vreau să vă povestesc despre logare."
„Jurnalul este o listă a evenimentelor care s-au petrecut. Aproape ca un jurnal de navă sau un jurnal. Sau Twitter – poate vă puteți raporta mai bine la asta. Deloc surprinzător, un logger este un obiect pe care îl utilizați pentru înregistrare.”
"În programare, se obișnuiește să înregistrăm aproape totul. Și în Java, înregistrăm totul și chiar puțin mai mult."
„Adevărul este că programele Java sunt foarte adesea aplicații de server mari, fără interfață de utilizare, consolă etc. Ele procesează mii de solicitări ale utilizatorilor în același timp și apar adesea diverse erori. Mai ales atunci când fire diferite încep să interfereze între ele.”
„De fapt, singura modalitate de a căuta erori și eșecuri rareori reproductibile în aceste circumstanțe este să înregistrezi tot ceea ce se întâmplă pe fiecare fir.”
„Cel mai adesea, jurnalul conține informații despre argumentele metodei, orice erori detectate și multe informații intermediare.”
„Cu cât este mai complet jurnalul, cu atât este mai ușor să reproduci o secvență de evenimente și să urmărești cauzele defecțiunilor sau erorilor.”
„Uneori, jurnalele ajung la câțiva gigaocteți pe zi. Acest lucru este normal.”
„Câțiva gigaocteți? O_o”
"Da. Cel mai adesea, fișierele jurnal sunt arhivate automat, cu indicarea datei relevante."
— Uau.
"Uh-huh. Inițial, Java nu avea propriul său logger. Drept urmare, au fost scrise mai multe loggere independente. Cel mai comun dintre acestea a fost log4j."
„Câțiva ani mai târziu, Java a primit un logger propriu, dar funcționalitatea sa a fost cu mult inferioară și nu a fost utilizat pe scară largă”.
„Este un fapt că Java are un logger oficial, dar întreaga comunitate de programatori Java preferă să folosească alți logger. ”
„Mai târziu, au fost scrise mai multe loggeri pe baza log4j”.
„Atunci, pentru toate acestea a fost scris loggerul universal special slf4j, care este acum utilizat pe scară largă. Este foarte asemănător cu log4j, așa că îl voi folosi ca exemplu când explic înregistrarea.”
„Întregul proces de înregistrare constă din trei părți.”
„ În primul rând , colectează informații.”
„ În al doilea rând , filtrați informațiile colectate.”
„ În al treilea rând , înregistrați informațiile selectate.”
„Să începem cu colectarea. Iată un exemplu tipic de clasă care înregistrează:”
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;
}
}
}
„Fii atent la cuvintele evidențiate cu roșu”.
" Linia 3 – Creați obiectul logger . Un astfel de obiect static este creat în aproape fiecare clasă! Ei bine, cu excepția claselor care nu fac altceva decât să stocheze date."
" LoggerFactory este o clasă specială pentru crearea de loggere, iar getLogger este una dintre metodele sale statice. Obiectul curent este de obicei trecut, dar sunt posibile diferite opțiuni."
" Linia 7 – Informațiile despre apelul metodei sunt scrise în logger. Rețineți că aceasta este prima linie a metodei. De îndată ce metoda este apelată, scriem imediat informații în jurnal."
„Noi numim metoda de depanare, ceea ce înseamnă că importanța informațiilor este la nivelul DEBUG. Aceasta este folosită pentru filtrare. Vă voi spune despre asta în câteva minute.”
" Linia 17 – Prindem o excepție și... scriem imediat în jurnal! Acesta este exact ceea ce trebuie făcut."
„De data aceasta numim metoda de eroare, care indică imediat că informația este la nivel de EROARE”
"Totul pare clar deocamdată. Ei bine, în măsura în care poate fi clar în mijlocul conversației noastre."
„Bine, atunci să trecem la filtrarea mesajelor.”
„De obicei, fiecare mesaj de jurnal are propriul său nivel de importanță, pe care îl puteți folosi pentru a renunța la unele dintre mesaje. Iată nivelurile de importanță pe care le-am menționat:”
Nivel de importanță | Descriere |
---|---|
TOATE | Toate mesajele |
URMĂ | Mesaje fine de depanare |
DEBUG | Mesaje importante de depanare |
INFO | Mesaje informative |
A AVERTIZA | Avertizări |
EROARE | Erori |
FATAL | Erori fatale |
OFF | Fără mesaje |
Aceste niveluri sunt folosite și la filtrarea mesajelor.
Să presupunem că setați nivelul de înregistrare la WARN. Apoi toate mesajele care sunt mai puțin importante decât WARN vor fi eliminate: TRACE, DEBUG, INFO.
Dacă setați nivelul de filtrare la FATAL, atunci chiar și mesajele de EROARE vor fi eliminate.
„Există încă două niveluri de importanță utilizate la filtrare: OFF, care elimină toate mesajele; și ALL, care afișează toate mesajele (nimic nu este eliminat).”
„Cum și unde configurez filtrarea?”
— O să-ți spun fără alte prelungiri.
„De obicei, setările loggerului log4j sunt specificate în fișierul log4j.properties.”
Puteți specifica mai multe obiecte anexate în acest fișier. Datele sunt scrise pe aceste obiecte. Există surse de date și există anexe - obiecte care au scopuri opuse. Obiecte în care datele curg ca apa.
"Aici sunt cateva exemple:"
# 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}
Rândurile 1 și 4 – Acestea sunt comentarii
Linia 2 – Indicăm nivelul de înregistrare pe care îl dorim. Toate nivelurile mai puțin importante (DEBUG, TRACE) vor fi eliminate.
În același loc, adăugăm o virgulă și apoi indicăm numele obiectului (pe care îl găsim noi înșine) în care va fi scris jurnalul. Rândurile 5-9 conțin setările sale.
Linia 5 – Specificăm tipul de appender ( ConsoleAppender ).
Linia 6 – Indicăm exact unde scriem ( System.out. ).
Linia 7 – Am stabilit clasa care va gestiona modelele de conversie (PatternLayout).
Linia 8 – Am stabilit modelul de conversie care va fi folosit pentru scriere. În exemplul de mai sus, este data și ora.
„Și iată cum arată scrierea într-un fișier:”
# 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
„Linia 2 stabilește nivelul de filtrare a mesajelor și numele obiectului adjunct (chiuvetă).”
„Linia 5 – Specificăm tipul de fișier anexator ( RollingFileAppender ).”
„Linia 6 – Specificăm numele fișierului în care va fi scris jurnalul.”
"Linia 7 – Specificăm dimensiunea maximă a jurnalului. Când această limită de dimensiune este depășită, este creat un fișier nou."
„Linia 8 – Specificăm numărul de fișiere jurnal vechi care urmează să fie stocate.”
„Rândurile 9-10 – Setați modelul de conversie”.
"Nu știu ce se întâmplă aici, dar pot ghici. Asta este încurajator."
„Este grozav. Atunci iată un exemplu despre cum să scrieți un jurnal într-un fișier și pe consolă:”
# 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, deci poți face asta? E grozav!"
„Da. Puteți declara câte anexe doriți și îi puteți personaliza pe fiecare.”
În plus, fiecare anexă poate avea setări foarte flexibile pentru filtrarea mesajelor. Nu numai că putem atribui un nivel individual de filtrare a mesajelor fiecărui anexat, dar putem și filtra mesajele după pachet! De aceea trebuie să specificați o clasă atunci când creați un logger (vorbesc despre LoggerFactory.getLogger ).
"De exemplu:"
# 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
„Rândurile 6 și 15 – Ne setăm propriul nivel de filtrare pentru fiecare anexă.”
„Rândurile 20-23 – Specificăm numele pachetului și nivelul de filtrare pentru mesajele acestuia. Log4j.logger este un prefix: numele pachetului este evidențiat în portocaliu.”
"Serios? Poți chiar să faci asta. Ei bine, tare!"
"Apropo, nici log4j, nici slf4j nu sunt incluse în JDK. Va trebui să le descărcați separat. Puteți face asta aici . Dar există o altă modalitate:"
" Pasul 1. Adăugați importuri la clasă:"
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
" Pasul 2. Pune cursorul pe aceste linii și apasă Alt+Enter în IntelliJ IDEA"
" Pasul 3. Alegeți elementul de meniu „Fișier jar pe web”.
„ Pasul 4. Alegeți „slf4j-log4j13.jar””
" Pasul 5. Specificați de unde să descărcați biblioteca (jar)"
" Pasul 6. Folosiți cursurile de care aveți nevoie."
"Uau! Ce zi a fost asta. Atât de multe lucruri noi și atât de multe lucruri interesante!"
„Iată un alt articol bun despre logare: https://docs.oracle.com/javase/10/core/java-logging-overview.htm#JSCOR-GUID-48004124-2C00-49F7-A640-0C0DDA271DBC ”
"Bine, este suficient. Du-te relaxează-te, programator."
GO TO FULL VERSION