Úvod do Log4j2 - prílohy, rozloženia a filtre

1. Prehľad

Protokolovanie udalostí je kritickým aspektom vývoja softvéru. Aj keď v ekosystéme Java existuje veľa rámcov, Log4J je už desaťročia najpopulárnejší vďaka flexibilite a jednoduchosti, ktorú poskytuje.

Log4j 2 je nová a vylepšená verzia klasického rámca Log4j.

V tomto článku si prostredníctvom praktických príkladov predstavíme najbežnejšie prílohy, rozloženia a filtre.

V aplikácii Log4J2 je príloha jednoducho cieľom udalostí protokolu; môže to byť také jednoduché ako konzola a môže to byť zložité ako každé RDBMS. Rozloženia určujú, ako budú protokoly prezentované, a filtre filtrujú údaje podľa rôznych kritérií.

2. Inštalácia

Aby sme pochopili niekoľko protokolovacích komponentov a ich konfiguráciu, pripravme si rôzne testovacie prípady použitia, z ktorých každý pozostáva z a log4J2.xml konfiguračný súbor a JUnit 4 testovacia trieda.

Pre všetky príklady sú spoločné dve závislé závislosti:

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

Okrem hlavnej log4j-jadro balíček musíme zahrnúť „testovaciu nádobu“ patriacu do balíka, aby sme získali prístup k pravidlu kontextu potrebnému na testovanie neobvykle pomenovaných konfiguračných súborov.

3. Predvolená konfigurácia

ConsoleAppender je predvolená konfigurácia Log4J 2 jadrový balík. Zaznamenáva správy do systémovej konzoly jednoduchým spôsobom:

Poďme analyzovať značky v tejto jednoduchej konfigurácii XML:

  • Konfigurácia: Koreňový prvok a Log4J 2 konfiguračný súbor a atribút postavenie je úroveň interných udalostí Log4J, ktorú chceme zaznamenať
  • Dodatky: Tento prvok obsahuje jeden alebo viac príveskov. Tu nakonfigurujeme doplnok, ktorý sa štandardne vydáva na výstup do systémovej konzoly
  • Drevorubači: Tento prvok môže pozostávať z viacerých nakonfigurovaných Logger prvkov. So špeciálnym Koreň tag, môžete nakonfigurovať bezmenný štandardný logger, ktorý bude prijímať všetky logovacie správy z aplikácie. Každý záznamník je možné nastaviť na minimálnu úroveň záznamu
  • AppenderRef: Tento prvok definuje odkaz na prvok z Dodatky oddiel. Preto sa atribút „ref„Je prepojený s prílohou“názov„Atribút

Zodpovedajúci jednotkový test bude podobne jednoduchý. Získame Logger odkaz a vytlačiť dve správy:

@ Test public void givenLoggerWithDefaultConfig_whenLogToConsole_thanOK () vyvolá výnimku {Logger logger = LogManager.getLogger (getClass ()); Výnimka e = nová RuntimeException ("Toto je iba test!"); logger.info („Toto je jednoduchá správa na úrovni INFO.“ + „Bude skrytá.“); logger.error („Toto je jednoduchá správa na úrovni CHYB.“ + „Toto je minimálna viditeľná úroveň.“, e); } 

4. ConsoleAppender S PatternLayout

Definujme nového dodávateľa konzoly s prispôsobeným farebným vzorom v samostatnom súbore XML a zahrňme ho do našej hlavnej konfigurácie:

Tento súbor používa niektoré premenné vzoru, ktoré budú nahradené Log4J 2 za behu:

  • % štýl {…} {colorname}: Týmto sa vytlačí text v prvom páre zátvoriek () v danej farbe (názov farby).
  • % zvýraznenie {…} {FATAL = colorname,…}: Je to podobné ako pri premennej ‘štýl’. Pre každú úroveň denníka je možné zvoliť inú farbu.
  • %formát dátumu}: To bude nahradené aktuálnym dátumom v zadanom formát. Tu používame formát „DEFAULT“ DateTime, rrrr-MM-dd HH: mm: ss, SSS '.
  • % - 5 úrovní: Vytlačí úroveň správy denníka zarovnaným doprava.
  • % správ: Predstavuje nespracovanú správu protokolu

V systéme ale existuje oveľa viac premenných a formátovania PatternLayout. Môžete ich odkázať na oficiálnu dokumentáciu Log4J 2.

Teraz do našej hlavnej konfigurácie zahrnieme definovaného pripájača konzoly:

Jednotková skúška:

@Test public void givenLoggerWithConsoleConfig_whenLogToConsoleInColors_thanOK () vyvolá výnimku {Logger logger = LogManager.getLogger ("CONSOLE_PATTERN_APPENDER_MARKER"); logger.trace ("Toto je farebná správa na úrovni TRACE."); ...} 

5. Asynchronizovať prílohu súboru s JSONLayout a BurstFilter

Niekedy je užitočné písať správy denníka asynchrónnym spôsobom. Napríklad ak má výkon aplikácie prednosť pred dostupnosťou protokolov.

V takýchto prípadoch použitia môžeme použiť AsyncAppender.

Pre náš príklad konfigurujeme asynchrónny JSON logovací súbor. Ďalej zahrnieme zhlukový filter, ktorý obmedzuje výstup protokolu zadanou rýchlosťou:

   ...          ...        

Všimni si:

  • The JSONLayout je nakonfigurovaný spôsobom, ktorý zapisuje jednu udalosť protokolu do každého riadku
  • The BurstFilter zruší každú udalosť s úrovňou „INFO“ a vyššou, ak sú viac ako dve, ale maximálne do 10 zrušených udalostí
  • The AsyncAppender je nastavená na medzipamäť 80 správ protokolu; potom sa vyrovnávacia pamäť vyprázdni do súboru protokolu

