Cadrul de jurnalizare Java - Java logging framework
Un cadru de jurnalizare Java este un pachet de înregistrare a datelor pentru computer pentru platforma Java . Acest articol acoperă cadrele de înregistrare cu scop general.
Înregistrarea se referă la înregistrarea activității de către o aplicație și este o problemă obișnuită pentru echipele de dezvoltare. Cadrele de înregistrare ușurează și standardizează procesul de înregistrare pentru platforma Java. În special, acestea oferă flexibilitate evitând ieșirea explicită către consolă (vezi Appender mai jos). Unde sunt scrise jurnalele devine independent de cod și poate fi personalizat în timpul rulării.
Din păcate, JDK nu a inclus înregistrarea în versiunea inițială, așa că până la adăugarea API-ului Java Logging au devenit utilizate pe scară largă alte câteva cadre de logare - în special Apache Commons Logging (cunoscut și sub numele de Java Commons Logging sau JCL) și log4j . Acest lucru a dus la probleme la integrarea diferitelor biblioteci terță parte (JAR-uri), fiecare folosind cadre de jurnalizare diferite. Au fost dezvoltate cadre de conectare conectabile (împachetări) pentru a rezolva această problemă.
Prezentare generală a funcționalității
Logarea este de obicei împărțită în trei bucăți majore: Logger, Formatter și Appender (sau Handler).
- Loggerul este responsabil pentru captarea mesajului care trebuie înregistrat împreună cu anumite metadate și transmiterea acestuia în cadrul de înregistrare.
- După primirea mesajului, cadrul apelează formatatorul cu mesajul care îl formatează pentru ieșire.
- Cadrul apoi predă mesajul formatat către Appender / Handler corespunzător pentru eliminare. Aceasta poate include ieșirea pe un ecran de consolă, scrierea pe disc, atașarea la o bază de date sau generarea unui e-mail.
Cadrele de înregistrare mai simple, cum ar fi Cadrul de înregistrare de tipul obiectului , combină înregistratorul și aplicația. Acest lucru simplifică funcționarea implicită, dar este mai puțin configurabil, mai ales dacă proiectul este mutat în medii.
Logger
Un Logger este un obiect care permite aplicației să se înregistreze indiferent de locul în care este trimisă / stocată ieșirea. Aplicația înregistrează un mesaj trecând un obiect sau un obiect și o excepție cu un nivel opțional de severitate către obiectul logger sub un nume / identificator dat.
Nume
Un logger are un nume. Numele este de obicei structurat ierarhic, cu puncte (.) Care separă nivelurile. O schemă obișnuită este să folosiți numele clasei sau pachetului care efectuează înregistrarea. Atât log4j, cât și API-ul de logare Java acceptă definirea handlerelor mai sus în ierarhie.
De exemplu, loggerul ar putea fi numit „ com.sun.some.UsefulClass ”. Manipulatorul poate fi definit pentru oricare dintre următoarele:
comcom.suncom.sun.somecom.sun.some.UsefulClass
Atâta timp cât există un handler definit undeva în această stivă, poate avea loc înregistrarea. De exemplu, un mesaj conectat la com.sun.some.UsefulClass logger poate fi scris de către com.sun handler. De obicei, există un handler global care primește și procesează mesajele generate de orice logger.
Nivelul de severitate
Mesajul este înregistrat la un anumit nivel. Numele de nivel obișnuit sunt copiate din Apache Commons Logging (deși API-ul Java Logging definește nume de niveluri diferite):
| Nivel | Descriere |
|---|---|
| FATAL | Erori severe care determină încetarea prematură. Așteptați-vă ca acestea să fie vizibile imediat pe o consolă de stare. |
| EROARE | Alte erori de rulare sau condiții neașteptate. Așteptați-vă ca acestea să fie vizibile imediat pe o consolă de stare. |
| AVERTIZARE | Utilizarea API-urilor depreciate, utilizarea slabă a API-ului, erori „aproape”, alte situații de rulare care sunt nedorite sau neașteptate, dar nu neapărat „greșite”. Așteptați-vă ca acestea să fie vizibile imediat pe o consolă de stare. |
| INFO | Evenimente interesante de rulare (pornire / oprire). Așteptați-vă ca acestea să fie vizibile imediat pe o consolă, deci fiți prudenți și păstrați-vă la minimum. |
| DEBUG | informații detaliate despre fluxul prin sistem. Așteptați ca acestea să fie scrise numai în jurnale. |
| URMĂ | informații mai detaliate. Așteptați ca acestea să fie scrise numai în jurnale. |
Cadrul de înregistrare menține nivelul actual de înregistrare pentru fiecare înregistrator. Nivelul de înregistrare poate fi setat mai mult sau mai puțin restrictiv. De exemplu, dacă nivelul de înregistrare este setat la „AVERTISMENT”, atunci toate mesajele de la acel nivel sau mai mare sunt înregistrate: EROARE și FATAL.
Nivelurile de severitate pot fi atribuite atât jurnalistilor, cât și operatorilor. Ambele trebuie să fie activate pentru un anumit nivel de severitate pentru a fi generat rezultatul. Deci, un logger activat pentru ieșirea de depanare nu va genera ieșire dacă gestionarul care primește mesajul nu este activat și pentru depanare.
Filtre
Filtrele determină ignorarea sau înregistrarea unui eveniment de jurnal. Cel mai frecvent utilizat filtru este nivelul de înregistrare documentat în secțiunea anterioară. Cadrele de jurnalizare, cum ar fi Log4j 2 și SLF4J, oferă și Markere, care atunci când sunt atașate la un eveniment de jurnal pot fi folosite și pentru filtrare. Filtrele pot fi, de asemenea, utilizate pentru a accepta sau a refuza evenimentele jurnalului pe baza excepțiilor aruncate, a datelor din mesajul jurnal, a datelor dintr-un ThreadLocal care este expus prin intermediul API-ului de jurnalizare sau a unei varietăți de alte metode.
Formatatori, machete sau redări
Un formatator este un obiect care formatează un anumit obiect. În mare parte, aceasta constă în luarea obiectului binar și convertirea acestuia într-o reprezentare șir. Fiecare cadru definește un format de ieșire implicit care poate fi suprascris, dacă se dorește.
Anexe sau manipulatori
Anexele ascultă mesaje la sau peste un nivel de severitate minim specificat. Reclamantul preia mesajul pe care îl transmite și îl postează corespunzător. Dispunerile de mesaje includ:
- afișat pe consolă
- scrieți într-un fișier sau syslog
- atașați la un tabel de baze de date
- distribuiți prin intermediul serviciilor de mesagerie Java
- trimite prin e-mail
- scrie la o priză
- aruncați în „buc-bit” (/ dev / null)
Compararea caracteristicilor
| Cadru | Tip | Niveluri de jurnal acceptate | Anexe standard | Comentarii | Cost / Licență |
|---|---|---|---|---|---|
| Log4J | Cadru de înregistrare |
FATAL ERROR WARN INFO DEBUG TRACE
|
Prea multe pentru a fi listate: Consultați documentația pentru appender | Utilizat pe scară largă în multe proiecte și platforme. Log4j 1 a fost declarat „Sfârșitul vieții” în 2015 și a fost înlocuit cu Log4j 2, care oferă un API care poate fi utilizat cu alte implementări de logare, precum și o implementare a acelui API. |
Licență Apache, versiunea 2.0
|
| API Java Logging | Cadru de înregistrare |
SEVERE WARNING INFO CONFIG FINE FINER FINEST
|
Mașina virtuală Java (JVM) implicită de Sun are următoarele: ConsoleHandler, FileHandler, SocketHandler, MemoryHandler | Vine cu JRE | |
| tinylog | Cadru de înregistrare |
ERROR WARNING INFO DEBUG TRACE
|
ConsoleWriter, FileWriter, LogcatWriter, JdbcWriter, RollingFileWriter, SharedFileWriter și nul (elimină toate intrările de jurnal) | Licență Apache, versiunea 2.0 | |
| Logback | Cadru de înregistrare |
ERROR WARN INFO DEBUG TRACE
|
Prea multe pentru listare: consultați Appender JavaDoc | Dezvoltat ca înlocuitor pentru log4j, cu multe îmbunătățiri. Folosit de numeroase proiecte, de obicei în spatele slf4j, de exemplu Akka , Apache Camel , Apache Cocoon , Artifactory , Gradle , Lift Framework , Play Framework , Scalatra , SonarQube , Spring Boot , ... | LGPL , versiunea 2.1 |
| Apache Commons Logging (JCL) | Înveliș de înregistrare |
FATAL ERROR WARN INFO DEBUG TRACE
|
Depinde de cadrul de bază | Utilizat pe scară largă, adesea împreună cu log4j | Licență Apache, versiunea 2.0 |
| SLF4J | Înveliș de înregistrare |
ERROR WARN INFO DEBUG TRACE
|
Depinde de cadrul de bază, care este conectabil. Oferă API -uri compatibile garnituri de reglare pentru JCL, JDK și pachete log4j de logare. De asemenea, poate utiliza oricare dintre ele pentru a genera ieșire. În mod implicit, utilizează Logback pentru ieșire, dacă este disponibil | Utilizat pe scară largă în multe proiecte și platforme, frecvent cu Logback ca implementare. | Licență MIT |
Considerații
JCL și Log4j sunt foarte frecvente pur și simplu pentru că există de atât de mult timp și au fost singurele alegeri de mult timp. Flexibilitatea slf4j (folosind Logback dedesubt) l-a făcut o alegere populară.
SLF4J este un set de împachetări pentru jurnal (sau coloane) care îi permit să imite oricare dintre celelalte cadre. Astfel, mai multe biblioteci terțe pot fi încorporate într-o aplicație, indiferent de cadrul de jurnalizare pe care fiecare a ales să îl folosească. Cu toate acestea, toate ieșirile de înregistrare sunt generate într-un mod standard, de obicei prin Logback.
Log4j 2 oferă atât un API cât și o implementare. API-ul poate fi direcționat către alte implementări de jurnalizare echivalente cu modul în care funcționează SLF4J. Spre deosebire de SLF4J, API-ul Log4j 2 înregistrează obiecte Mesaje în loc de Șiruri pentru o flexibilitate suplimentară și acceptă, de asemenea, expresii Java Lambda.
JCL nu este într-adevăr un cadru de înregistrare, ci un pachet pentru unul. Ca atare, necesită un cadru de jurnalizare sub acesta, deși poate utiliza implicit propriul său jurnal SimpleLog .
JCL, SLF4J și API-ul Log4j 2 sunt utile atunci când se dezvoltă biblioteci reutilizabile care trebuie să scrie în oricare sistem de înregistrare subiacent care este utilizat de aplicație. Acest lucru oferă, de asemenea, flexibilitate în medii eterogene în care cadrul de înregistrare este probabil să se schimbe, deși, în majoritatea cazurilor, odată ce a fost ales un cadru de înregistrare, este puțin necesar să-l schimbăm pe parcursul duratei de viață a proiectului. SLF4J și Log4j 2 beneficiază de faptul că sunt mai noi și se bazează pe lecțiile învățate din cadrul mai vechi. Mai mult, JCL a cunoscut probleme cu clasele de încărcare atunci când a stabilit ce bibliotecă de înregistrare ar trebui să înfășoare, care a înlocuit acum JCL.
API-ul Java Logging este furnizat împreună cu Java. Deși API-ul este separat din punct de vedere tehnic de implementarea implicită furnizată cu Java, înlocuirea acestuia cu o implementare alternativă poate fi o provocare, astfel încât mulți dezvoltatori confundă această implementare cu API-ul Java Logging. Configurarea se face doar prin fișiere externe, care nu se schimbă ușor din mers (alte cadre acceptă configurația programatică). Implementarea implicită oferă doar câțiva Handlers și Formatters, ceea ce înseamnă că majoritatea utilizatorilor vor trebui să scrie propriile lor.
Vezi si
- SLF4J
- log4j
- logback
- Javolution LogContext bazat pe programare contextuală (cadru de înregistrare efectiv selectabil în timpul rulării).
- Inteligență în timpul rulării
Referințe
linkuri externe
- API de înregistrare Java 6.0
- Înregistrare în comun
- Protomaterie
- Instrumente de înregistrare open source în Java
- Licența Apache 2.0.
- Logback - Un succesor al popularului proiect log4j
- tinylog - Utilitar de înregistrare minimalist cu un înregistrator static
- Loggifier Un instrument care introduce codul de înregistrare în fișierele .class, .jar și .ear
- JLV - Vizualizare jurnal Java care este disponibil în prezent ca plugin pentru Eclipse IDE
- Perf4j
- SLF4J
- Log4j 2