Log4j 2 dodaci

1. Pregled

Log4j 2 koristi dodatke kao što su Dodaci i Izgledi za formatiranje i izlaz dnevnika. Oni su poznati kao jezgreni dodaci, a Log4j 2 pruža puno mogućnosti za odabir.

Međutim, u nekim ćemo slučajevima možda morati proširiti postojeći dodatak ili čak napisati prilagođeni.

U ovom uputstvu koristit ćemo mehanizam proširenja Log4j 2 za implementaciju prilagođenih dodataka.

2. Proširenje dodataka Log4j 2

Dodaci u Log4j 2 široko su podijeljeni u pet kategorija:

  1. Osnovni dodaci
  2. Pretvarači
  3. Ključni pružatelji usluga
  4. Pretrage
  5. Pretvarači tipova

Log4j 2 omogućuje nam da implementiramo prilagođene dodatke u sve gore navedene kategorije koristeći zajednički mehanizam. Štoviše, omogućuje nam i proširivanje postojećih dodataka istim pristupom.

U Log4j 1.x jedini način za proširenje postojećeg dodatka je nadjačavanje njegove klase implementacije. S druge strane, Log4j 2 olakšava proširivanje postojećih dodataka označavanjem klase s @Uključiti.

U sljedećim odjeljcima implementirat ćemo prilagođeni dodatak u nekoliko ovih kategorija.

3. Osnovni dodatak

3.1. Implementacija prilagođenog dodatka jezgre

Ključni elementi poput dodataka, izgleda i filtara poznati su kao dodaci jezgre u Log4j 2. Iako postoji raznolik popis takvih dodataka, u nekim ćemo slučajevima možda trebati implementirati prilagođeni jezgreni dodatak. Na primjer, razmotrite a ListAppender koji zapisuje samo zapise dnevnika u memoriju Popis:

@Plugin (name = "ListAppender", kategorija = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE) javna klasa ListAppender proširuje AbstractAppender {private List logList; zaštićeni ListAppender (naziv niza, filtar filtra) {super (ime, filter, null); logList = Collections.synchronizedList (novi ArrayList ()); } @PluginFactory javni statički ListAppender createAppender (@PluginAttribute ("name") Naziv niza, @PluginElement ("Filter") završni filtar filtra) {return new ListAppender (name, filter); } @Override public void append (LogEvent event) {if (event.getLevel (). IsLessSpecificThan (Level.WARN)) {error ("Nije moguće prijaviti se manje od razine WARN."); povratak; } logList.add (događaj); }}

Označili smo razred s @Uključiti koji nam omogućuje imenovanje dodatka. Također, parametri su označeni s @PluginAttribute. Ugnježđeni elementi poput filtra ili izgleda prosljeđuju se kao @PluginElement. Sada ovaj dodatak možemo uputiti u konfiguraciji koristeći isto ime:

3.2. Graditelji dodataka

Primjer u posljednjem odjeljku prilično je jednostavan i prihvaća samo jedan parametar Ime. Općenito govoreći, jezgreni dodaci poput dodataka puno su složeniji i obično prihvaćaju nekoliko konfigurabilnih parametara.

Na primjer, razmotrite dodatak koji upisuje prijave Kafka:

Za primjenu takvih dodataka, Log4j 2 pruža implementaciju graditelja dodataka na temelju Graditelj uzorak:

