Programska konfiguracija s Log4j 2

1. Uvod

U ovom uputstvu ćemo pogledati različite načine programskog konfiguriranja Apache Log4j 2.

2. Početno postavljanje

Da bismo počeli koristiti Log4j 2, samo moramo uključiti ovisnosti log4j-core i log4j-slf4j-impl u našu pom.xml:

 org.apache.logging.log4j log4j-core 2.11.0 org.apache.logging.log4j log4j-slf4j-impl 2.11.0 

3. ConfigurationBuilder

Nakon što smo Maven konfigurirali, tada moramo stvoriti ConfigurationBuilder, što je klasa koja nam omogućuje konfiguriranje dodaci, filtri, izgledi, i drvosječe.

Log4j 2 nudi nekoliko načina za dobivanje a ConfigurationBuilder.

Počnimo s najneposrednijim načinom:

ConfigurationBuilder builder = ConfigurationBuilderFactory.newConfigurationBuilder ();

I za početak konfiguriranja komponenata, ConfigurationBuilder je opremljen odgovarajućim novi metoda, poput newAppender ili newLayout, za svaku komponentu.

Neke komponente imaju različite podtipove, na primjer FileAppender ili ConsoleAppender, a u API-u su navedeni kao dodaci.

3.1. Konfiguriranje dodataka

Recimo graditelj gdje poslati svaki redak dnevnika konfiguriranjem prilijepac:

AppenderComponentBuilder console = builder.newAppender ("stdout", "Console"); builder.add (konzola); AppenderComponentBuilder datoteka = builder.newAppender ("zapisnik", "Datoteka"); file.addAttribute ("FileName", "target / logging.log"); builder.add (datoteka);

Dok većina novi metode to ne podržavaju, newAppender (ime, dodatak) omogućuje nam da dodamo ime podnositelju, što će se kasnije pokazati važnim. Pozvali smo ove priloge stdout i zapisnik, premda smo ih mogli nazvati bilo čime.

Također smo rekli graditelj koji se nadovezuju uključiti (ili, jednostavnije, kakav dodatak) koristiti. Konzola i Datoteka pogledajte dodatke Log4j 2 za upisivanje u standardni out i datotečni sustav.

Iako Log4j 2 podržava nekoliko dodataka, njihovo konfiguriranje pomoću Jave može biti malo nezgodno budući da AppenderComponentBuilder je generička klasa za sve vrste dodavača.

Zbog toga ima metode poput addAttribute i addComponent umjesto setFileName i addTriggeringPolicy:

AppenderComponentBuilder rollingFile = builder.newAppender ("valjanje", "RollingFile"); rollingFile.addAttribute ("Naziv datoteke "," rolling.log "); rollingFile.addAttribute ("filePattern", "kotrljanje-% d {MM-dd-yy} .log.gz"); builder.add (rollingFile); 

I konačno, ne zaboravite nazvati graditelj.dodaj da ga dodate glavnoj konfiguraciji!

3.2. Konfiguriranje filtara

U svaki naš dodavač možemo dodati filtre koji na svakom retku dnevnika odlučuju trebaju li se dodati ili ne.

Iskoristimo MarkerFilter dodatak na našem dodavaču konzole:

FilterComponentBuilder flow = builder.newFilter ("MarkerFilter", Filter.Result.ACCEPT, Filter.Result.DENY); flow.addAttribute ("marker", "FLOW"); console.add (protok);

Imajte na umu da ovo novi metoda ne dopušta imenovanje filtra, ali traži da naznačimo što učiniti ako filtar prođe ili ne uspije.

U ovom smo slučaju to učinili jednostavnim, navodeći da ako MarkerFilter prolazi, dakle PRIHVATITI logline. Inače, ODBIJATI to.

U ovom slučaju imajte na umu da ovo ne dodajemo na graditelj već umjesto dodataka da želimo koristiti ovaj filtar.

