Programová konfigurácia pomocou protokolu Log4j 2

1. Úvod

V tomto výučbe sa pozrieme na rôzne spôsoby programovej konfigurácie Apache Log4j 2.

2. Počiatočné nastavenie

Aby sme mohli začať používať Log4j 2, stačí, aby sme do našich závislostí zahrnuli závislosti log4j-core a log4j-slf4j-impl pom.xml:

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

3. ConfigurationBuilder

Keď máme Maven nakonfigurovaný, musíme vytvoriť a ConfigurationBuilder, čo je trieda, ktorá nám umožňuje konfigurovať prílohy, filtre, rozloženia, a drevorubači.

Log4j 2 poskytuje niekoľko spôsobov, ako získať a ConfigurationBuilder.

Začnime najpriamejšou cestou:

ConfigurationBuilder builder = ConfigurationBuilderFactory.newConfigurationBuilder ();

A začať konfigurovať komponenty, ConfigurationBuilder je vybavený zodpovedajúcim Nový metóda, ako newAppender alebo newLayoutpre každú zložku.

Niektoré komponenty majú rôzne podtypy, napríklad FileAppender alebo ConsoleAppender, a tieto sa v API označujú ako doplnky.

3.1. Konfigurácia príloh

Povedzme staviteľ kam poslať každý riadok protokolu konfiguráciou súboru appender:

AppenderComponentBuilder console = builder.newAppender ("štandardný výstup", "konzola"); builder.add (konzola); AppenderComponentBuilder file = builder.newAppender ("denník", "súbor"); file.addAttribute ("fileName", "target / logging.log"); builder.add (súbor);

Zatiaľ čo väčšina Nový metódy to nepodporujú, newAppender (názov, doplnok) nám umožňuje dať prihlasovateľovi meno, ktoré sa neskôr ukáže ako dôležité. Tieto dodatky, volali sme stdout a denník, hoci sme ich mohli pomenovať čokoľvek.

Tiež sme to povedali staviteľ ktorý dodatok zapojiť (alebo jednoduchšie, aký typ prihlasovateľa). Konzola a Súbor pozrite si dodatky Log4j 2 týkajúce sa zápisu na štandardný výstup a súborový systém.

Aj keď Log4j 2 podporuje niekoľko príloh, ich konfigurácia pomocou Javy môže byť od tej doby trochu zložitá AppenderComponentBuilder je generická trieda pre všetky typy pripájačov.

Vďaka tomu má metódy ako addAttribute a addComponent namiesto setFileName a addTriggeringPolicy:

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

A nakoniec, nezabudni zavolať staviteľ.pridat pridať k hlavnej konfigurácii!

3.2. Konfigurácia filtrov

Do každého z našich príloh môžeme pridať filtre, ktoré rozhodujú o každom riadku denníka, či sa má pridať alebo nie.

Použime MarkerFilter doplnok na našom pripojovacom konzole:

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

Všimnite si, že toto Nový metóda nám neumožňuje pomenovať filter, ale žiada nás, aby sme označili, čo máme robiť, ak filter vyhovuje alebo zlyhá.

V tomto prípade sme to zjednodušili s tým, že ak MarkerFilter potom prejde SÚHLASIŤ logline. Inak, DENY to.

V tomto prípade si všimnite, že to nepripojíme k staviteľ ale namiesto toho dodatkom, že chceme použiť tento filter.

3.3. Konfigurácia rozložení

Ďalej definujeme rozloženie pre každý riadok denníka. V tomto prípade použijeme PatternLayout zapojiť:

LayoutComponentBuilder standard = builder.newLayout ("PatternLayout"); standard.addAttribute ("pattern", "% d [% t]% -5level:% msg% n% throwable"); console.add (štandard); file.add (štandard); roll.add (štandard);

Opäť sme tieto pridali priamo do príslušných príloh namiesto do staviteľ priamo.

3.4. Konfigurácia koreňového záznamníka

Teraz, keď vieme, kam sa budú protokoly odosielať, chceme nakonfigurovať, ktoré protokoly budú smerovať do jednotlivých cieľov.

Koreňový záznamník je najvyšší záznamník Objekt v Jave. Tento záznamník sa použije predvolene, pokiaľ nebude prepísaný.

Použime teda koreňový záznamník na nastavenie predvolenej úrovne protokolovania na CHYBA a predvolený pripojiteľ k nášmu stdout prihlasovateľ zhora:

RootLoggerComponentBuilder rootLogger = builder.newRootLogger (Level.ERROR); rootLogger.add (builder.newAppenderRef ("štandardný výstup")); builder.add (rootLogger);

Ak chceme nasmerovať náš záznamník na konkrétneho dodávateľa, nedávame mu inštanciu staviteľa. Namiesto toho odkazujeme na to názov že sme to dali skôr.

3.5. Konfigurácia ďalších záznamníkov

Podradené protokolovacie nástroje sa dajú použiť na zacielenie na konkrétne balíčky alebo názvy protokolovacích protokolov.

Pridajme záznamník pre com balíka v našej aplikácii, nastavenie úrovne protokolovania na DEBUG a nechať ich ísť do našej log prihlasovateľ:

LoggerComponentBuilder logger = builder.newLogger ("com", Level.DEBUG); logger.add (builder.newAppenderRef ("log")); logger.addAttribute ("aditivita", nepravda); builder.add (logger);

Všimnite si, že môžeme nastaviť aditívnosť s našimi záznamníkmi, čo naznačuje, či má tento záznamník dediť vlastnosti, ako je úroveň protokolovania a typy pripájačov od svojich predkov.

