System.out.println vs Naplók
1. Miért a naplózók?
A program írása vagy a vállalati termelési alkalmazás fejlesztése közben a System.out.println a legegyszerűbb és legkönnyebb megoldásnak tűnik. Nincsenek további könyvtárak, amelyeket hozzá lehetne adni az osztályútvonalhoz, és nem kell további konfigurációkat végrehajtani.
De használva System.out.println számos hátránnyal jár, amelyek sok helyzetben befolyásolják a használhatóságát. Ebben az oktatóanyagban megvitatjuk miért és mikor szeretnénk egy egyszerű naplót használni a régi mellett System.out és System.err. Néhány gyors példát is bemutatunk a Log4J2 naplózási keretrendszer használatával.
2. Beállítás
Mielőtt elkezdenénk, nézzük meg a szükséges Maven-függőségeket és konfigurációkat.
2.1. Maven-függőségek
Kezdjük azzal, hogy hozzáadjuk a Log4J2 függőséget a sajátunkhoz pom.xml:
org.apache.logging.log4j log4j-api 2.12.1 org.apache.logging.log4j log4j-core 2.12.1
Megtalálhatjuk a log4j-api és log4j-mag a Maven Central-on.
2.2. Log4J2 konfiguráció
A ... haszna System.out nem igényel további konfigurációt. A Log4J2 használatához azonban szükségünk van a log4j.xml konfigurációs fájl:
Szinte az összes naplózó keretrendszerhez valamilyen szintű konfigurációra van szükség, akár programszerűen, akár egy külső konfigurációs fájlon keresztül, például az itt bemutatott XML fájlon keresztül.
3. A napló kimenetének szétválasztása
3.1. System.out és System.err
Amikor alkalmazásunkat olyan szerverre telepítjük, mint a Tomcat, a szerver saját naplózót használ. Ha használjuk System.out, a rönkök végül catalina.out. Sokkal egyszerűbb az alkalmazásunk hibakeresése, ha a naplók külön fájlba kerülnek. A Log4j2 használatakor be kell illesztenünk egy fájl hozzáfűzőt a konfigurációba, hogy az alkalmazásnaplókat külön fájlba mentse.
Továbbá azzal System.out.println, nincs ellenőrzés és szűrés arról, hogy mely naplókat kell kinyomtatni. A naplók elválasztásának egyetlen lehetséges módja a használat System.out.println információnaplókhoz és System.err.println hibanaplókhoz:
System.out.println ("Ez egy tájékoztató üzenet"); System.err.println ("Ez egy hibaüzenet");
3.2. Log4J2 naplózási szintek
Hibakeresési vagy fejlesztői környezetben meg akarjuk tekinteni az alkalmazás által nyomtatott összes információt. De egy élő vállalati alkalmazásban a több napló a késés növekedését jelenti. Az olyan naplózó keretrendszerek, mint a Log4J2, több naplószintű vezérlést biztosítanak:
- HALÁLOS
- HIBA
- FIGYELMEZTET
- INFO
- HIBÁK
- NYOM
- MINDEN
Ezen szintek használatával könnyen szűrhetjük, hogy mikor és hol milyen információkat nyomtassunk:
logger.trace ("Nyomkövetési naplóüzenet"); logger.debug ("Hibakeresési naplóüzenet"); logger.info ("Info napló üzenet"); logger.error ("Hiba napló üzenet"); logger.warn ("Figyelmeztetési naplóüzenet"); logger.fatal ("Végzetes naplóüzenet");
Az egyes forráskód-csomagok szintjét külön-külön is konfigurálhatjuk. A naplószintű konfigurációról a Java Naplózás cikkünkben olvashat bővebben.
4. Naplók írása fájlokba
4.1. Újratervezés System.out és System.err
Lehetséges útvonal System.out.println fájlba a System.setOut () módszer:
PrintStream outStream = new PrintStream (új fájl ("outFile.txt")); System.setOut (outStream); System.out.println ("Ez egy baeldung cikk");
És abban az esetben System.err:
PrintStream errStream = new PrintStream (új fájl ("errFile.txt")); System.setErr (errStream); System.err.println ("Ez egy baeldung cikkhiba");
Amikor a kimenetet egy fájlba irányítja a System.out vagy System.err, nem tudjuk ellenőrizni a fájl méretét, így a fájl az alkalmazás futtatásának ideje alatt folyamatosan növekszik.
A fájlméret növekedésével nehéz lehet ezeket a nagyobb naplókat megnyitni vagy elemezni.
4.2. Naplózás fájlokba a Log4J2 segítségével
A Log4J2 mechanizmust biztosít a naplók szisztematikus írásához fájlokba, és a fájlok gördítéséhez bizonyos házirendek alapján. Például megtehetjük állítsa be az áthúzandó fájlokat dátum / idő mintázat alapján:
Vagy tehetjük tekerje a fájlokat méret alapján, ha elérik az adott küszöböt:
...% d {éééé-hh-nn. ÓÓ: mm: ss}% p% m% n
5. Naplózás külső rendszerekhez
Amint az előző szakaszban láthattuk, a naplózó keretrendszerek lehetővé teszik a naplók fájlba írását. Hasonlóképpen ők is biztosítják a naplót más rendszerekhez és alkalmazásokhoz. Ez lehetővé teszi a naplók küldését egy Kafka Streambe vagy egy Elasticsearch adatbázisba a Log4J függelékek használatával ahelyett, hogy használná System.out.println. Kérjük, olvassa el a Log4j appender cikkünket, ha további részleteket szeretne tudni az ilyen függelékek használatáról. A Loggers használatával testre szabhatjuk, hogy milyen információkat kell kinyomtatni a tényleges üzenettel együtt. Az általunk kinyomtatható információk tartalmazzák a csomag nevét, a naplószintet, a sorszámot, az időbélyeget, a módszer nevét stb. Bár ez lehetséges lenne System.out.println, sok kézi munkát igényelne, míg a naplózási keretek ezt a funkciót már a dobozon kívül biztosítják. Fakitermelőkkel, egyszerűen meghatározhatunk egy mintát a naplózó konfigurációjában: Ha a Log4J2-t vesszük figyelembe naplózó keretrendszerünkben, akkor többféle minta közül választhatunk vagy testre szabhatunk. További információkért tekintse meg a hivatalos Log4J2 dokumentációt. Ez a cikk különféle okokat fejt ki, miért használhatja a naplózó keretrendszert, és miért nem támaszkodhat csak System.out.println alkalmazásnaplóinkhoz. Bár indokolt a használata System.out.println kis tesztprogramok esetében nem szívesen használnánk a vállalati termelési alkalmazások naplózásának fő forrásaként. Mint mindig, a cikkben szereplő kódpéldák elérhetők a GitHubon.6. A napló kimenet testreszabása
7. Következtetés