@Plugin (name = "Kafka2", category = Core.CATEGORY_NAME) javna klasa KafkaAppender proširuje AbstractAppender {public static class Builder implements org.apache.logging.log4j.core.util.Builder {@PluginBuilderAttribute ("name") @ Potrebno privatno Naziv niza; @PluginBuilderAttribute ("ip") privatni niz ipAddress; // ... dodatna svojstva // ... getteri i postavljači @ Override public KafkaAppender build () {return new KafkaAppender (getName (), getFilter (), getLayout (), true, novi KafkaBroker (ipAddress, port, topic, particija)); }} privatni KafkaBroker broker; privatni KafkaAppender (naziv niza, filtar filtra, izgled izgleda, logički ignoreExceptions, broker KafkaBroker) {super (ime, filtar, izgled, ignoreExceptions); this.broker = broker; } @Override public void append (LogEvent event) {connectAndSendToKafka (broker, događaj); }}

Ukratko, uveli smo a Graditelj klase i označio parametre sa @PluginBuilderAttribute. Zbog ovoga, KafkaAppender prihvaća parametre veze Kafka iz gore prikazane konfiguracije.

3.3. Proširenje postojećeg dodatka

Također možemo proširiti postojeći osnovni dodatak u Log4j 2. To možemo postići davanjem dodatka istom imenu kao i postojećem dodatku. Na primjer, ako proširujemo RollingFileAppender:

@Plugin (name = "RollingFile", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE) javna klasa RollingFileAppender proširuje AbstractAppender {public RollingFileAppender (naziv niza, filtar filtra, izgled izgleda) {super (ime, filtar, izgled); } @Override public void append (LogEvent event) {}}

Značajno je da sada imamo dva dodataka s istim imenom. U takvom scenariju, Log4j 2 će upotrijebiti dodatak koji je prvi otkriven. O otkrivanju dodataka vidjet ćemo u kasnijem odjeljku.

Napominjemo da Log4j 2 obeshrabruje više dodataka s istim imenom. Bolje je umjesto toga implementirati prilagođeni dodatak i koristiti ga u konfiguraciji zapisivanja.

4. Dodatak za pretvarač

Izgled je moćan dodatak u Log4j 2. Omogućuje nam definiranje izlazne strukture za naše zapisnike. Na primjer, možemo koristiti JsonLayout za pisanje dnevnika u JSON formatu.

Još jedan takav dodatak je PatternLayout. U nekim slučajevima aplikacija želi objaviti informacije kao što su ID niti, naziv niti ili vremenska oznaka uz svaki izraz dnevnika. PatternLayout dodatak nam omogućuje ugradnju takvih detalja kroz niz uzorka pretvorbe u konfiguraciju:

Ovdje, % d je obrazac pretvorbe. Log4j 2 pretvara ovaj% d obrazac kroz a DatePatternConverter koji razumije obrazac pretvorbe i zamjenjuje ga oblikovanim datumom ili vremenskom oznakom.

Sada pretpostavimo da aplikacija koja se izvodi unutar spremnika Docker želi ispisati ime spremnika sa svakim izrazom dnevnika. Da bismo to učinili, implementirat ćemo a DockerPatterConverter i promijenite gornju konfiguraciju tako da uključuje niz pretvorbe:

@Plugin (name = "DockerPatternConverter", category = PatternConverter.CATEGORY) @ConverterKeys ({"docker", "container"}) javna klasa DockerPatternConverter proširuje LogEventPatternConverter {privatni DockerPatternConverter (String ["Docker)," super ("String [] opcije) {super (" String [] opcije) " lučki radnik"); } javni statički DockerPatternConverter newInstance (opcije String []) {return new DockerPatternConverter (opcije); } @Override public void format (LogEvent event, StringBuilder toAppendTo) {toAppendTo.append (dockerContainer ()); } private String dockerContainer () {return "container-1"; }}

Stoga smo implementirali običaj DockerPatternConverter slično uzorku datuma. Zamijenit će obrazac pretvorbe imenom Docker spremnika.

Ovaj dodatak sličan je osnovnom dodatku koji smo ranije implementirali. Istaknuto je da postoji samo jedna napomena koja se razlikuje od zadnjeg dodatka. @ConverterKeys napomena prihvaća obrazac pretvorbe za ovaj dodatak.

Kao rezultat, ovaj će se dodatak pretvoriti %lučki radnik ili % spremnika string uzorka u ime spremnika u kojem se aplikacija izvodi:

5. Dodatak za pretraživanje

Dodaci za pretraživanje koriste se za dodavanje dinamičkih vrijednosti u konfiguracijsku datoteku Log4j 2. Omogućuju aplikacijama da ugrađuju vrijednosti vremena izvođenja u neka svojstva u konfiguracijsku datoteku. Vrijednost se dodaje pretraživanjem na temelju ključa u raznim izvorima poput datotečnog sustava, baze podataka itd.

Jedan od takvih dodataka je DateLookupPlugin koji omogućuje zamjenu uzorka datuma trenutnim sistemskim datumom aplikacije:

  % d% p% c {1.} [% t]% m% n 

U ovom primjeru konfiguracijske datoteke, RollingFileAppender koristi a datum traženje gdje će izlaz biti u formatu MM-dd-yyyy. Kao rezultat toga, Log4j 2 zapisuje zapisnike u izlaznu datoteku s nastavkom datuma.

Slično ostalim dodacima, Log4j 2 nudi puno izvora za traženje. Štoviše, olakšava implementaciju prilagođenih pretraživanja ako je potreban novi izvor:

@Plugin (name = "kafka", category = StrLookup.CATEGORY) javna klasa KafkaLookup implementira StrLookup {@Override public String lookup (String key) {return getFromKafka (key); } @Override javno pretraživanje niza (događaj LogEvent, ključ niza) {return getFromKafka (ključ); } private String getFromKafka (StringNameName) {return "topic1-p1"; }}

Tako KafkaLookup riješit će vrijednost upitom o Kafkinoj temi. Sada ćemo prenijeti naziv teme iz konfiguracije:

  % d% p% c {1.} [% t]% m% n 

Zamijenili smo datum pretraživanja u našem ranijem primjeru s pretraživanjem Kafke koji će postaviti upit tema-1.

Budući da Log4j 2 poziva samo zadani konstruktor dodatka za pretraživanje, nismo implementirali @PluginFactory kao što smo to činili u ranijim dodacima.

6. Otkrivanje dodataka

Na kraju, shvatimo kako Log4j 2 otkriva dodatke u aplikaciji. Kao što smo vidjeli u gornjim primjerima, svakom dodatku dali smo jedinstveno ime. Ovo ime djeluje kao ključ koji Log4j 2 pretvara u klasu dodatka.

Postoji određeni redoslijed kojim Log4j 2 izvodi pretraživanje radi razrješavanja klase dodatka:

  1. Datoteka sa serijskim popisom dodataka u log4j2-jezgra knjižnica. Konkretno, a Log4j2Plugins.dat je pakiran unutar ove tegle kako bi se naveo zadani dodatak Log4j 2
  2. Sličan Log4j2Plugins.dat datoteka iz OSGi snopova
  3. Popis paketa odvojenih zarezom u log4j.plugin.packages svojstvo sustava
  4. U programskoj konfiguraciji Log4j 2 možemo zvati PluginManager.addPackages () metoda za dodavanje a popis naziva paketa
  5. Popis paketa odvojenih zarezom može se dodati u konfiguracijsku datoteku Log4j 2

Kao preduvjet, obrada bilješki mora biti omogućena kako bi Log4j 2 mogao riješiti dodatak pomoću Ime dano u @Uključiti bilješka.

Budući da Log4j 2 koristi imena za traženje dodatka, gornji redoslijed postaje važan. Na primjer, ako imamo dva dodatka s istim imenom, Log4j 2 će otkriti dodatak koji je prvi riješen. Stoga, ako trebamo proširiti postojeći dodatak u Log4j 2, dodatak moramo spakirati u zasebnu posudu i smjestiti ga ispred log4j2-core.jar.

7. Zaključak

U ovom smo članku pregledali široke kategorije dodataka u Log4j 2. Raspravljali smo o tome da, iako postoji iscrpan popis postojećih dodataka, možda ćemo trebati implementirati prilagođene dodatke za neke slučajeve upotrebe.

Kasnije smo pogledali prilagođenu implementaciju nekih korisnih dodataka. Nadalje, vidjeli smo kako nam Log4j 2 omogućuje imenovanje tih dodataka i naknadno korištenje tog naziva dodataka u konfiguracijskoj datoteci. Na kraju smo razgovarali o tome kako Log4j 2 rješava dodatke na temelju ovog imena.

Kao i uvijek, svi su primjeri dostupni na GitHub-u.


$config[zx-auto] not found$config[zx-overlay] not found