Pozrime sa na zodpovedajúci test jednotky. Vyplňujeme pripojený buffer v slučke, necháme ho zapísať na disk a skontrolujeme počet riadkov v protokolovom súbore:

@Test public void givenLoggerWithAsyncConfig_whenLogToJsonFile_thanOK () vyvolá výnimku {Logger logger = LogManager.getLogger ("ASYNC_JSON_FILE_APPENDER"); konečný počet int = 88; pre (int i = 0; i 0 && logEventsCount <= počet); }

6. RollingFile Dodatok a XMLLayout

Ďalej vytvoríme postupný súbor denníka. Po nakonfigurovanej veľkosti súboru sa súbor protokolu komprimuje a otočí.

Tentokrát používame XML rozloženie:

Všimni si:

  • The RollingFile appender má atribút 'filePattern', ktorý sa používa na pomenovanie otočených súborov denníka a dá sa nakonfigurovať pomocou zástupných premenných. V našom príklade by mal obsahovať dátum a počítadlo pred príponou súboru.
  • Predvolená konfigurácia XMLLayout zapíše jednotlivé objekty udalostí protokolu bez koreňového prvku.
  • Na rotáciu súborov protokolu používame zásady založené na veľkosti.

Naša trieda testovania jednotiek bude vyzerať ako tá z predchádzajúcej sekcie:

@Test public void givenLoggerWithRollingFileConfig_whenLogToXMLFile_thanOK () vyvolá výnimku {Logger logger = LogManager.getLogger ("XML_ROLLING_FILE_APPENDER"); konečný počet int = 88; for (int i = 0; i <count; i ++) {logger.info ("Toto je postupná správa XML súboru # {} na úrovni INFO.", i); }}

7. Syslog Dodatok

Povedzme, že musíme poslať zaznamenané udalosti na vzdialený stroj cez sieť. Najjednoduchší spôsob, ako to urobiť pomocou Log4J2, by bolo jeho použitie Syslog Appender:

   ...     ...        

Atribúty v Syslog značka:

  • názov: definuje meno prihlasovateľa a musí byť jedinečné. Pretože pre tú istú aplikáciu a konfiguráciu môžeme mať viac doplnkov Syslog
  • formát: môže byť nastavený na BSD alebo RFC5424 a záznamy Syslog by boli zodpovedajúcim spôsobom naformátované
  • hostiteľ a port: názov hostiteľa a port vzdialeného servera servera Syslog
  • protokol: či použiť TCP alebo UPD
  • zariadenie: do ktorého zariadenia Syslog sa udalosť zapíše
  • connectTimeoutMillis: doba čakania na nadviazané pripojenie, predvolené nastavenie je nula
  • reconnectionDelayMillis: čas čakať pred opätovným pokusom o pripojenie

8. FailoverAppender

Teraz môžu nastať prípady, keď jeden prihlasovateľ nedokáže spracovať udalosti denníka a my nechceme prísť o údaje. V takýchto prípadoch FailoverAppender príde vhod.

Napríklad ak Syslog appender nedokáže odoslať udalosti na vzdialený počítač, namiesto straty týchto údajov by sme sa mohli vrátiť späť FileAppender dočasne.

The FailoverAppender vezme primárneho dodatku a počet sekundárnych dodatkov. V prípade, že primárny server zlyhá, pokúsi sa spracovať udalosť protokolu so sekundárnymi, kým nebude úspešný alebo kým nebudú k dispozícii sekundári, ktorí by to vyskúšali:

Poďme to vyskúšať:

@Test public void givenLoggerWithFailoverConfig_whenLog_thanOK () vyvolá výnimku {Logger logger = LogManager.getLogger ("FAIL_OVER_SYSLOG_APPENDER"); Výnimka e = nová RuntimeException ("Toto je iba test!"); logger.trace ("Toto je správa syslog na úrovni TRACE."); logger.debug ("Toto je správa syslog na úrovni DEBUG."); logger.info ("Toto je správa syslog na úrovni INFO. Toto je minimálna viditeľná úroveň."); logger.warn ("Toto je správa syslog na úrovni WARN."); logger.error ("Toto je správa syslog na úrovni CHYBY.", e); logger.fatal ("Toto je správa syslog na úrovni FATAL."); }

9. Dodatok JDBC

Aplikátor JDBC odosiela udalosti protokolu do RDBMS pomocou štandardného JDBC. Pripojenie je možné získať pomocou ľubovoľného zdroja údajov JNDI alebo ľubovoľnej továrne na pripojenie.

Základnú konfiguráciu tvorí a Dátový zdroj alebo ConnectionFactory, ColumnConfigs a tableName:

Teraz vyskúšame:

@Test public void givenLoggerWithJdbcConfig_whenLogToDataSource_thanOK () vyvolá výnimku {Logger logger = LogManager.getLogger ("JDBC_APPENDER"); konečný počet int = 88; for (int i = 0; i <count; i ++) {logger.info ("This is JDBC message # {} at INFO level.", count); } Pripojenie pripojenia = ConnectionFactory.getConnection (); ResultSet resultSet = connection.createStatement () .executeQuery ("VYBERTE POČET (*) AKO ROW_COUNT Z protokolov"); int logCount = 0; if (resultSet.next ()) {logCount = resultSet.getInt ("ROW_COUNT"); } assertTrue (logCount == count); }

10. Záver

Tento článok ukazuje veľmi jednoduché príklady toho, ako môžete používať rôzne doplnky protokolovania, filtre a rozloženia pomocou protokolu Log4J2 a spôsoby ich konfigurácie.

Príklady, ktoré sú súčasťou článku, sú k dispozícii na GitHub.