3.6. Konfigurácia ďalších komponentov

Nie všetky komponenty majú vyhradené Nový metóda na ConfigurationBuilder.

V takom prípade teda voláme newComponent.

Napríklad preto, že neexistuje TriggeringPolicyComponentBuilder, musíme použiť newComponent niečo ako zadanie našich zásad spúšťania pre doplnkov súborov:

ComponentBuilder triggeringPolicies = builder.newComponent ("Pravidlá"). AddComponent (builder.newComponent ("CronTriggeringPolicy") .addAttribute ("harmonogram", "0 0 0 * *?")) .AddComponent (builder.newComponent ("SizeBasedTrigg") .addAttribute ("veľkosť", "100 M")); rolling.addComponent (triggeringPolicies);

3.7. Ekvivalent XML

ConfigurationBuilder je vybavený praktickou metódou na vytlačenie ekvivalentného XML:

builder.writeXmlConfiguration (System.out);

Spustenie vyššie uvedeného riadku sa vytlačí:

To sa hodí, keď chceme dvakrát skontrolovať našu konfiguráciu alebo ak chceme v konfigurácii pokračovať, povedzme do súborového systému.

3.8. Dávať to všetko dokopy

Teraz, keď sme plne nakonfigurovaní, povedzme Log4j 2, aby použil našu konfiguráciu:

Configurator.initialize (builder.build ());

Po vyvolaní budúce hovory na Log4j 2 budú využívať našu konfiguráciu.

To znamená, že sa musíme dovolať Konfigurátor.inicializovať predtým, ako zavoláme na číslo LogManager.getLogger.

4. ConfigurationFactory

Teraz, keď sme videli jeden spôsob, ako získať a uplatniť a ConfigurationBuilder, pozrime sa ešte na jednu:

verejná trieda CustomConfigFactory rozširuje ConfigurationFactory {verejná konfigurácia createConfiguration (kontext LoggerContext, ConfigurationSource src) {ConfigurationBuilder builder = super .newConfigurationBuilder (); // ... konfigurovať prílohy, filtre atď. return builder.build (); } public String [] getSupportedTypes () {return new String [] {"*"}; }}

V takom prípade namiesto použitia ConfigurationBuilderFactory, podtriedili sme ConfigurationFactory, abstraktná trieda zameraná na vytváranie inštancií Konfigurácia.

Potom namiesto volania Konfigurátor.inicializovať ako sme to urobili prvýkrát, jednoducho musíme dať Log4j 2 vedieť o našej novej továrni na konfiguráciu.

Existujú tri spôsoby, ako to urobiť:

  • Statická inicializácia
  • Runtime vlastnosť, príp
  • The @Zapojiť anotácia

4.1. Použite statickú inicializáciu

Log4j 2 podporuje volanie setConfigurationFactory počas statickej inicializácie:

static {ConfigurationFactory custom = new CustomConfigFactory (); ConfigurationFactory.setConfigurationFactory (vlastné); }

Tento prístup má rovnaké obmedzenia ako posledný prístup, ktorý sme videli, a to, že sa ho budeme musieť dovolávať pred akýmikoľvek hovormi na číslo LogManager.getLogger.

4.2. Použite runtime vlastnosť

Pokiaľ máme prístup k príkazu Java startup, potom Log4j 2 podporuje aj špecifikáciu ConfigurationFactory používať prostredníctvom a -D parameter:

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

Hlavnou výhodou tohto prístupu je, že sa nemusíme starať o poradie inicializácie, ako to robíme pri prvých dvoch prístupoch.

4.3. Použi @Zapojiť Anotácia

A nakoniec, za okolností, keď sa nechceme pohrávať s príkazom spustenia Java pridaním a -D, môžeme jednoducho anotovať naše CustomConfigurationFactory s Log4j 2 @Zapojiť anotácia:

@Plugin (name = "CustomConfigurationFactory", category = ConfigurationFactory.CATEGORY) @Order (50) verejná trieda CustomConfigFactory rozširuje ConfigurationFactory {// ... zvyšok implementácie}

Log4j 2 prehľadá triednu cestu pre triedy, ktoré majú @Zapojiť anotácia a nájdenie tejto triedy v ConfigurationFactory kategórie, použije ju.

4.4. Kombinácia so statickou konfiguráciou

Ďalšou výhodou používania a ConfigurationFactory rozšírenie je, že môžeme ľahko kombinovať našu vlastnú konfiguráciu s inými zdrojmi konfigurácie, ako je XML:

verejná konfigurácia createConfiguration (kontext LoggerContext, ConfigurationSource src) {vrátiť nový WithXmlConfiguration (kontext, src); } 

The zdroj parameter predstavuje statický konfiguračný súbor XML alebo JSON, ktorý Log4j 2 nájde, ak existuje.

Môžeme vziať tento konfiguračný súbor a poslať ho na našu vlastnú implementáciu XmlConfiguration kam môžeme umiestniť ľubovoľnú potrebnú konfiguráciu:

verejná trieda WithXmlConfiguration rozširuje XmlConfiguration {@Override chránený void doConfigure () {super.doConfigure (); // analyzovať xml dokument // ... pridať našu vlastnú konfiguráciu}}

5. Záver

V tomto článku sme sa pozreli na to, ako používať nové ConfigurationBuilder API dostupné v Log4j 2.

Pozreli sme sa aj na prispôsobenie ConfigurationFactory v kombinácii s ConfigurationBuilder pre pokročilejšie prípady použitia.

Nezabudnite si pozrieť moje úplné príklady na GitHub.