System.out.println vs drvosječe

1. Zašto drvosječe?

Dok pišem program ili razvijam proizvodnu aplikaciju za poduzeće, koristeći System.out.println čini se najjednostavnijom i najjednostavnijom opcijom. Nema dodatnih knjižnica koje se dodaju u put predavanja i ne trebaju se napraviti dodatne konfiguracije.

Ali koristeći System.out.println dolazi s nekoliko nedostataka koji utječu na njegovu iskoristivost u mnogim situacijama. U ovom uputstvu ćemo razgovarati zašto i kada bismo htjeli koristiti drvosječu umjesto obične stare System.out i System.err. Pokazat ćemo i neke brze primjere korištenja log4J2 okvira za bilježenje.

2. Postavljanje

Prije nego što započnemo, pogledajmo potrebne ovisnosti i konfiguracije Mavena.

2.1. Ovisnosti Mavena

Počnimo dodavanjem ovisnosti Log4J2 u našu pom.xml:

 org.apache.logging.log4j log4j-api 2.12.1 org.apache.logging.log4j log4j-core 2.12.1 

Možemo pronaći najnovije verzije log4j-api i log4j-jezgra na Maven Central.

2.2. Konfiguracija Log4J2

Korištenje System.out ne zahtijeva nikakvu dodatnu konfiguraciju. Međutim, da bismo koristili Log4J2, potreban nam je log4j.xml konfiguracijska datoteka:

Gotovo svi okviri dnevnika zahtijevat će određenu razinu konfiguracije, bilo programski ili putem vanjske konfiguracijske datoteke, poput ovdje prikazane XML datoteke.

3. Odvajanje izlaza dnevnika

3.1. System.out i System.err

Kada našu aplikaciju rasporedimo na poslužitelj poput Tomcata, poslužitelj koristi vlastiti zapisnik. Ako koristimo System.out, trupci završe u katalina.izlaz. Puno je lakše otkloniti pogreške u našoj aplikaciji ako su zapisnici stavljeni u zasebnu datoteku. S Log4j2 moramo u konfiguraciju uključiti dodavač datoteke kako bismo spremili zapisnike aplikacija u zasebnu datoteku.

Također, sa System.out.println, nema kontrole ili filtriranja koji će se dnevnici zapisati. Jedini mogući način za odvajanje trupaca je upotreba System.out.println za informativne zapisnike i System.err.println za zapisnike pogrešaka:

System.out.println ("Ovo je informativna poruka"); System.err.println ("Ovo je poruka o pogrešci");

3.2. Log4J2 Razine bilježenja

U okruženjima za otklanjanje pogrešaka ili u razvoju želimo vidjeti sve podatke koje aplikacija ispisuje. Ali u aktivnoj aplikaciji poduzeća, više dnevnika znači povećanje kašnjenja. Okviri logera poput Log4J2 pružaju više kontrola na razini dnevnika:

  • FATALNO
  • POGREŠKA
  • UPOZORITI
  • INFO
  • DEBUG
  • TRAG
  • SVI

Koristeći ove razine, lako možemo filtrirati kada i gdje ispisati koje podatke:

logger.trace ("Trag log message"); logger.debug ("Poruka dnevnika otklanjanja pogrešaka"); logger.info ("Poruka dnevnika informacija"); logger.error ("Poruka dnevnika pogreške"); logger.warn ("Poruka dnevnika upozorenja"); logger.fatal ("Fatalna poruka dnevnika");

Također možemo konfigurirati razine za svaki paket izvornog koda pojedinačno. Za više pojedinosti o konfiguraciji na razini dnevnika, pogledajte naš članak Dnevnik Java.

4. Zapisivanje dnevnika u datoteke

4.1. Preusmjeravanje System.out i System.err

Moguće je usmjeriti System.out.println u datoteku pomoću System.setOut () metoda:

PrintStream outStream = novi PrintStream (nova datoteka ("outFile.txt")); System.setOut (outStream); System.out.println ("Ovo je baeldung članak");

A u slučaju System.err:

PrintStream errStream = novi PrintStream (nova datoteka ("errFile.txt")); System.setErr (errStream); System.err.println ("Ovo je pogreška u članku");

Pri preusmjeravanju izlaza u datoteku pomoću System.out ili System.err, ne možemo kontrolirati veličinu datoteke, tako da datoteka neprestano raste za vrijeme trajanja aplikacije.

Kako veličina datoteke raste, možda će biti teško otvoriti ili analizirati ove veće zapisnike.

4.2. Prijava u datoteke pomoću Log4J2

Log4J2 pruža mehanizam za sustavno zapisivanje dnevnika u datoteke i također kotrljanje datoteka na temelju određenih pravila. Na primjer, možemo konfigurirajte datoteke koje će se prevrtati na temelju uzorka datuma / vremena:

Ili možemo premotajte datoteke prema veličini kad dosegnu zadani prag:

...% d {yyyy-MM-dd HH: mm: ss}% p% m% n 

5. Prijava na vanjske sustave

Kao što smo vidjeli u prethodnom odjeljku, okviri dnevnika omogućuju pisanje dnevnika u datoteku. Slično tome, oni također pružaju dodataka za slanje dnevnika u druge sustave i programe. To omogućuje slanje dnevnika u Kafka Stream ili Elasticsearch bazu podataka pomoću Log4J dodataka umjesto korištenja System.out.println.

Pogledajte naš članak Log4j dodataka za više pojedinosti o tome kako koristiti takve dodatke.

6. Prilagođavanje izlaza dnevnika

Korištenjem Loggera možemo prilagoditi koje se informacije ispisuju zajedno sa stvarnom porukom. Podaci koje možemo ispisati uključuju naziv paketa, razinu zapisnika, broj retka, vremensku oznaku, naziv metode itd.

Iako bi to bilo moguće s System.out.println, zahtijevalo bi puno ručnog rada, dok okviri za bilježenje pružaju ovu funkcionalnost odmah. S drvosječama, možemo jednostavno definirati obrazac u konfiguraciji logera:

Ako Log4J2 uzmemo u obzir za naš logger framework, postoji nekoliko uzoraka koje možemo odabrati ili prilagoditi. Pogledajte službenu dokumentaciju Log4J2 da biste saznali više o njima.

7. Zaključak

Ovaj članak objašnjava različite razloge zašto koristiti logger framework i zašto se ne oslanjati samo na njega System.out.println za naše zapisnike aplikacija. Iako je opravdano koristiti System.out.println za male testne programe radije ga ne bismo koristili kao glavni izvor evidentiranja za poslovnu proizvodnu aplikaciju.

Kao i uvijek, primjeri koda u članku dostupni su na GitHubu.