Pri práci a hlavne pri odlaďovaní servletov vývojár aplikácie veľmi často potrebuje zaznamenávať rôzne typy informácií. Logovanie môžete využiť nie len na ukladanie debugovacích informácií počas vývoja aplikácie, ale tiež na ukladanie informácií v ostrej prevádzke, vrátane rôznych varovaní a popisu chýb. Logovanie umožňuje posielať správy a zobrazovať ich rôznymi spôsobmi či už pre programátora alebo administrátora, pričom logované správy môžu byť doručené na konzolu, alebo uložené do súboru či databázy.

V tomto a niekoľkých nasledujúcich článkoch sa budeme venovať využitiu veľmi výkonného open source nástroja Log4J, samozrejme v spojení so servletmi. Tento nástroj sa nachádza v jar balíčku, ktorý si môžete stiahnuť a nakopírovať do adresára WEB-INF/lib vašej aplikácie. Prípadne môžete využiť priamy odkaz na súbor jakarta-log4j-1.2.8.zip, ktorý sa nachádza na serveri apache.tuke.sk. Týmto ho sprístupnite všetkým servletom v rámci aplikácie, ktoré potrebujú logovať informácie.

Základná koncepcia Log4J

Log4J obsahuje tri hlavné prvky: logger, appender, layout. Ak chcete môžete si tieto prvky preložiť do vám vyhovujúceho jazykového tvaru. Ja sa budem pridŕžať originálu, aj keď to možno nie je najsprávnejší prístup. Ku každému prvku si povieme niečo bližšie. Ešte chcem dodať, že Log4J využíva systém externých konfiguračných súborov určených na konfigurovanie týchto troch prvkov. Sú to prevažne textové súbory obsahujúce dvojice parameter/hodnota.

Logger

Logger je entita, ktorú servlet využíva na logovanie správ. Aby sme ju mohli použiť, je nutné naimportovať triedy Log4J, vytvoriť jej inštanciu (konkrétne org.apache.log4j.Logger), a potom zavolať príslušnú metódu. Názvy logovacích metód sú odvodené od tzv. logovacích úrovní. Napríklad ak chceme zalogovať nejakú informatívnu správu, zavoláme nasledovnú metódu:

logger.info(„HttpServlet init method called.“);

Log4J má päť rôznych logovacích úrovní (prípadne kategórií): DEBUG, INFO, WARN, ERROR a FATAL. Uvedené kategórie sú zoradené vzostupne. Inými slovami existuje tu hierarchia. Napríklad logger prislúchajúci k úrovni WARN, môže logovať iba informácie na tejto a vyšších úrovniach (ERROR a FATAL), ale nemôže logovať správy na úrovni DEBUG a INFO, pretože sa v hierarchii nachádzajú pod kategóriou WARN.

Kategória DEBUG má primárne na starosti logovanie informácií v procese vývoja a odlaďovania aplikácie. INFO je určené na monitoring stavu a priebehu aplikácie. Úroveň WARN označuje a monitoruje potenciálne nebezpečné situácie. ERROR reprezentuje chybové stavy, z ktorých je možné sa zotaviť a FATAL ako posledná úroveň sú fatálne chyby spôsobujúce ukončenie aplikácie.

Každý logger je konfigurovaný na príslušnú úroveň v Log4J konfiguračnom súbore, pričom správy ktoré sa logujú sú logicky prepojené s príslušným loggerom. Napríklad si predstavte, že nastavíme logger na úroveň DEBUG a vytvoríme servlet, ktorý bude obsahovať nejeké množstvo volaní metódy logger.debug(Object message). Tieto volania budú využité pri debugovaní. Neskôr zmeníme úroveň nášho loggera na úroveň INFO. Výsledok bude, že debugovacie správy sa už nebudú zaznamenávať do logovacej repository (konzola, súbor, databáza). Je to preto, pretože úroveň DEBUG nie je rovná alebo vyššia ako úroveň INFO v danej hierarchii.

Appender

