Segédletek.hu
Segédletek weblap szerkesztéshez!
Fórum:
Postaláda:
Szavazás:
Hány éves vagy?
Segédletek:
Linkek:
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:
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.
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:
Lássuk áldásos tevékenységünk végeredményét:
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.
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.
Az MDC-be rakott értéket a következőképpen tudjuk hasznosítani:
Hála a Javanak a következő kimenetett láthatjuk magunk előtt a program futásának végen:
Miután a 'válasz' már adott, nézzünk végül egy JDBC appendert:
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
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 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");
}
}
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();
}
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");
}
}
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'
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
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!