3.3. Konfiguriranje izgleda

Dalje, definirajmo raspored za svaki redak dnevnika. U ovom ćemo slučaju koristiti PatternLayout uključiti:

LayoutComponentBuilder standard = builder.newLayout ("PatternLayout"); standard.addAttribute ("obrazac", "% d [% t]% -5 nivo:% msg% n% za bacanje"); console.add (standardno); file.add (standardni); kotrljanje.add (standardno);

Opet smo ih dodali izravno odgovarajućim dodacima umjesto u graditelj direktno.

3.4. Konfiguriranje root root-a

Sad kad znamo kamo će se zapisnici slati, želimo konfigurirati koji će dnevnici ići na svako odredište.

Korijenski zapisnik je najviši zapisovač, slično Objekt na Javi. Ovaj zapisnik je ono što će se koristiti prema zadanim postavkama, osim ako se ne poništi.

Dakle, upotrijebimo root logger da postavimo zadanu razinu bilježenja na POGREŠKA i zadani dodatak našem stdout dodatak odozgo:

RootLoggerComponentBuilder rootLogger = builder.newRootLogger (Level.ERROR); rootLogger.add (builder.newAppenderRef ("stdout")); builder.add (rootLogger);

Da bismo usmjeravali naš zapisnik na određeni dodavač, ne dajemo mu instancu graditelja. Umjesto toga, na to se pozivamo Ime da smo ga dali ranije.

3.5. Konfiguriranje dodatnih zapisnika

Dijelovi zapisnika mogu se koristiti za ciljanje određenih paketa ili imena zapisnika.

Dodajmo zapisnik za com paket u našoj aplikaciji, postavljajući razinu bilježenja na DEBUG i da oni odu kod nas zapisnik dodatak:

LoggerComponentBuilder logger = builder.newLogger ("com", Level.DEBUG); logger.add (builder.newAppenderRef ("log")); logger.addAttribute ("aditivnost", netačno); builder.add (logger);

Imajte na umu da možemo postaviti aditivnost s našim zapisničarima, što pokazuje treba li ovaj zapisovač naslijediti svojstva poput razine bilježenja i tipova dodataka od svojih predaka.

3.6. Konfiguriranje ostalih komponenata

Nisu sve komponente posvećene novi metoda na ConfigurationBuilder.

Dakle, u tom slučaju zovemo newComponent.

Na primjer, zato što ne postoji TriggeringPolicyComponentBuilder, moramo koristiti newComponent za nešto poput specificiranja naše politike pokretanja dodataka za valjane datoteke:

ComponentBuilder triggeringPolicies = builder.newComponent ("Policies") .addComponent (builder.newComponent ("CronTriggeringPolicy") .addAttribute ("schedule", "0 0 0 * *?")) .AddComponent (builder.newComponent ("SizeBandComponent (" Polje ")). .addAttribute ("veličina", "100M")); rolling.addComponent (triggeringPolicies);

3.7. XML ekvivalent

ConfigurationBuilder dolazi opremljen praktičnom metodom za ispis ekvivalentnog XML-a:

builder.writeXmlConfiguration (System.out);

Izvođenje gornjeg retka ispisuje:

To nam dobro dođe kada želimo još jednom provjeriti svoju konfiguraciju ili ako želimo nastaviti s konfiguracijom, recimo, u datotečnom sustavu.

3.8. Sve to zajedno

Sad kad smo u potpunosti konfigurirani, recimo Log4j 2 da koristi našu konfiguraciju:

Configurator.initialize (builder.build ());

Nakon što se ovo pozove, budući pozivi na Log4j 2 koristit će našu konfiguraciju.

Imajte na umu da to znači da se moramo pozivati Konfigurator.inicijalizirati prije nego što obavimo bilo kakav poziv LogManager.getLogger.

4. ConfigurationFactory

Sad kad smo vidjeli jedan način za dobivanje i primjenu a ConfigurationBuilder, pogledajmo još jedan:

javna klasa CustomConfigFactory proširuje ConfigurationFactory {javna konfiguracija createConfiguration (LoggerContext context, ConfigurationSource src) {ConfigurationBuilder builder = super .newConfigurationBuilder (); // ... konfiguriranje dodataka, filtara itd. return builder.build (); } public String [] getSupportedTypes () {return new String [] {"*"}; }}

U ovom slučaju, umjesto korištenja ConfigurationBuilderFactory, podklasirali smo ConfigurationFactory, apstraktna klasa namijenjena stvaranju primjeraka Konfiguracija.

Zatim, umjesto da zovete Konfigurator.inicijalizirati kao i prvi put, jednostavno moramo obavijestiti Log4j 2 o našoj novoj tvornici konfiguracije.

Postoje tri načina za to:

  • Statička inicijalizacija
  • Runtime svojstvo, ili
  • The @Uključiti bilješka

4.1. Koristite statičku inicijalizaciju

Log4j 2 podržava pozivanje setConfigurationFactory tijekom statičke inicijalizacije:

static {ConfigurationFactory custom = new CustomConfigFactory (); ConfigurationFactory.setConfigurationFactory (prilagođeno); }

Ovaj pristup ima ista ograničenja kao i za posljednji pristup koji smo vidjeli, a to je da ćemo se na njega morati pozivati prije bilo kakvih poziva LogManager.getLogger.

4.2. Koristite runtime svojstvo

Ako imamo pristup naredbi za pokretanje Java, tada Log4j 2 također podržava specificiranje ConfigurationFactory koristiti putem a -D parametar:

-Dlog4j2.configurationFactory = com.baeldung.log4j2.CustomConfigFactory

Glavna je korist ovog pristupa u tome što se ne moramo brinuti o redoslijedu inicijalizacije kao što je to slučaj s prva dva pristupa.

4.3. Koristiti @Uključiti Bilješka

I na kraju, u okolnostima kada ne želimo petljati s naredbom za pokretanje Java dodavanjem a -D, jednostavno možemo označiti svoje CustomConfigurationFactory s Log4j 2 @Uključiti napomena:

@Plugin (name = "CustomConfigurationFactory", kategorija = ConfigurationFactory.CATEGORY) @Order (50) javna klasa CustomConfigFactory proširuje ConfigurationFactory {// ... ostatak implementacije}

Log4j 2 će skenirati put predavanja za predmete koji imaju @Uključiti i pronalaženje ove klase u ConfigurationFactory kategorija, koristit će ga.

4.4. Kombinirajući se sa statičkom konfiguracijom

Još jedna prednost korištenja a ConfigurationFactory Proširenje je da svoju prilagođenu konfiguraciju možemo lako kombinirati s drugim izvorima konfiguracije poput XML-a:

javna konfiguracija createConfiguration (LoggerContext context, ConfigurationSource src) {return new WithXmlConfiguration (context, src); } 

The izvor parametar predstavlja statičku XML ili JSON konfiguracijsku datoteku koju Log4j 2 pronalazi ako postoji.

Možemo uzeti tu konfiguracijsku datoteku i poslati je našoj prilagođenoj implementaciji XmlConfiguration gdje možemo smjestiti bilo koju nadmoćnu konfiguraciju koja nam treba:

javna klasa WithXmlConfiguration proširuje XmlConfiguration {@Override protected void doConfigure () {super.doConfigure (); // raščlanjivanje xml dokumenta // ... dodajte našu prilagođenu konfiguraciju}}

5. Zaključak

U ovom smo članku pogledali kako koristiti novo ConfigurationBuilder API dostupan u Log4j 2.

Također smo pogledali i prilagođavanje ConfigurationFactory u kombinaciji sa ConfigurationBuilder za naprednije slučajeve upotrebe.

Ne zaboravite pogledati moje cjelovite primjere na GitHubu.