Log4j 2 doplnky

1. Prehľad

Log4j 2 používa na formátovanie a výstup protokolov doplnky ako Appenders and Layouts. Nazývajú sa základné doplnky a Log4j 2 poskytuje veľa možností, z ktorých si môžeme vybrať.

V niektorých prípadoch však možno budeme musieť rozšíriť existujúci doplnok alebo dokonca napísať vlastný doplnok.

V tomto výučbe použijeme na implementáciu vlastných doplnkov mechanizmus rozšírenia Log4j 2.

2. Rozšírenie doplnkov Log4j 2

Pluginy v Log4j 2 sú zhruba rozdelené do piatich kategórií:

  1. Základné doplnky
  2. Prevádzače
  3. Kľúčoví poskytovatelia
  4. Vyhľadávania
  5. Prevodníky typov

Log4j 2 nám umožňuje implementovať vlastné doplnky do všetkých vyššie uvedených kategórií pomocou spoločného mechanizmu. Okrem toho nám tiež umožňuje rozšíriť existujúce doplnky rovnakým prístupom.

V Log4j 1.x je jediným spôsobom, ako rozšíriť existujúci plugin, prepísať jeho implementačnú triedu. Na druhej strane, Log4j 2 uľahčuje rozšírenie existujúcich doplnkov anotáciou triedy pomocou @Zapojiť.

V nasledujúcich častiach implementujeme vlastný doplnok do niekoľkých z týchto kategórií.

3. Doplnok jadra

3.1. Implementácia vlastného doplnku jadra

Kľúčové prvky ako Dodatky, Rozloženia a Filtre sú známe ako základné doplnky v Log4j 2. Aj keď existuje rozmanitý zoznam takýchto doplnkov, v niektorých prípadoch bude možno potrebné implementovať vlastný jadrový doplnok. Zvážte napríklad a ListAppender ktorý zapisuje iba záznamy protokolu do pamäte Zoznam:

@Plugin (name = "ListAppender", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE) verejná trieda ListAppender rozširuje AbstractAppender {private List logList; chránený ListAppender (názov reťazca, filter filtra) {super (názov, filter, null); logList = Collections.synchronizedList (new ArrayList ()); } @PluginFactory public static ListAppender createAppender (@PluginAttribute ("name") Názov reťazca, @PluginElement ("Filter") konečný filter filtra) {vrátiť nový ListAppender (meno, filter); } @Override public void append (LogEvent event) {if (event.getLevel (). IsLessSpecificThan (Level.WARN)) {error ("Nemožno prihlásiť menej ako WARN úroveň."); návrat; } logList.add (udalosť); }}

Triedu sme anotovali @Zapojiť ktorý nám umožňuje pomenovať náš doplnok. Parametre sú tiež anotované pomocou @PluginAttribute. Vnorené prvky ako filter alebo rozloženie sa odovzdajú ako @PluginElement. Teraz môžeme tento doplnok v konfigurácii odkázať pod rovnakým názvom:

3.2. Tvorcovia doplnkov

Príklad v poslednej časti je dosť jednoduchý a prijíma iba jeden parameter názov. Všeobecne možno povedať, že základné doplnky ako dodatky sú oveľa zložitejšie a zvyčajne akceptujú niekoľko konfigurovateľných parametrov.

Zvážte napríklad prihlasovateľa, ktorý zapisuje protokoly Kafka:

Na implementáciu týchto doplnkov poskytuje Log4j 2 implementáciu nástroja na tvorbu doplnkov založenú na Staviteľ vzor:

@Plugin (name = "Kafka2", category = Core.CATEGORY_NAME) verejná trieda KafkaAppender rozširuje AbstractAppender {public static class Builder implementuje org.apache.logging.log4j.core.util.Builder {@PluginBuilderAttribute ("name") @Požadované súkromné Názov reťazca; @PluginBuilderAttribute ("ip") súkromný reťazec ipAddress; // ... ďalšie vlastnosti // ... getters and setters @Override public KafkaAppender build () {return new KafkaAppender (getName (), getFilter (), getLayout (), true, new KafkaBroker (ipAddress, port, topic, priečka)); }} súkromný sprostredkovateľ KafkaBroker; private KafkaAppender (názov reťazca, filter filtra, rozloženie rozloženia, boolean ignoreExceptions, sprostredkovateľ KafkaBroker) {super (name, filter, layout, ignoreExceptions); this.broker = sprostredkovateľ; } @Override public void append (udalosť LogEvent) {connectAndSendToKafka (sprostredkovateľ, udalosť); }}

V skratke sme predstavili a Staviteľ triedy a anotoval parametre pomocou @PluginBuilderAttribute. Kvôli tomu, KafkaAppender akceptuje parametre pripojenia Kafka z konfigurácie zobrazenej vyššie.

3.3. Rozšírenie existujúceho doplnku

Môžeme tiež rozšíriť existujúci jadrový doplnok v Log4j 2. To môžeme dosiahnuť tým, že nášmu doplnku dáme rovnaký názov ako existujúcemu doplnku. Napríklad, ak rozširujeme RollingFileAppender:

@Plugin (name = "RollingFile", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE) verejná trieda RollingFileAppender rozširuje AbstractAppender {public RollingFileAppender (názov reťazca, filter, rozloženie) {super (názov, filter, rozloženie); } @Override public void append (udalosť LogEvent) {}}

Je pozoruhodné, že teraz máme dva prílohy s rovnakým menom. V takomto prípade použije Log4j 2 appender, ktorý sa objaví ako prvý. Viac o objavovaní doplnkov sa dozvieme v ďalšej časti.

Upozorňujeme, že program Log4j 2 odrádza od viacerých doplnkov s rovnakým názvom. Je lepšie implementovať vlastný doplnok a použiť ho v konfigurácii protokolovania.

4. Plugin prevodníka

Rozloženie je v aplikácii Log4j 2 výkonným doplnkom. Umožňuje nám definovať výstupnú štruktúru pre naše protokoly. Napríklad môžeme použiť JsonLayout na zápis protokolov vo formáte JSON.

Ďalším takýmto doplnkom je PatternLayout. V niektorých prípadoch chce aplikácia zverejniť informácie ako ID vlákna, názov vlákna alebo časová pečiatka s každým výpisom z denníka. PatternLayout plugin nám umožňuje vložiť také detaily cez reťazec konverzného vzoru v konfigurácii:

Tu, % d je konverzný vzor. Log4j 2 prevádza tento vzor% d cez a DatePatternConverter ktorý rozumie konverznému vzoru a nahradí ho formátovaným dátumom alebo časovou pečiatkou.

Teraz predpokladajme, že aplikácia bežiaca v kontajneri Docker chce vytlačiť názov kontajnera s každým výpisom z protokolu. Za týmto účelom implementujeme a DockerPatterConverter a zmeňte vyššie uvedenú konfiguráciu tak, aby obsahovala konverzný reťazec:

@Plugin (name = "DockerPatternConverter", category = PatternConverter.CATEGORY) @ConverterKeys ({"docker", "container"}) verejná trieda DockerPatternConverter rozširuje LogEventPatternConverter {private DockerPatternConverter (možnosti String []), super ("Docker") docker "); } public static DockerPatternConverter newInstance (možnosti reťazca []) {vrátiť nový DockerPatternConverter (možnosti); } @Override public void format (udalosť LogEvent, StringBuilder toAppendTo) {toAppendTo.append (dockerContainer ()); } private String dockerContainer () {return "container-1"; }}

Implementovali sme teda zvyk DockerPatternConverter podobný vzoru dátumu. Nahradí konverzný vzor názvom kontajnera Docker.

Tento doplnok je podobný základnému doplnku, ktorý sme implementovali skôr. Je pozoruhodné, že existuje iba jedna anotácia, ktorá sa líši od posledného doplnku. @ConverterKeys anotácia akceptuje vzor prevodu pre tento doplnok.

Vďaka tomu sa tento doplnok prevedie % ukotviteľný panel alebo % kontajnera reťazec vzoru do názvu kontajnera, v ktorom je aplikácia spustená:

5. Vyhľadávací doplnok

Doplnky vyhľadávania sa používajú na pridanie dynamických hodnôt do konfiguračného súboru Log4j 2. Umožňujú aplikáciám vkladať hodnoty runtime do niektorých vlastností v konfiguračnom súbore. Hodnota sa pridáva pomocou kľúčového vyhľadávania v rôznych zdrojoch, ako je súborový systém, databáza atď.

Jedným z takýchto doplnkov je DateLookupPlugin , ktorý umožňuje nahradenie vzoru dátumu aktuálnym systémovým dátumom aplikácie:

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

V tomto vzorovom konfiguračnom súbore RollingFileAppender používa a dátum vyhľadávanie, kde bude výstup vo formáte MM-dd-rrrr. Výsledkom je, že Log4j 2 zapisuje protokoly do výstupného súboru s príponou dátumu.

Podobne ako iné doplnky, aj Log4j 2 poskytuje veľa zdrojov pre vyhľadávanie. Okrem toho uľahčuje implementáciu vlastných vyhľadávaní, ak je potrebný nový zdroj:

@Plugin (name = "kafka", category = StrLookup.CATEGORY) verejná trieda KafkaLookup implementuje StrLookup {@Override verejné vyhľadávanie reťazcov (kľúč reťazca) {návrat getFromKafka (kľúč); } @Override verejné vyhľadávanie reťazcov (udalosť LogEvent, kľúč reťazca) {návrat getFromKafka (kľúč); } private String getFromKafka (String topicName) {return "topic1-p1"; }}

Takže KafkaVyhľadanie vyrieši hodnotu dotazom na tému Kafka. Teraz odovzdáme názov témy z konfigurácie:

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

Vymenili sme dátum vyhľadávanie v našom staršom príklade s vyhľadávaním Kafka, ktoré bude dopytovať téma-1.

Pretože Log4j 2 volá iba predvolený konštruktor vyhľadávacieho pluginu, neimplementovali sme @PluginFactory ako sme to urobili v predchádzajúcich doplnkoch.

6. Objavovanie doplnkov

Na záver pochopíme, ako Log4j 2 objavuje doplnky v aplikácii. Ako sme videli v príkladoch vyššie, každému doplnku sme dali jedinečný názov. Tento názov slúži ako kľúč, ktorý Log4j 2 prekladá do triedy doplnkov.

Existuje konkrétne poradie, v ktorom Log4j 2 vykonáva vyhľadávanie na vyriešenie triedy doplnkov:

  1. Serializovaný súbor so zoznamom doplnkov v log4j2-jadro knižnica. Konkrétne a Log4j2Plugins.dat je zabalený v tejto nádobe a obsahuje zoznam predvolených doplnkov Log4j 2
  2. Podobný Log4j2Plugins.dat súbor z balíkov OSGi
  3. Zoznam balíkov oddelených čiarkou v log4j.plugin.balíky systémový majetok
  4. V programovej konfigurácii Log4j 2 môžeme volať PluginManager.addPackages () metóda na pridanie a zoznam mien balíkov
  5. V konfiguračnom súbore Log4j 2 je možné pridať zoznam balíkov oddelených čiarkami

Ako nevyhnutná podmienka musí byť povolené spracovanie anotácií, aby umožnil Log4j 2 vyriešiť doplnok pomocou názov uvedené v @Zapojiť anotácia.

Pretože Log4j 2 používa na vyhľadanie doplnku mená, vyššie uvedené poradie sa stáva dôležitým. Napríklad, ak máme dva pluginy s rovnakým názvom, Log4j 2 objaví plugin, ktorý je vyriešený ako prvý. Preto, ak potrebujeme rozšíriť existujúci plugin v Log4j 2, musíme zabaliť plugin do samostatnej nádoby a umiestniť ho pred log4j2-core.jar.

7. Záver

V tomto článku sme sa pozreli na široké kategórie doplnkov v Log4j 2. Diskutovali sme o tom, že aj keď existuje vyčerpávajúci zoznam existujúcich doplnkov, pre niektoré prípady použitia bude možno potrebné implementovať vlastné doplnky.

Neskôr sme sa pozreli na vlastnú implementáciu niektorých užitočných doplnkov. Ďalej sme videli, ako nám Log4j 2 umožňuje pomenovať tieto doplnky a následne ich použiť v konfiguračnom súbore. Nakoniec sme diskutovali o tom, ako Log4j 2 rieši doplnky na základe tohto názvu.

Všetky príklady sú ako vždy k dispozícii na GitHub.


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