CodeGym /Blog Java /Aleatoriu /Înregistrare Java
John Squirrels
Nivel
San Francisco

Înregistrare Java

Publicat în grup
Bună! Când scriu lecțiile, subliniez în mod deosebit dacă există o temă specifică care va fi absolut esențială în munca reală. Așadar, ASCULTĂ! Subiectul pe care îl vom trata astăzi vă va fi cu siguranță util în toate proiectele dvs. din prima zi de angajare. Vom vorbi despre Java Logging. Acest subiect nu este deloc complicat (aș spune chiar ușor). Dar vei avea destule lucruri evidente despre care să te stresezi la primul tău loc de muncă, așa că este mai bine să le înțelegi pe deplin chiar acum :) Ei bine, să începem.

Ce este autentificarea în Java?

Înregistrarea este actul de înregistrare a datelor despre funcționarea unui program. Locul în care înregistrăm aceste date se numește „jurnal”. Imediat apar două întrebări: ce date sunt scrise și unde? Să începem cu „unde”. Puteți scrie date despre activitatea unui program în multe locuri diferite. De exemplu, în timpul studiilor, adeseori System.out.println()pentru a scoate date către consolă. Aceasta este într-adevăr logare, deși în forma sa cea mai simplă. Desigur, acest lucru nu este foarte convenabil pentru utilizatori sau o echipă de asistență pentru produse: evident, nu vor dori să instaleze un IDE și să monitorizeze consola :) Există un format mai obișnuit pentru înregistrarea informațiilor: fișiere text. Oamenii sunt mult mai confortabil să citească date în acest format și, cu siguranță, este mult mai convenabil pentru stocarea datelor! Acum a doua întrebare: ce date de program ar trebui să fie înregistrate? Asta depinde în întregime de tine! Sistemul de înregistrare Java este foarte flexibil. Îl puteți configura să înregistreze tot ceea ce face programul dvs. Pe de o parte, acest lucru este bun. Dar, pe de altă parte, imaginați-vă cât de mari ar fi jurnalele Facebook sau Twitter dacă ar scrie totul în ele. Aceste companii mari au probabil capacitatea de a stoca atât de multe date. Dar imaginați-vă cât de dificil ar fi să găsiți informații despre o eroare critică în 500 de gigaocteți de jurnal de text? Ar fi mai rău decât să cauți un ac într-un car de fân. În consecință, Java poate fi configurat să înregistreze numai datele de eroare. Sau chiar doar erori critice! Acestea fiind spuse, nu este complet corect să vorbim despre sistemul nativ de jurnalizare Java. Faptul este că programatorii aveau nevoie de logare înainte ca această funcționalitate să fie adăugată la limbaj. Când Java și-a introdus propria bibliotecă de înregistrare, toată lumea folosea deja biblioteca log4j. Istoricul logării în Java este de fapt foarte lung și informativ. Pe scurt, Java are propria sa bibliotecă de înregistrare, dar aproape nimeni nu o folosește :) Mai târziu, când au apărut mai multe biblioteci de jurnalizare diferite și au început să fie folosite de programatori, au apărut probleme de compatibilitate. Pentru a împiedica oamenii să reinventeze roata într-o duzină de biblioteci diferite cu interfețe diferite, a fost creat cadrul abstract SLF4J ("Service Logging Facade For Java"). Se numește abstract, pentru că chiar dacă folosești și apelezi metodele claselor SLF4J, sub capotă ele folosesc de fapt toate cadrele de logare care au apărut înainte: log4j, standardul java.util.logging și altele. Dacă la un moment dat aveți nevoie de o caracteristică specifică a Log4j care lipsește în alte biblioteci, dar nu doriți să vă conectați direct proiectul la această bibliotecă, utilizați doar SLF4J. Și apoi lăsați-l să apeleze metodele Log4j. Dacă vă răzgândiți și decideți că nu mai aveți nevoie de funcțiile Log4j, trebuie doar să reconfigurați "aici , iar biblioteca Log4j aici . Apoi, despachetați arhiva și utilizați IntelliJ IDEA pentru a adăuga fișierele JAR la calea clasei. Elemente de meniu: Fișier -> Structura proiectului -> Biblioteci Selectați fișierele JAR necesare și adăugați-le la proiect (arhivele pe care le-am descărcat conțin multe fișiere JAR - uitați-vă la imagini pentru a le vedea pe cele de care aveți nevoie) Rețineți că această instrucțiune pentru acei De ce avem nevoie de înregistrare - 2De ce avem nevoie de înregistrare - 3studenți care nu știu să folosească Maven. Dacă știi să folosești Maven, de obicei este mai bine (mult mai ușor) să încerci să începi de acolo. Dacă utilizați Maven , adăugați această dependență:

    	<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
    	</dependency>
Grozav! Ne-am dat seama de setări :) Să vedem cum funcționează SLF4J. Cum ne asigurăm că munca programului este înregistrată undeva? Pentru a face acest lucru, avem nevoie de două lucruri: logger și appender. Să începem cu primul. Un logger este un obiect care oferă control deplin asupra înregistrării. Crearea unui logger este foarte ușoară: facem acest lucru folosind metodele statice LoggerFactory.getLogger() . Parametrul metodei este clasa a cărei operație va fi înregistrată. Să rulăm codul nostru:

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

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log entry!!!");
       LOGGER.error("An error occurred!");
   }
}
Ieșire din consolă:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
Ce vedem aici? În primul rând, vedem un mesaj de eroare. Acesta este rezultatul faptului că acum ne lipsesc setările necesare. În consecință, loggerul nostru este în prezent capabil să scoată numai mesaje de eroare (EROARE) și numai către consolă. Metoda logger.info() nu a funcționat. Dar logger.error() a făcut-o! Pe consolă, vedem data curentă, metoda în care a apărut eroarea ( main), cuvântul „EROARE” și mesajul nostru! EROARE este nivelul de înregistrare. În general, dacă o intrare de jurnal este marcată cu cuvântul „EROARE”, atunci a apărut o eroare în acest moment în program. Dacă intrarea este marcată cu cuvântul „INFO”, atunci mesajul reprezintă pur și simplu informații curente despre funcționarea normală a programului. Biblioteca SLF4J are o mulțime de niveluri diferite de înregistrare care vă permit să configurați înregistrarea în mod flexibil. Totul este foarte ușor de gestionat: toată logica necesară este deja în clasa Java Logger . Trebuie doar să apelați metodele relevante. Dacă doriți să înregistrați un mesaj de rutină, apelați metoda logger.info() . Pentru un mesaj de eroare, utilizați logger.error() . Pentru un avertisment, utilizați logger.warn()

Acum să vorbim despre apendice

Un apendice este locul în care ajung datele dvs. Într-un fel, opusul unei surse de date, adică „punctul B”. În mod implicit, datele sunt transmise în consolă. Rețineți că în exemplul anterior nu a trebuit să configuram nimic: textul a apărut în consolă, iar loggerul bibliotecii Log4j poate scoate doar mesaje la nivel de EROARE către consolă. Evident, este mai convenabil pentru oameni să citească și să scrie jurnalele într-un fișier text. Pentru a schimba comportamentul implicit al logger-ului, trebuie să configuram aplicația de fișier. Pentru a începe, trebuie să creați un fișier log4j.xml direct în folderul src. Sunteți deja familiarizat cu formatul XML: recent am avut o lecție despre el :) Iată conținutul fișierului:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
Nimic deosebit sau dificil aici :) Dar totuși, să trecem prin conținut.
<Configuration status="INFO">
Acesta este așa-numitul StatusLogger. Nu are legătură cu loggerul nostru și este folosit în procesele interne ale Log4j. Dacă setați status="TRACE" în loc de status="INFO", și toate informațiile despre activitatea internă a Log4j vor fi afișate pe consolă (StatusLogger afișează date pe consolă, chiar dacă anexa noastră este un fișier). Nu avem nevoie de el acum, așa că hai să o lăsăm așa cum este.

<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Aici creăm anexa noastră. Eticheta <File> indică faptul că va fi un atașator de fișier. name="MyFileAppender" setează numele aplicatorului. fileName="C:\Users\Username\Desktop\testlog.txt" indică calea către fișierul jurnal unde vor fi scrise toate datele. append="true" indică dacă datele ar trebui scrise la sfârșitul fișierului. În cazul nostru, asta este exact ceea ce vom face. Dacă setați valoarea la fals, atunci vechiul conținut al fișierului jurnal va fi șters de fiecare dată când programul este pornit. <PatternLayout pattern="%d{aaaa-LL-zz HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>indică setările de formatare. Aici putem folosi expresii regulate pentru a personaliza modul în care este formatat textul în jurnalul nostru.

<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Aici indicăm nivelul rădăcinii. Am setat nivelul „INFO”, ceea ce înseamnă că toate mesajele ale căror niveluri sunt mai mari decât INFO (conform tabelului pe care l-am uitat mai sus) nu vor fi înregistrate. Programul nostru va avea 3 mesaje: unul INFO, unul WARN și unul EROARE. Cu configurația curentă, toate cele 3 mesaje vor fi înregistrate. Dacă modificați nivelul rădăcină la ERROR, doar ultimul mesaj din apelul metodei LOGGER.error() va ajunge în jurnal. În plus, aici se află și o referință la anexa. Pentru a crea o astfel de referință, trebuie să creați o etichetă <ApprenderRef> în interiorul etichetei <Root> și să adăugați atributul ref='your appender's name' . În cazul în care ați uitat, aici setăm numele aplicatorului: <. Și iată codul nostru!

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

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
Desigur, este puțin ciudat (prinderea unei RuntimeException este o idee discutabilă), dar este perfectă pentru scopurile noastre :) Să rulăm metoda main() de 4 ori la rând și să ne uităm la fișierul nostru testlog.txt. Nu trebuie să-l creați în avans: biblioteca va face acest lucru automat. Totul a funcționat! :) Acum aveți un logger configurat. Vă puteți juca cu unele dintre programele dvs. vechi, adăugând apeluri de înregistrare la fiecare metodă. Apoi uitați-vă la jurnalul rezultat :) Ia în considerare subiectul logării în profunzime. Ar fi o provocare să citești totul dintr-o singură ședință. Acestea fiind spuse, conține o mulțime de informații suplimentare utile. De exemplu, veți învăța cum să configurați loggerul astfel încât să creeze un fișier text nou dacă fișierul nostru testlog.txt atinge o anumită dimensiune :) Și asta încheie cursul nostru! Astăzi v-ați familiarizat cu un subiect foarte important, iar aceste cunoștințe vă vor fi cu siguranță de ajutor în munca viitoare. Pana data viitoare! :)
Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION