V tomto článku o servletoch ukončíme tému logovania informácií. Naším hlavným cieľom bude vytvoriť si vlastný logger a priradiť mu appender. Teda zameriame sa na komplikovanejšie využitie nástroja Log4J. Dúfam, že poskytnuté informácie, budete môcť aj adekvátne využiť vo svojej praxi.

Začnime tým, že nastolíme problém. Doteraz sme vždy využívali hlavný logger v systéme Log4J, nazvaný root logger. Avšak máme možnosť vytvoriť si logger vlastný, ktorý bude dediť vlastnosti super loggera a pridávať vlastné. Tomuto loggeru môžeme tiež priradiť appender. Celá zmena sa bude, ako asi už tušíte, odohrávať v konfiguračnom súbore log4j.properties.

Inheritencia je v jazyku Java úplne bežná záležitosť. V Jave existuje akýsi super objekt java.lang.Object a všetky ostatné objekty sú z neho odvodené, vznikli dedením jeho vlastností. Tieto vlastnosti sú pochopiteľne veľmi všeobecné a nie je ich veľa, pretože sú spoločné pre všetky ostatné triedy. V Log4J existuje rovnaký princíp a ako super objekt tu vystupuje root logger. Každý nový logger zdedí vlastnosti super loggera. Vlastnosti sú logovacia úroveň a typ appendera. Vytvoríme si nový properties súbor log4j.properties:

#root logger a mylogger
log4j.rootLogger = DEBUG, cons
log4j.logger.mypackage.mylogger = , myAppender
#appender pre root logger
log4j.appender.cons = org.apache.log4j.ConsoleAppender
#appender pre mylogger
log4j.appender.myAppender = org.apache.log4j.RollingFileAppender
log4j.appender.myAppender.File = c:/java/servlets/mylogger.log
log4j.appender.myAppender.MaxBackupIndex = 1
log4j.appender.myAppender.MaxFileSize = 1MB
#layout pre root logger
log4j.appender.cons.layout = org.apache.log4j.SimpleLayout
#pattern layout pre mylogger
log4j.appender.myAppender.layout = org.apache.log4j.PatternLayout
#definícia patternu
log4j.appender.myAppender.layout.ConversionPattern = %-5p
Logger:%c{1}
Date: %d{ISO8601} – %m%n

Pravdepodobne ste si všimli podobnosť medzi názvom nového loggera (mypackage.mylogger) a systémom označovania balíčkov v Jave. Log4J používa rovnakú schému. Spomínal som, že každý nový logger automaticky dedí vlastnosti od root loggera. Tento systém platí aj na nižších úrovniach. Každý nový logger, ktorý ako prefix obsahuje meno existujúceho nakonfigurovaného loggera, automaticky dedí jeho vlastnosti. Takže ak vytvoríte nový logger s názvom mypackage.mylogger.ConsoleLogger, tento automaticky zdedí vlastnosti najbližšieho predka (mypackage.mylogger).

V uvedenom príklade som špecifikoval, že mypackage.mylogger použije appender s názvom myAppender, ktorý zapisuje logovacie informácie do súboru na disk. Špeciálne ide o typ rotujúceho súboru (RollingFileAppender), ktorý neprepisuje obsah súboru, ale pridáva ďalšie riadky. V prípade, že veľkosť súboru dosiahne maximálnu stanovenú hranicu, vytvorí sa záloha a začne sa zapisovať od začiatku.

Ak by ste sa pozreli do dokumentácie k triede RollingFileAppender, nájdete tam množstvo metód typu getXXX(), kde XXX je niektorá z vlastností, ktoré sa nastavujú v properties súbore. My sme takým spôsobom nastavili vlastnosti File, MaxBackupIndex a MaxFileSize. Prvá vlastnosť určuje umiestnenie logovacieho súboru mylogger.log. Ak tento súbor dosiahne maximálnu veľkosť 1 MB, Log4J premenuje tento súbor na mylogger.log.1 a vytvorí nový súbor. MaxBackupIndex znamená, že Log4J vytvorí iba jeden záložný súbor.

Properties súbor ďalej špecifikuje typ layoutu pre root logger a pre mylogger. Root logger používa nám už dobre známy základný SimpleLayout. Pre mylogger som použil PatternLayout, ktorý je založený na dosť komplikovanom vzore ConversionPattern.

log4j.appender.myAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.myAppender.layout.ConversionPattern = %-5p
Logger : %c{1} Date : %d{ISO8601} – %m%n

Prvý riadok špecifikuje, že myAppender layout použije org.apache.log4j.PatternLayout, ktorého konverzný vzor je postavený na funkcii printf jazyka C. Tento vzor kombinuje písaný text a konverzné špecifikátory na generovanie formátovaného výstupu. Konverzné špecifikátory sú rôzne písmená (ako c), majúce špecifický význam. Napríklad môžu reprezentovať dátum alebo názov loggera. Znak „%“ predchádza špeciálnym symbolom, konverzným špecifikátorom. Napríklad si zoberte nasledujúci pattern:

Logger : %c{1}

Tento vzor bude preložený nasledovne. Ako prvé sa uvedie doslovný text „Logger :“, nasledovaný menom loggera (%c). Číslo 1 v zložených zátvorkách znamená, že chceme, aby sa vypísal iba prvý segment kompletného mena loggera začínajúc z pravej strany. Takže napríklad ak kompletné meno loggera bude mypackage.mylogger.LoggerServlet, potom sa v logu vypíše iba LoggerServlet. Písmeno m zabezpečí zobrazenie samotného logu, písmeno n nastavuje oddeľovač riadkov, ktorý je závislý od danej platformy, a nakoniec písmeno d reprezentuje dátum. Reťazec %d{ISO8601} je špecifický Log4J formátovací prvok zobrazujúci dátum v detailnej podobe.

Vytvorme si teraz servlet, ktorý využíva logger, ktorý vznikne inheritenciou vlastností z vyššie uvedených a nakonfigurovaných loggerov. Konkrétne root logger a mypackage.mylogger.

LoggerWithConfigNew.java:

package mypackage.mylogger;
import org.apache.log4j.Logger;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class LoggerWithConfigNew extends HttpServlet {
 private Logger log = null;
 public void init(){
  log = Logger.getLogger(LoggerWithConfigNew.class);
  log.info(„LoggerWithConfigNew started.“);
 }
 public void doGet(HttpServletRequest request,
                           HttpServletResponse response)
                    throws ServletException, IOException {
  //správa na úrovni DEBUG
  log.debug(„Posielam DEBUG message.“);
  //správa na úrovni INFO
  log.info(„Posielam INFO message.“);
  //zobrazíme aj HTML
  response.setContentType(„text/html“);
  PrintWriter out = response.getWriter();
  out.println(
  „<html><head><title>Servlet logging</title></head><body>“);
  out.println(
    „<h2>Logger with configuration in „+
    „log4j.properties file</h2>“);
  out.println(„Your logger name is: „+log.getName()+“<br>“);
  out.println(
       „Your logger parent is: „+ log.getParent().getName()
       +“<br>“);
  out.println(„</body></html>“);
 }
}

Statická metóda org.apache.log4j.Logger.getLogger(Class className) vytvorí nový logger pomenovaný podľa triedy mypackage.mylogger.LoggerWithConfigNew. Tento nový logger zdedí appender definovaný v properties súbore, v ktorom je priradený k loggeru pomenovanom mypackage.mylogger a to práve z toho dôvodu, že má rovnaký prefix. V skutočnosti akýkoľvek iný logger vytvorený v triede, ktorá je súčasťou balíčka mypackage.mylogger, zdedí tieto vlastnosti (úroveň a appender). Nasledujú obrázky znázorňujúce výsledky činnosti nášho loggera.

Výstup root loggeru na konzole
Výstup root loggeru na konzole

Výstup logger servletu v browseri
Výstup logger servletu v browseri

Zápis myloggeru do súboru mylogger.log
Zápis myloggeru do súboru mylogger.log<

Touto časťou sme sa dostali na záver našej série o Java Servlets venovanej najmä začiatočníkom. Dúfam však, že si v nej niečo nové našli aj pokročilí programátori. Pri pohľade na názvy jednotlivých článkov je dúfam vidieť, že som sa snažil aspoň čiastočne venovať čo najširšiemu okruhu tém, s ktorými sa môžete stretnúť pri programovaní servletov a web aplikácií všeobecne.

Odkazy a zdroje

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