CodeGym /Java blog /Véletlen /Java naplózás
John Squirrels
Szint
San Francisco

Java naplózás

Megjelent a csoportban
Szia! A leckék megírásakor különösen hangsúlyozom, ha van egy konkrét téma, ami a valós munkában elengedhetetlen lesz. Szóval, FIGYELJ! A téma, amellyel ma foglalkozunk, minden bizonnyal hasznos lesz minden projektjében a munkavállalás első napjától kezdve. A Java naplózásról fogunk beszélni. Ez a téma egyáltalán nem bonyolult (sőt könnyűnek mondanám). De lesz elég nyilvánvaló dolog, amin hangsúlyozni kell az első munkahelyén, ezért jobb, ha most alaposan megérti :) Nos, kezdjük.

Mi az a bejelentkezés a Java-ban?

A naplózás egy program működésével kapcsolatos adatok rögzítésének művelete. Azt a helyet, ahol ezeket az adatokat rögzítjük, "naplónak" nevezik. Rögtön két kérdés merül fel: milyen adatok vannak írva és hol? Kezdjük a "hol"-val. Egy program munkájáról sokféle helyre írhat adatokat. Például tanulmányai során gyakran használja a System.out.println()adatok kimenetére a konzolra. Ez valóban naplózás, bár a legegyszerűbb formájában. Ez persze nem túl kényelmes sem a felhasználóknak, sem a terméktámogató csapatnak: nyilván nem akarnak IDE-t telepíteni és a konzolt felügyelni :) Van egy megszokottabb formátum az információk rögzítésére: szöveges fájlok. Az emberek sokkal kényelmesebben olvasnak adatokat ebben a formátumban, és természetesen sokkal kényelmesebb az adatok tárolása is! Most a második kérdés: milyen programadatokat kell naplózni? Ez teljesen rajtad múlik! A Java naplózási rendszere nagyon rugalmas. Beállíthatja úgy, hogy mindent naplózzon, amit a program csinál. Ez egyrészt jó. De másrészt képzeld el, mekkora lenne a Facebook vagy a Twitter naplója, ha mindent beleírnának. Ezek a nagy cégek valószínűleg képesek ennyi adat tárolására. De képzelje el, milyen nehéz lenne információt találni egy kritikus hibáról az 500 gigabájtnyi szövegnaplóban? Rosszabb lenne, mintha tűt keresnénk a szénakazalban. Ennek megfelelően a Java beállítható úgy, hogy csak hibaadatokat naplózzon. Vagy akár csak kritikus hibák! Ennek ellenére nem teljesen pontos a Java natív naplózási rendszeréről beszélni. A tény az, hogy a programozóknak naplózásra volt szükségük, mielőtt ezt a funkciót hozzáadták a nyelvhez. Mire a Java bevezette a saját naplózási könyvtárát, már mindenki a log4j könyvtárat használta. A Java bejelentkezés története valójában nagyon hosszú és informatív. Röviden: a Java-nak van saját naplózási könyvtára, de szinte senki sem használja :) Később, amikor több különböző naplózókönyvtár megjelent és elkezdték használni a programozók, kompatibilitási problémák merültek fel. Annak megakadályozására, hogy az emberek újra feltalálják a kereket egy tucat különböző, különböző interfésszel rendelkező könyvtárban, létrehozták az absztrakt SLF4J keretrendszert ("Service Logging Facade For Java"). Absztraktnak hívják, mert még ha az SLF4J osztályok metódusait használod és hívod is, valójában az összes korábban létező naplózási keretrendszert használják: log4j, szabványos java.util.logging és mások. Ha valamikor szüksége van a Log4j olyan sajátosságaira, amely más könyvtárakból hiányzik, de nem akarja közvetlenül összekapcsolni projektjét ehhez a könyvtárhoz, egyszerűen használja az SLF4J-t. És akkor hívja meg a Log4j metódusokat. Ha meggondolja magát, és úgy dönt, hogy már nincs szüksége a Log4j szolgáltatásaira, csak újra kell konfigurálnia a "itt , a Log4j könyvtár pedig itt . Ezután csomagolja ki az archívumot, és az IntelliJ IDEA segítségével adja hozzá a JAR fájlokat az osztályútvonalhoz. Menüpontok: Fájl -> Projektstruktúra -> Könyvtárak Válassza ki a szükséges JAR fájlokat és adja hozzá a projekthez (az általunk letöltött archívumok sok JAR fájlt tartalmaznak – nézze meg a képeket, hogy megtalálja a szükségeseket) Vegye figyelembe, hogy ez az utasítás azoknak a hallgatóknak Miért van szükségünk fakitermelésre - 2Miért van szükségünk fakitermelésre - 3szól akik nem tudják, hogyan kell használni a Mavent. Ha ismeri a Maven használatát, általában jobb (sokkal egyszerűbb), ha megpróbálja ott kezdeni. Ha a Maven-t használja , adja hozzá ezt a függőséget:

    	<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
    	</dependency>
