Bevezetés a Log4j2-be - Függelékek, elrendezések és szűrők

1. Áttekintés

Az események naplózása a szoftverfejlesztés kritikus eleme. Noha rengeteg keretrendszer áll rendelkezésre a Java ökoszisztémájában, a Log4J évtizedek óta a legnépszerűbb, az általa nyújtott rugalmasság és egyszerűség miatt.

A Log4j 2 a klasszikus Log4j keretrendszer új és továbbfejlesztett változata.

Ebben a cikkben gyakorlati példákon keresztül mutatjuk be a leggyakoribb függelékeket, elrendezéseket és szűrőket.

A Log4J2-ben a hozzáfűző egyszerűen naplóesemények célpontja; lehet olyan egyszerű, mint egy konzol, és összetett lehet, mint bármely RDBMS. Az elrendezések meghatározzák a naplók megjelenítésének módját, és a szűrők szűrik az adatokat a különböző kritériumok szerint.

2. Beállítás

Több naplózó összetevő és azok konfigurációjának megértése érdekében állítsunk be különféle teszt használati eseteket, amelyek mindegyike a-ból áll log4J2.xml konfigurációs fájl és a JUnit 4 teszt osztály.

Két maven függőség közös minden példában:

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

A fő mellett log4j-mag csomagot tartalmaznunk kell a csomaghoz tartozó „teszt jar” -t, hogy hozzáférhessünk a nem mindennapi nevű konfigurációs fájlok teszteléséhez szükséges kontextusszabályhoz.

3. Alapértelmezett konfiguráció

ConsoleAppender a. alapértelmezett konfigurációja Log4J 2 magcsomag. Egyszerű mintával naplózza az üzeneteket a rendszerkonzolra:

Elemezzük a címkéket ebben az egyszerű XML-konfigurációban:

  • Konfiguráció: Az a gyökéreleme Log4J 2 konfigurációs fájl és attribútum állapot a belső Log4J események szintje, amelyet naplózni akarunk
  • Függelékek: Ez az elem egy vagy több függeléket tartalmaz. Itt konfigurálunk egy hozzáfűzőt, amely normál kimeneten kimen a rendszerkonzolra
  • Fakitermelők: Ez az elem több konfiguráltból állhat Logger elemek. A különlegessel Gyökér címkét, beállíthat egy név nélküli szabványos naplózót, amely az összes naplóüzenetet megkapja az alkalmazástól. Minden naplózót beállíthat egy minimális naplószintre
  • AppenderRef: Ez az elem meghatároz egy hivatkozást egy elemre a Függelékek szakasz. Ezért a „ref„Kapcsolódik egy függelékhez”név' tulajdonság

A megfelelő egység teszt hasonlóan egyszerű lesz. Megszerezzük a Logger két üzenet hivatkozása és nyomtatása:

@Test public void givenLoggerWithDefaultConfig_whenLogToConsole_thanOK () dobja a Kivételt {Logger logger = LogManager.getLogger (getClass ()); E kivétel = új RuntimeException ("Ez csak teszt!"); logger.info ("Ez egy egyszerű üzenet INFO szinten." + "Rejtve lesz."); logger.error ("Ez egy egyszerű üzenet ERROR szinten." + "Ez a minimális látható szint.", e); } 

4. ConsoleAppender Val vel PatternLayout

Határozzunk meg egy új konzol-kiegészítõt egy testreszabott színmintával egy külön XML-fájlban, és tegyük bele a fõ konfigurációba:

Ez a fájl néhány mintaváltozót használ, amelyek helyébe a következő lép Log4J 2 futás közben:

  • % style {…} {colorname}: Ez kinyomtatja az első zárójelpárban lévő szöveget () adott színben (colorname).
  • % kiemelés {…} {FATAL = colorname,…}: Ez hasonló a „stílus” változóhoz. De minden naplószinthez más színt lehet megadni.
  • %dátum formátum}: Ezt a megadott dátum aktuális dátuma váltja fel formátum. Itt a „DEFAULT” DateTime formátumot használjuk, éééé-MM-dh HH: mm: ss, SSS '.
  • % -5szint: Jobbra igazítva nyomtatja ki a naplóüzenet szintjét.
  • %üzenet: A nyers naplóüzenetet képviseli

De sokkal több változó és formázás létezik a PatternLayout. Hivatkozhat a Log4J 2 hivatalos dokumentációjára.

Most a definiált konzolos alkalmazást felvesszük a fő konfigurációnkba:

Az egység teszt:

@Test public void givenLoggerWithConsoleConfig_whenLogToConsoleInColors_thanOK () dobja a Kivételt {Logger logger = LogManager.getLogger ("CONSOLE_PATTERN_APPENDER_MARKER"); logger.trace ("Ez egy színes üzenet TRACE szinten."); ...} 

5. Async File Appender With JSONLayout és BurstFilter

Néha hasznos a naplóüzeneteket aszinkron módon írni. Például, ha az alkalmazás teljesítménye elsőbbséget élvez a naplók elérhetőségével szemben.

Ilyen használati esetekben használhatunk egy AsyncAppender.

Például konfigurálunk egy aszinkront JSON log fájl. Ezenkívül tartalmaz egy sorozatfelvétel-szűrőt, amely meghatározott sebességgel korlátozza a napló kimenetét:

   ...          ...        

Vegye figyelembe, hogy:

  • A JSONLayout úgy van konfigurálva, hogy soronként egy naplóeseményt ír
  • A BurstFilter minden eseményt „INFO” vagy annál magasabb szinten dob le, ha kettőnél több van, de legfeljebb 10 elesett esemény
  • A AsyncAppender 80 naplóüzenetből álló pufferre van állítva; ezt követően a puffer a naplófájlba kerül