Už som spomínal, že Log4J umožňuje logovať správy rôznymi spôsobmi. Môžete logovať štandardne na konzolu (užitočné najmä pri vývoji aplikácie), môžete logovať do súboru, do databázy, môžete poslať správu na email server. Log4J označuje tieto jednotlivé logovacie mechanizmy ako appender. Ich popis sa umiestňuje do konfiguračného súboru (prevažne je to log4j.properties).

Layout

Layout špecifikuje jednak výsledný vzhľad ako bude výsledný log vyzerať a tiež aj aký rozsah informácií bude obsahovať. Na výber máte množstvo rôznych layoutov, ktoré môžete priradiť v konfiguračnom súbore log4j.properties. Môžete špecifikovať veľmi jednoduchý ale aj veľmi komplexný layout prostredníctvom tzv. konverzných šablón, ktoré sa veľmi podobajú na regulárne výrazy.

Napríklad ak nám stačí základný layout, použijeme triedu org.apache.log4j.SimpleLayout. Použitím tohto formátu bude log obsahovať názov logovacej kategórie, pomlčku a samotnú správu. Napríklad: “ INFO – HttpServlet init method called „.

Prvé kroky s Log4J

Úplne prvý krok je (ak ste tak už neurobili) stiahnuť si distribučný balíček. Na začiatku článku o tom pojednávam, takže túto časť už máme za sebou a predpokladám, že niekde na disku už jakarta-log4j-1.2.8.zip, alebo jakarta-log4j-1.2.8.tar.gz máte nakopírované. Prejdime si základné kroky, ktoré je nutné vykonať, ak chceme Log4J začať používať.

  1. Rozpakujte distribučný súbor, ktorý vytvorí adresár jakarta-log4j-1.2.8. Vo vnútri tohto adresára je zložka dist a v nej zložka lib. Tu nájdete súbor log4j-1.2.8.jar, ktorý nakopírujte do WEB-INF/lib vašej aplikácie.
  2. Vytvorte konfiguračný súbor log4j.properties a umiestnite ho do WEB-INF/classes. Bude to textový súbor obsahujúci dvojice parameter/hodnota, definujúce logger, appender a layout. Tento krok nie je povinný a je možné použiť Log4J aj bez konfiguračného súboru. Neskôr si ukážeme ako.
  3. V konkrétnom servlete potom vykonajte import potrebných tried. Ktoré triedy to majú byť záleží na tom, čo konkrétne potrebujete a ako logovať. Minimálne pôjde o org.apache.log4j.Logger.

Teraz si ukážeme a vysvetlíme najjednoduchšiu formu konfiguračného súboru log4j.properties:

log4j.rootLogger = DEBUG, cons
log4j.appender.cons = org.apache.log4j.ConsoleAppender
log4j.appender.cons.layout = org.apache.log4j.SimpleLayout

Na prvom riadku je zadefinovaná logovacia úroveň DEBUG pre root logger, čo je vlastne logger na najvyššej úrovni pre vašu aplikáciu. Root logger používa appender s názvom cons, ktorý je typu org.apache.log4j.ConsoleAppender, čo znamená, že logovacie záznamy budú posielané na konzolu. Tretí riadok definuje použitý layout pre daný appender.

Na záver uvediem kostru servleta, ktorý bude odrazovým mostíkom pre všetky ostatné príklady.

FirstLogger.java:

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import javax.servlet.*;
import javax.servlet.http.*;
public class FirstLogger extends HttpServlet {
 private Logger log;
 public void init() {
  /* Log4J vyhľadá log4j.properties súbor
  v WEB-INF/classes */

  log = Logger.getLogger(FirstLogger.class);
  // toto je len príklad, ako využiť logger
  log.debug(„Instance object of:“ + getClass().getName());
 }
 public void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException,
   java.io.IOException {
  // sem môžete umiestniť ďalšie logovanie
 }
}

A výsledok je nasledovný...

Upozorňujem, že v WEB-INF/lib musíte mať súbor log4j-1.2.8.jar a v WEB-INF/classes súbor log4j.properties. Prikladám tiež balíček súborov na stiahnutie.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět