Uvod u Log4j2 - Dodaci, izgledi i filtri

1. Pregled

Zapisivanje događaja kritični je aspekt razvoja softvera. Iako je u Java ekosustavu dostupno puno okvira, Log4J je desetljećima najpopularniji zbog fleksibilnosti i jednostavnosti koju pruža.

Log4j 2 je nova i poboljšana verzija klasičnog okvira Log4j.

U ovom ćemo članku predstaviti najčešće dodaće, izglede i filtre putem praktičnih primjera.

U Log4J2, dodavač je jednostavno odredište za događaje iz dnevnika; može biti jednostavan poput konzole i može biti složen kao bilo koji RDBMS. Izgledi određuju način na koji će se zapisnici prikazivati, a filtri filtriraju podatke prema različitim kriterijima.

2. Postavljanje

Da bismo razumjeli nekoliko komponenata zapisivanja i njihovu konfiguraciju, postavimo različite primjere testa, od kojih se svaki sastoji od log4J2.xml konfiguracijsku datoteku i JUNIT 4 test klasa.

Dvije su ovisnosti mavena zajedničke svim primjerima:

 org.apache.logging.log4j log4j-core 2.7 org.apache.logging.log4j log4j-core 2.7 test-jar test 

Osim glavne log4j-jezgra paket moramo uključiti 'test jar' koji pripada paketu da bismo dobili pristup kontekstnom pravilu potrebnom za testiranje neobično imenovanih konfiguracijskih datoteka.

3. Zadana konfiguracija

ConsoleAppender je zadana konfiguracija Log4J 2 osnovni paket. Poruke bilježi na sistemsku konzolu na jednostavan obrazac:

Analizirajmo oznake u ovoj jednostavnoj XML konfiguraciji:

  • Konfiguracija: Korijenski element a Log4J 2 konfiguracijska datoteka i atribut status je razina internih događaja Log4J, koje želimo prijaviti
  • Dodaci: Ovaj element sadrži jedan ili više dodataka. Ovdje ćemo konfigurirati dodatak koji na sistemsku konzolu izlazi na standardni izlaz
  • Sjekači: Ovaj se element može sastojati od više konfiguracija Drvosječa elementi. S posebnim Korijen oznaku, možete konfigurirati bezimenu standardnu ​​evidenciju koja će primati sve poruke dnevnika iz aplikacije. Svaki zapisnik može se postaviti na minimalnu razinu dnevnika
  • AppenderRef: Ovaj element definira referencu na element iz Dodaci odjeljak. Stoga je atribut 'ref"Povezan je s dodacima"Ime‘Atribut

Odgovarajući jedinični test bit će slično jednostavan. Dobit ćemo Drvosječa referencirati i ispisati dvije poruke:

@Test javna praznina givenLoggerWithDefaultConfig_whenLogToConsole_thanOK () baca iznimku {Logger logger = LogManager.getLogger (getClass ()); Iznimka e = novi RuntimeException ("Ovo je samo test!"); logger.info ("Ovo je jednostavna poruka na razini INFO-a." + "Bit će skrivena."); logger.error ("Ovo je jednostavna poruka na razini POGREŠKE." + "Ovo je najmanja vidljiva razina.", e); } 

4. ConsoleAppender S PatternLayout

Definirajmo novi dodatak konzole s prilagođenim uzorkom boja u zasebnoj XML datoteci i uključimo to u našu glavnu konfiguraciju:

Ova datoteka koristi neke varijable uzorka koje zamjenjuje Log4J 2 za vrijeme izvođenja:

  • % stil {…} {ime_boje}: Ovo će ispisati tekst u prvom paru zagrada () u zadanoj boji (naziv boje).
  • % istaknite {…} {FATAL = naziv boje,…}: Ovo je slično varijabli ‘style’. Ali za svaku razinu dnevnika može se dati drugačija boja.
  • %Oblik datuma}: To se zamjenjuje trenutnim datumom u navedenom format. Ovdje koristimo format "DETAULT" DateTime, yyyy-MM-dd VH: mm: ss, SSS '.
  • % -5 razina: Ispisuje razinu poruke dnevnika ispravno poravnato.
  • %poruka: Predstavlja sirovu poruku dnevnika

Ali postoji mnogo više varijabli i oblikovanja u PatternLayout. Možete ih uputiti u službenu dokumentaciju Log4J 2.

Sada ćemo uključiti definirani dodatak konzole u našu glavnu konfiguraciju:

Jedinični test:

@Test javna praznina givenLoggerWithConsoleConfig_whenLogToConsoleInColors_thanOK () baca izuzetak {Logger logger = LogManager.getLogger ("CONSOLE_PATTERN_APPENDER_MARKER"); logger.trace ("Ovo je obojena poruka na razini TRACE."); ...} 

5. Async File Appender sa JSONLayout i BurstFilter

Ponekad je korisno pisati poruke dnevnika na asinkroni način. Na primjer, ako izvedba aplikacije ima prioritet nad dostupnošću dnevnika.

U takvim slučajevima upotrebe možemo koristiti AsyncAppender.

Za naš primjer konfiguriramo asinkronu JSON datoteka dnevnika. Nadalje, uključit ćemo burst filter koji ograničava izlaz dnevnika određenom brzinom:

   ...          ...        

Primijeti da:

  • The JSONLayout je konfiguriran na način da zapisuje jedan događaj dnevnika po retku
  • The BurstFilter ispustit će svaki događaj s razinom "INFO" i višom ako ih ima više od dva, ali na najviše 10 ispuštenih događaja
  • The AsyncAppender postavljen je na međuspremnik od 80 dnevničkih poruka; nakon toga se međuspremnik ispire u datoteku dnevnika

Pogledajmo odgovarajući jedinični test. Napunjavamo dodani međuspremnik u petlju, dopuštamo mu da zapisuje na disk i pregledava broj redaka datoteke dnevnika:

@Test public void givenLoggerWithAsyncConfig_whenLogToJsonFile_thanOK () baca izuzetak {Logger logger = LogManager.getLogger ("ASYNC_JSON_FILE_APPENDER"); konačni broj int = 88; for (int i = 0; i 0 && logEventsCount <= count); }

6. RollingFile Pojavi se i XMLLayout

Dalje ćemo stvoriti valjanu datoteku dnevnika. Nakon konfigurirane veličine datoteke, datoteka dnevnika se komprimira i rotira.

Ovaj put koristimo XML izgled:

Primijeti da:

  • The RollingFile program za dodavanje ima atribut 'filePattern' koji se koristi za imenovanje rotiranih datoteka dnevnika i može se konfigurirati s varijablama rezerviranog mjesta. U našem primjeru trebao bi sadržavati datum i brojač prije sufiksa datoteke.
  • Zadana konfiguracija XMLLayout napisat će objekte jednog događaja događaja bez korijenskog elementa.
  • Za rotaciju datoteka dnevnika koristimo pravila temeljena na veličini.

Naša klasa jediničnog testiranja izgledat će poput one iz prethodnog odjeljka:

@Test javna praznina givenLoggerWithRollingFileConfig_whenLogToXMLFile_thanOK () baca iznimku {Logger logger = LogManager.getLogger ("XML_ROLLING_FILE_APPENDER"); konačni broj int = 88; for (int i = 0; i <count; i ++) {logger.info ("Ovo je valjana datoteka XML poruke # {} na razini INFO.", i); }}

7. Syslog Napadač

Recimo da moramo prijavljene događaje poslati na udaljeni stroj putem mreže. Najjednostavniji način da se to učini pomoću Log4J2 bio bi njegov Syslog Appender:

   ...     ...        

Atributi u Syslog označiti:

  • Ime: definira ime dodavača i mora biti jedinstveno. Budući da možemo imati više Syslog dodataka za istu aplikaciju i konfiguraciju
  • format: može se postaviti na BSD ili RFC5424, a zapisi Syslog-a bit će u skladu s tim formatirani
  • host & port: ime hosta i port udaljenog računala s poslužiteljem Syslog
  • protokol: da li koristiti TCP ili UPD
  • objekt: na koju će Syslog ustanovu biti napisan događaj
  • connectTimeoutMillis: vremensko razdoblje čekanja na uspostavljenu vezu, zadane vrijednosti su nula
  • reconnectionDelayMillis: vrijeme da pričekate prije ponovnog pokušaja povezivanja

8. FailoverAppender

Sada mogu postojati slučajevi kada jedan dodavač ne uspije obraditi događaje dnevnika, a mi ne želimo izgubiti podatke. U takvim slučajevima, FailoverAppender dobro dođe.

Na primjer, ako je Syslog program za dodavanje ne šalje događaje na udaljeni stroj, umjesto da izgubi te podatke kojima bismo se mogli vratiti FileAppender privremeno.

The FailoverAppender uzima primarni dodatak i broj sekundarnih priloga. U slučaju da primarni ne uspije, pokušava obraditi događaj dnevnika sekundarnim da bi uspio ili dok ne uspije sekundarno:

Isprobajmo:

@Test public void givenLoggerWithFailoverConfig_whenLog_thanOK () baca iznimku {Logger logger = LogManager.getLogger ("FAIL_OVER_SYSLOG_APPENDER"); Iznimka e = novi RuntimeException ("Ovo je samo test!"); logger.trace ("Ovo je syslog poruka na razini TRACE."); logger.debug ("Ovo je syslog poruka na razini DEBUG."); logger.info ("Ovo je syslog poruka na razini INFO. Ovo je minimalna vidljiva razina."); logger.warn ("Ovo je syslog poruka na razini WARN."); logger.error ("Ovo je syslog poruka na razini POGREŠKE.", e); logger.fatal ("Ovo je syslog poruka na razini FATAL."); }

9. JDBC Appender

Dodavač JDBC šalje događaje dnevnika u RDBMS, koristeći standardni JDBC. Veza se može dobiti bilo kojim JNDI izvorom podataka ili bilo kojom tvornicom veze.

Osnovna konfiguracija sastoji se od a Izvor podataka ili ConnectionFactory, ColumnConfigs i tableName:

Ajmo sada isprobati:

@Test javna praznina givenLoggerWithJdbcConfig_whenLogToDataSource_thanOK () baca iznimku {Logger logger = LogManager.getLogger ("JDBC_APPENDER"); konačni broj int = 88; for (int i = 0; i <count; i ++) {logger.info ("Ovo je JDBC poruka # {} na razini INFO.", count); } Veza veze = ConnectionFactory.getConnection (); ResultSet resultSet = connection.createStatement () .executeQuery ("SELECT COUNT (*) AS ROW_COUNT FROM logs"); int logCount = 0; if (resultSet.next ()) {logCount = resultSet.getInt ("ROW_COUNT"); } assertTrue (logCount == count); }

10. Zaključak

Ovaj članak prikazuje vrlo jednostavne primjere kako pomoću Log4J2 možete koristiti različite dodatke za bilježenje, filtre i izglede te načine njihovog konfiguriranja.

Primjeri koji prate članak dostupni su na GitHubu.