Vessünk egy pillantást a megfelelő egység tesztre. A csatolt puffert egy hurokban töltjük, hagyjuk, hogy írjon a lemezre, és ellenőrizzük a naplófájl sorszámát:

@Test public void givenLoggerWithAsyncConfig_whenLogToJsonFile_thanOK () dobja a {Logger logger = LogManager.getLogger ("ASYNC_JSON_FILE_APPENDER") kivételt; végső int szám = 88; for (int i = 0; i 0 && logEventsCount <= számlálás); }

6. RollingFile Függelék és XMLLayout

Ezután létrehozunk egy gördülő naplófájlt. Konfigurált fájlméret után a naplófájl tömörítésre és forgatásra kerül.

Ezúttal egy XML elrendezés:

Vegye figyelembe, hogy:

  • A RollingFile Az appender rendelkezik egy „filePattern” attribútummal, amelyet elforgatott naplófájlok elnevezésére használnak, és helyőrző változókkal konfigurálhatók. Példánkban tartalmaznia kell egy dátumot és egy számlálót a fájl utótag előtt.
  • A. Alapértelmezett konfigurációja XMLLayout egyetlen naplóesemény-objektumot fog írni a gyökérelem nélkül.
  • Méret alapú házirendet használunk a naplófájljaink forgatásához.

Egységteszt osztályunk úgy néz ki, mint az előző szakaszban:

@Test public void givenLoggerWithRollingFileConfig_whenLogToXMLFile_thanOK () dobja a {Logger logger = LogManager.getLogger ("XML_ROLLING_FILE_APPENDER") kivételt; végső int szám = 88; for (int i = 0; i <count; i ++) {logger.info ("Ez a # XML fájl XML üzenetének gördülése INFO szinten.", i); }}

7. Syslog Appender

Tegyük fel, hogy a naplózott eseményeket el kell küldenünk egy távoli gépre a hálózaton keresztül. A Log4J2 használatával ennek legegyszerűbb módja a használata Syslog Appender:

   ...     ...        

Az attribútumok a Syslog címke:

  • név: meghatározza a hozzáfűző nevét, és egyedinek kell lennie. Mivel több Syslog-függelékünk is lehet ugyanahhoz az alkalmazáshoz és konfigurációhoz
  • formátum: vagy BSD-re, vagy RFC5424-re állítható, és a Syslog rekordokat ennek megfelelően formáznák
  • host & port: a távoli Syslog kiszolgáló gép gazdagépnevét és portját
  • jegyzőkönyv: hogy TCP-t vagy UPD-t használ-e
  • létesítmény: melyik Syslog létesítménybe írják az eseményt
  • connectTimeoutMillis: a létrehozott kapcsolatra való várakozás időtartama alapértelmezés szerint nulla
  • reconnectionDelayMillis: ideje várni, mielőtt újra megpróbálná a kapcsolatot

8. FailoverAppender

Most előfordulhatnak olyan esetek, amikor az egyik alkalmazó nem tudja feldolgozni a naplóeseményeket, és nem akarjuk elveszíteni az adatokat. Ilyen esetekben a FailoverAppender jól jön.

Például, ha a Syslog Az appender nem küldi el az eseményeket a távoli gépre, ahelyett, hogy elveszítené ezeket az adatokat, visszaeshetnénk FileAppender ideiglenesen.

A FailoverAppender az elsődleges és a másodlagos kiegészítők számát veszi fel. Abban az esetben, ha az elsődleges kudarcot vall, megpróbálja a naplóeseményt másodlagosakkal feldolgozni annak érdekében, hogy az egyiknek sikerüljön, vagy amíg nincsenek másodlagos próbálkozók:

Teszteljük:

@Test public void givenLoggerWithFailoverConfig_whenLog_thanOK () dobja a {Logger logger = LogManager.getLogger ("FAIL_OVER_SYSLOG_APPENDER") kivételt; E kivétel = új RuntimeException ("Ez csak teszt!"); logger.trace ("Ez egy syslog üzenet TRACE szinten."); logger.debug ("Ez egy syslog üzenet DEBUG szinten."); logger.info ("Ez egy syslog üzenet INFO szinten. Ez a minimális látható szint."); logger.warn ("Ez egy syslog üzenet WARN szinten."); logger.error ("Ez egy syslog üzenet ERROR szinten.", e); logger.fatal ("Ez egy syslog üzenet FATAL szinten."); }

9. JDBC Appender

A JDBC appender naplóeseményeket küld egy RDBMS-be, a szokásos JDBC használatával. A kapcsolat bármely JNDI adatforrással vagy bármely kapcsolatgyárral megszerezhető.

Az alapkonfiguráció a Adatforrás vagy ConnectionFactory, ColumnConfigs és tableName:

Most próbáljuk ki:

@Test public void givenLoggerWithJdbcConfig_whenLogToDataSource_thanOK () dobja a {Logger logger = LogManager.getLogger ("JDBC_APPENDER") kivételt; végső int szám = 88; for (int i = 0; i <count; i ++) {logger.info ("Ez a JDBC # {} üzenet INFO szinten.", count); } Csatlakozási kapcsolat = ConnectionFactory.getConnection (); ResultSet resultSet = connection.createStatement () .executeQuery ("SELECT COUNT (*) AS ROW_COUNT FROM naplókból"); int logCount = 0; if (resultSet.next ()) {logCount = resultSet.getInt ("ROW_COUNT"); } assertTrue (logCount == count); }

10. Következtetés

Ez a cikk nagyon egyszerű példákat mutat be arra, hogyan használhatja a különböző naplózási függelékeket, szűrőket és elrendezéseket a Log4J2-vel, valamint azok konfigurálásának módjait.

A cikkhez mellékelt példák a GitHub oldalon érhetők el.