Nagy! Kitaláltuk a beállításokat :) Lássuk, hogyan működik az SLF4J. Hogyan biztosíthatjuk, hogy a program munkája valahol rögzítve legyen? Ehhez két dologra van szükségünk: loggerre és appenderre. Kezdjük az elsővel. A naplózó olyan objektum, amely a naplózás teljes ellenőrzését biztosítja. A logger létrehozása nagyon egyszerű: ezt a statikus LoggerFactory.getLogger() metódusokkal tesszük . A metódus paramétere az az osztály, amelynek a művelete naplózásra kerül. Futtassuk a kódunkat:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log entry!!!");
       LOGGER.error("An error occurred!");
   }
}
Konzol kimenet:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
Mit látunk itt? Először egy hibaüzenetet látunk. Ez annak a ténynek köszönhető, hogy most hiányoznak a szükséges beállítások. Ennek megfelelően a loggerünk jelenleg csak hibaüzeneteket (ERROR) képes kiadni, és csak a konzolra. A logger.info() metódus nem működött. De a logger.error() igen! A konzolon az aktuális dátumot látjuk, azt a módszert, ahol a hiba történt ( main), a „HIBA” szót és az üzenetünket! A HIBA a naplózási szint. Általában, ha egy naplóbejegyzés "HIBA" szóval van megjelölve, akkor a program ezen a pontján hiba történt. Ha a bejegyzés „INFO” szóval van jelölve, akkor az üzenet egyszerűen a program normál működésével kapcsolatos aktuális információkat jeleníti meg. Az SLF4J könyvtár számos különböző naplózási szinttel rendelkezik, amelyek lehetővé teszik a naplózás rugalmas konfigurálását. Mindez nagyon könnyen kezelhető: minden szükséges logika már a Java Logger osztályban található. Csak fel kell hívnia a megfelelő módszereket. Ha rutinüzenetet szeretne naplózni, hívja meg a logger.info() metódust. Hibaüzenethez használja a logger.error() parancsot . Figyelmeztetéshez használja a logger.warn()

Most beszéljünk a függelékről

A függelék az a hely, ahová az adatok kerülnek. Bizonyos értelemben az adatforrás ellentéte, azaz "B pont". Alapértelmezés szerint az adatok a konzolra kerülnek. Vegyük észre, hogy az előző példában nem kellett semmit konfigurálnunk: a szöveg megjelent a konzolban, és a Log4j könyvtár naplózója csak HIBA szintű üzeneteket tud kiadni a konzolra. Nyilvánvalóan kényelmesebb, ha az emberek szöveges fájlban olvasnak és írnak naplókat. A naplózó alapértelmezett viselkedésének megváltoztatásához konfigurálnunk kell a fájl függelékünket. A kezdéshez létre kell hoznia egy log4j.xml fájlt közvetlenül az src mappában. Az XML formátumot már ismered: nemrég volt egy leckénk róla :) Íme a fájl tartalma:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
Nincs itt semmi különös vagy nehéz :) De akkor is menjünk végig a tartalomon.
<Configuration status="INFO">
Ez az úgynevezett StatusLogger. Nem kapcsolódik a loggerünkhöz, és a Log4j belső folyamataiban használják. Ha a status="INFO" helyett a status="TRACE"-t állítja be, akkor a Log4j belső munkájával kapcsolatos összes információ megjelenik a konzolon (a StatusLogger adatokat jelenít meg a konzolon, még akkor is, ha a mellékletünk egy fájl). Most nincs rá szükségünk, úgyhogy hagyjuk úgy, ahogy van.

<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Itt készítjük el a függelékünket. A <File> címke azt jelzi, hogy ez egy fájl toldalék lesz. name="MyFileAppender" beállítja a hozzáfűző nevét. fileName="C:\Felhasználók\Felhasználónév\Desktop\testlog.txt" jelzi a naplófájl elérési útját, ahová az összes adatot írják. Az append="true" azt jelzi, hogy az adatokat a fájl végére kell-e írni. A mi esetünkben pontosan ezt tesszük. Ha az értéket false értékre állítja, akkor a program minden indításakor a naplófájl régi tartalma törlődik. <PatternLayout pattern="%d{ééé-hh-nn ÓÓ:pp:ss.SSS} [%t] %-5 szintű %logger{36} - %msg%n"/>a formázási beállításokat jelzi. Itt reguláris kifejezésekkel testreszabhatjuk a szöveg formátumát a naplónkban.

<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Itt a gyökérszintet jelöljük. Beállítottuk az "INFO" szintet, ami azt jelenti, hogy minden olyan üzenet, amelynek szintje magasabb, mint az INFO (a fenti táblázat szerint), nem kerül naplózásra. Programunknak 3 üzenete lesz: egy INFO, egy WARN és egy ERROR. A jelenlegi konfigurációval mind a 3 üzenet naplózásra kerül. Ha a gyökérszintet ERROR-ra módosítja, csak a LOGGER.error() metódushívás utolsó üzenete kerül a naplóba. Ezen kívül a függelékre való hivatkozás is ide tartozik. Egy ilyen hivatkozás létrehozásához létre kell hoznia egy <ApprenderRef> címkét a <Root> címkén belül , és hozzá kell adnia a ref='a hozzáfűző neve' attribútumot. Ha elfelejtette, itt állítjuk be a hozzáfűző nevét: <. És itt a kódunk!

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
Persze ez egy kicsit ciki (a RuntimeException elkapása megkérdőjelezhető ötlet), de a mi céljainkra tökéletes :) Futtassuk le a main() metódusunkat 4-szer egymás után, és nézzük meg a testlog.txt fájlunkat. Nem kell előre létrehoznia: a könyvtár ezt automatikusan megteszi. Minden működött! :) Most már van egy konfigurált naplózó. Játszhat néhány régi programjával, és minden metódushoz naplózóhívásokat ad hozzá. Akkor nézd meg az eredményül kapott naplót :) A naplózás témáját alaposan átgondolja. Nehéz lenne mindezt egy ülésben elolvasni. Ennek ellenére sok további hasznos információt tartalmaz. Például megtanulod, hogyan kell beállítani a naplózót úgy, hogy új szöveges fájlt hozzon létre, ha a testlog.txt fájlunk elér egy bizonyos méretet :) És ezzel véget is ért az óra! A mai napon egy nagyon fontos témával ismerkedtél meg, és ez a tudás minden bizonnyal segítségedre lesz a jövőbeni munkád során. A következő alkalomig! :)
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION