Logger

Logger on objekt, mida kasutatakse mõne komponendi poolt väljastatavate informatiivsete sõnumite logimiseks/salvestamiseks. Loggeri nimeks võib panna ükskõik millise sõne, kuid heade tavade järgi nimetatakse Logger kas paketi või klassi järgi, kuhu logger kuulub.

Logimine on kasulikum kui print-väljendite kirjutamine, kuna viimane ei salvestu kuhugi. Lisaks logimisel on võimalik erinevaid tasemeid ja väljundeid määrata.

Loggeri loomine

Loggerit luuakse järgnevalt:

import java.util.logging.Logger;

public class Example {

    Logger logger = Logger.getLogger(Example.class.getName());  // Good approach, naming after the class it belongs to

    // Name can also be a string defined by ourselves, but a logger should be named after the class it's in.
    Logger anotherLogger = Logger.getLogger("Logger");

}

Logger.getLogger(String name) meetod on staatiline. Meetod saab sisendiks loggeri nime. Esmalt uuritakse kas antud nimega Logger on juba kasutusel või mitte. Kui antud nimega Logger leitakse, tagastatakse see, vastasel juhul luuakse uus objekt.

NB: Soovituslik on logger ära salvestada muutujasse. Vastasel juhul võib Java Garbage Collector loodud objekti ära hävitada.

Tasemed

Logimisel on seitse erinevat taset (kõrgemast madalamale järjekorras):

  • SEVERE - Kõrgeim tase, indikeerib väga tõsist viga.

  • WARNING - Iseloomustab potentsiaalset probleemi.

  • INFO - Kasutatakse informatiivsete sõnumite edastamiseks.

  • CONFIG - Kasutatakse konfiguratsiooni mõjutavate sõnumite edastamiseks.

Järgnevadt kolme kasutatakse detailsete sõnumite edastamiseks.

  • FINE - Kolmest kõige vähesema detailidega, kuid kasutatakse kõige tähtsamate sõnumite puhul

  • FINER - Kasutatakse reeglina entering, returning ja throwing puhul.

  • FINEST - Kõige detailsem.

Lisaks on veel:

  • OFF - Lülitab logimise välja

  • ALL - Logib kõik sõnumid

setLevel() meetodiga saab ära märkida, mis tasemel sõnumeid logisse salvestatakse:

Logger logger = Logger.getLogger("ExampleLogger");

logger.setLevel(Level.FINE);

Kasutamine

Loggeri meetodid on jagatud viite kategooriasse:

  • log meetodid: võtavad sisendiks logimise taseme ning sõnumi, mida logida.

Logger logger = Logger.getLogger("ExampleLogger");

logger.log(Level.INFO, "info message");                             // Most basic example
logger.log(new LogRecord(Level.INFO, "info log record message"));   // Same, but with LogRecord
  • logp meetodid: "log percise" ehk täpne logimine. Lisaks tasemele ja sõnumile logitakse ka klassi ja meetodi nimi.

Logger logger = Logger.getLogger("ExampleLogger");

logger.logp(Level.INFO, "ClassName", "MethodName", "Message");
  • logrb meetodid: "log with resource bundle". Lisaks eelnevale peab juurde andma ka resurssikogumiku, kust tulevad erinevad lokalisatsiooni sätted.

Logger logger = Logger.getLogger("ExampleLogger");

logger.logrb(Level.INFO, ResourceBundle.getBundle("ee.taltech.tatoim.ExampleResource"), "message");

NB: Kui resurssikogumiku ei leida, visatakse erind.

  • entering, exiting, throws: Kasutatakse, et logida meetodi välja kutsumisi, tagastusi ning erindite viskamisi. Nii-öelda mugavusmeetodid.

Logger logger = Logger.getLogger("ExampleLogger");

logger.entering("className", "methodName");
logger.exiting("className", "methodName");
logger.throwing("className", "methodName", new Throwable("example throwable"));
  • Meetodid, et logida otse mingi tasemega, näiteks: severe, warning, info jne.

Logger logger = Logger.getLogger("ExampleLogger");

logger.severe("Severe error");
logger.warning("Warning");
logger.info("Some information");
logger.config("Config information");
logger.fine("Fine info");
logger.finer("Finer info");
logger.finest("Finest info");

Logi faili kirjutamine

Vaikimisi lähevad logi sõnumid konsooli. Faili kirjutamiseks tuleb loggerile juurde lisada handler. Antud juhul lisame uue FileHandler-i:

Logger logger = Logger.getLogger("ExampleLogger");

logger.addHandler(new FileHandler("log.xml"));  // Log file name
logger.setLevel(Level.FINE);                    // Setting logger level to FINE so they show up in logfile

logger.fine("test");

Tulemusena tekib fail nimega "log.xml", selle sisu peaks nägema välja selline:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2024-07-15T09:12:36.378433Z</date>
  <millis>1721034756378</millis>
  <nanos>433000</nanos>
  <sequence>0</sequence>
  <logger>ExampleLogger</logger>
  <level>FINE</level>
  <class>ee.taltech.tatoim.Example</class>
  <method>main</method>
  <thread>1</thread>
  <message>test</message>
</record>
</log>