Segédletek.hu

Segédletek weblap szerkesztéshez!
ingyen letöltés

| Mind | PHP | HTML | CSS | Java |
|Legújabbak |Legtöbbször olvasottak|

Log4J alapok:

Egy rövid ismertető a Log4J apihoz.

A log4J egy általános célú open source logger api Javahoz.
Segítségével egyszerűsíthetjük, vagy inkább egységesíthetjük programjaink visszajelzéseit a fejlesztőknek, vagy a felhasználóknak.
Számos a Java fejlesztők által igen kedvelt framework és alkalmazás szerver is használja, csak néhány példa a teljeség igénye nélkül: Hibernate, Spring, JBOSS.

Az első ránézésre az api elég puritánnak néz ki, de ez ne tévesszen senkit, nagyon is jól használható és az ereje is a kompaktságában rejlik.

A Log4J úgynevezett logger osztályokat rendel a Java osztályokhoz statikus módon, amit utána az osztályban használva az osztályra vonatkozó log bejegyzéseket írhatunk.

Az api többszintű loggolást tesz lehetővé, ezek fontossági sorrendben a következők:
INFO
DEBUG
WARN
ERROR
FATAL
A mélységek egymásra épülnek, tehát ha például a WARN szint aktív akkor, WARN, illetve a fontossági sorrendben fölötte álló szintek is kiíródnak, itt most a WARN, ERROR, FATAL szintek.

A Log4J úgynevezett appendereket használ a log bejegyzések megjelenítésére, gyakorlatilag ez egy kimeneti csatorna, ahova a log bejegyzések kiírásra kerülnek. Többféle típusú appendert biztosít az api, így írhatunk simán a konzol kimentre, vagy akár egy adatbázisba is, és egy üzenetet egyszerre elküldhetünk több appendere is.

Minden appenderhez megadhatjuk, hogy milyen szintű log bejegyzéseket írhatunk bele, így konfigurálhatunk egy adott osztályhoz egy általános appender-t, amely mindent megjelenít, illetve például egyet külön, ami az ERROR és FATAL hibákat elküldi egy SYSLOG szervernek, vagy beírja az alkalmazás adatbázisába.

Az appenderek egy statikus hierarchiát alkotnak a Java objektumok mögött, amelynek gyökere a log4j csomag.
Az appenderek gyökere a log4j.appender csomag, a loggereké pedig a log4j.logger.
A rootlogger speciális objektum, ami minden logger őse tehát ő minden log bejegyzést megkap, és feldolgoz.

Első nekifutásra írjuk meg az első log4j.properties nevű fileunkat.
#definiálunk egy logger a hu.t.log4jexample csomag minden
#osztályához, tehát ha ebben a csomagban létrehozzunk egy
#logger-t, akkor ez a "console" nevű
#appenderre fogja dobálni
#a log bejegyzéseit
log4j.logger.hu.t.log4jexample = ERROR, console

#A "console" nevű appender definíciója, a bejegyzéseket
#a konzol kimenetre fogjuk írni,
#definiálunk egy minta alapú konvertert,
#amellyel a megjelenő szöveget formázhatjuk
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
#A használt minták és jelentéseik:
#%d - az aktuális dátum
#%t - az aktuális thread neve
#%F - a file neve
#%L - az aktuális sor sorszáma a forrás fileban
#%-5p - a log bejegyzés mélysége
#%c - a class neve
#%m - a log bejegyzés szövege
#%n - \n
log4j.appender.console.layout.ConversionPattern = %d [%t] (%F:%L) %-5p %c - %m%n


Bővebb információ a patternben használható jelekről:
PatternLayout
Némi információ az elérhető appenderekről:
AppenderSkeleton

A nézzük a használatot a következő egyszerű példán keresztül:
package hu.t.log4jexample;

import java.net.URL;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;


public class MyMain {
    //Létrehozzuk a logger osztályt
    private static Logger logger = Logger.getLogger(MyMain.class);

    /**
     * @param args
     * @throws 
     */

    public static void main(String[] args) {
      //egyszer kell csak lefutnia
      try {
            //fel konfiguráljuk a loggert
            //az előzőleg legyártott
            //property filenak megfelelően
            URL url = org.apache.log4j.helpers.Loader.getResource("log4j.properties");
            PropertyConfigurator.configure(url.getFile());
          } catch (Exception e) {}

        //mivel a loggerünk ERROR szintre van kapcsolva,
        //ezek a bejegyzések nem fognak megjeleni
        logger.info("test info");
        logger.debug("test debug");
        logger.warn("test warn");
        //ezek a bejegyzések már kiíródnak           
        logger.error("test error");
        logger.fatal("test fatal");     
    }
}
Lássuk áldásos tevékenységünk végeredményét:
2006-10-21 12:10:41,984 [main] (MyMain.java:32) ERROR hu.t.log4jexample.MyMain - test error
2006-10-21 12:10:41,984 [main] (MyMain.java:33) FATAL hu.t.log4jexample.MyMain - test fatal

Fontos, hogy a Classpathban csak egy Log4J jar lehet, mivel ezek statikus kapcsolódnak, ezért bármelyik osztályban is hozzuk létre a loggert, az az összes többivel kapcsolatban lesz, ami a Classpathban benne van. Emiatt csak óvatosan konfiguráljuk! Előfordulhat ugyanis, hogy az általunk létre hozott konfig fileban nem szerepel, valamilyen appender amit például a Hibernate framework használ.

Fontos eszköz lehet még a Main Diagnostic Contexts, röviden MDC.
public class MDC {
    // Used when printing the diagnostic
    public static String get();

    // Remove the top of the context from the MDC.
    public static String pop();

    // Add diagnostic context for the current thread.
    public static void push(String message);

    // Remove the diagnostic context for this thread.
    public static void remove();
  }
Ez a kis hash tábla nagy segítségünkre lehet. Például, ki akarjuk loggolni a hiba helyén a metódus paramétereit is, vagy bármilyen más hasznos adatot is továbbítani akarunk az üzeneten kívül.
package hu.t.log4jexample;

import java.net.URL;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.MDC;

public class MyMainMDC {
    //Létrehozzuk a logger osztályt
    private static Logger logger = Logger.getLogger(MyMain.class);

    /**
     * @param args
     * @throws 
     */

    public static void main(String[] args) {
        //egyszer kell csak lefutnia
        try {
            //fel konfiguráljuk a loggert
            //az előzőleg legyártott
            //property filenak megfelelően
            URL url = org.apache.log4j.helpers.Loader.getResource("log4jMDC.properties");
            PropertyConfigurator.configure(url.getFile());
        } catch (Exception e) {}

        //dobjuk pár adatot a loggerbe
        MDC.put( "text", "the answer was: " );
        MDC.put( "theAnswer"new Integer( 42 ) );

        //dobjunk valami beszédes error-t
        logger.error("test error");
    }
}
Az MDC-be rakott értéket a következőképpen tudjuk hasznosítani:
log4j.logger.hu.t.log4jexample = ERROR, console

log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d [%t] (%F:%L) %-5p %c - %m '%X{text} %X{theAnswer}' %n

Hála a Javanak a következő kimenetett láthatjuk magunk előtt a program futásának végen:
2006-10-21 12:15:55,703 [main] (MyMainMDC.java:32)
ERROR hu.t.log4jexample.MyMain - test error
'the answer was: 42'
Miután a 'válasz' már adott, nézzünk végül egy JDBC appendert:
log4j.logger.hu.t.log4jexample = ERROR, db

log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.layout=org.apache.log4j.PatternLayout
log4j.appender.db.layout.ConversionPattern=call GEN_LOG_ENTRY('%d', '[%t]', '(%F:%L)', '%-5p' '%c', '%m', '%X{text}', '%X{theAnswer}' )
log4j.appender.db.driver=oracle.jdbc.OracleDriver
log4j.appender.db.user=scott
log4j.appender.db.password=tiger
log4j.appender.db.URL=jdbc:oracle:thin:@192.168.1.90:1521:example
Mint látható egy tisztességes connection string bújik meg a property fileban, ez most Oracle alá sikerült, a GEN_LOG_ENTRY egy sima tárolt eljárás, amely egy sort beszúr egy log nevű táblába.

Log4J Home
Log4J JavaDoc

A segédlet forrása

Írta: _T_ - 2006-10-21 00:10:18

* Nem vagy bejelentkezve!
* Nem töltheted le a segédlet forrását egyben!
* Nem szavazhatsz a segédletre!
* Nem írhatsz a segédlethez tartozó fórum témába!


Önnek is jár évi 72 000 forint
állami támogatás lakás-előtakarékosság esetén. Válassza a Fundamentát!
www.fundamenta.hu

Miért fizetne többet?
Akciós élelmiszer, műszaki cikk, gyümölcs, bútor. Nézzen be, megéri!
www.tesco.hu

Ford Focus ajánlat
Ford Focus most akár 1.160.000 Ft kedvezménnyel az Öné lehet!
Focus.Ford.hu

10.000 €-t keresni havonta
Hogyan keressünk pénzt könnyedén? Kezdjen pénzt keresni még ma!
www.penzt-keresni.net

Toyota készletakció
Auris Optimis modellek 1 000 000 Ft árelőnnyel! Részletek
www.toyota.hu

Hirdessen itt