Java Servlets – logovanie pomocou Log4J 3.
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.
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 logger servletu v browseri
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
- Class ISO8601DateFormat – na tejto stránke získate podrobné informácie o ISO8601 dátumovom formáte
- Class PatternLayout – tu sa nachádzajú ďalšie informácie na tému pattern layout
- Log4J API Specification – JavaDoc stránky obsahujúce informácie o Log4J API
- Official log4j documentation – dokumentácia k projektu Log4J
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Mohlo by vás také zajímat
-
Členská sekce: 4 důvody proč ji mít na svém webu
12. března 2024 -
Proč je důležité tvořit obsah na váš web?
29. srpna 2024 -
Rychlost serveru: Klíč k lepšímu umístění ve vyhledávačích
7. června 2024
Nejnovější
-
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Nové trendy v doménách pro osobní projekty – DIY, LIVING a LIFESTYLE
9. prosince 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024