|
jsp-develop.de presents: Tracing mit Log4J |
| von shark, 20.01.2002 16:54:37 |
|
Das Tracing (Logging) einer Web-Applikation ist im Wirkbetrieb die einzige Möglichkeit Programmfehler zu finden. Log4J ist im Rahmen eines Open Source Projektes entstanden und eignet sich für das Schreiben von Log-Einträgen. Die Log4J Referenzseite informiert über aktuelle Weiterentwicklungen des nützlichen Tracing-Werkzeuges: http://jakarta.apache.org/log4j Nach dem Download ist das Log4J Package in den Java Classpath aufzunehmen! Das Tracing von Applikationen bringt normalerweise Performanzeinbußen mit sich. Die Architektur sowie Implementierung von Log4J ist entsprechend den laufzeitkritischen Anforderungen von Web-Applikationen optimiert worden. Log4J unterstützt folgende Log-Level: + DEBUG - zugeordnete Log-Methode debug(..) + INFO - zugeordnete Log-Methode info(..) + WARN - zugeordnete Log-Methode warn(..) + ERROR - zugeordnete Log-Methode error(..) + FATAL - zugeordnete Log-Methode fatal(..) Log-Level implizieren unterschiedliche Prioritäten. Folgende Rangfolge ist bindend: DEBUG < INFO < WARN < ERROR < FATAL Beispiel: Ist der Log-Level auf WARN gesetzt worden, werden keine DEBUG und INFO Traces geschrieben. Die Konfiguration von Log4J wird über eine Konfigurationsdatei vorgenommen. In der Konfigurationsdatei definiert man Komponenten (Kategorien), die getraced werden sollen und wohin die Log-Ausgaben erfolgen (Appender). Darüber hinaus eignet sich die Konfigurations-datei auch zur Definition des Layouts von Log-Einträgen sowie zusätzlichen Parametern, wie beispielsweise den Namen einer Log-Ausgabedatei. Eine Log4J Konfigurationsdatei wird mit dem ProxyConfigurator geladen. Der ProxyConfigurator wird folgendermaßen benutzt: PropertyConfigurator("g:\\log\\log4j.lcf"); Bewährt hat sich die Methode, den Klassennamen als Kategoriebezeichner zu wählen. Kategorien definiert man als statische Variablen. In der Klasse "BspCategory" kann man daraufhin folgende Zuweisung vornehmen: static Category goCategory = Category.getInstance("BspCategory.class"); Log-Ausgaben bezogen auf "BspCategory" erfolgen in diesem Fall folgendermaßen: goCategory.info("Programmstart"); goCategory.fatal("SQL-Exception"); Das Layout der Log-Ausgaben ist frei definierbar und lehnt sich an die Konventionen der C-Funktion printf(..) an. An dieser Stelle haben wiedermal die C/C++ Umsteiger die Nase vorne, denen die Funktion printf(..) bekannt ist. Weiterführende Informationen zu Log4J findet man auf der Log4J Referenzseite. Das nachfolgende Beispiel verdeutlicht nocheinmal die Anwendung von Log4J. Zunächst ein JavaBean in dem Log-Ausgaben erfolgen: package myclasses.logtest; /** java package to test log4j */ // import related packages import org.apache.log4j.*; /** simple test class for log4j package */ public class LogTest { // constant which defines path of log4j config file private static final String gstrLogConfig = "g:\\log\\log.lcf"; // log4j category private static Category goCategory = Category.getInstance("LogTest"); /** public constructor which sets the log-environment */ public static void initTest() { // load the log configuration and initialize log context PropertyConfigurator.configure(gstrLogConfig); } /** simple static test method which writes some log statements in log-file */ public static void testMethod1() { // some log statements goCategory.info("testMethod1 called"); goCategory.debug("i do something"); goCategory.fatal("fatal error occured!"); goCategory.debug("everything is allright"); goCategory.info("testMethod1 ended"); } } JSP-Seite, welche das JavaBean verwendet: <%@page language="java" contentType="text/html" %> <%@page import="myclasses.logtest.*"%> <% // initialize test LogTest.initTest(); // call static log method LogTest.testMethod1(); %> Konfigurationsdatei für Log4J: # log root categories log4j.rootCategory=DEBUG,A1 # log-file parameter log4j.appender.A1 = org.apache.log4j.RollingFileAppender log4j.appender.A1.File = logj.log log4j.appender.A1.MaxFileSize = 100KB log4j.appender.A1.MaxBackupIndex = 1 log4j.appender.A1.Append = true # layout definition log4j.appender.A1.layout = org.apache.log4j.PatternLayout # format -> [2002-01-20 / 09:30:10 / LOGLEVEL / CLASSNAME] - MESSAGE log4j.appender.A1.layout.ConversionPattern = [%d / %t / %p / %c] - %m%n Ausgabedatei, in die entsprechende Logs geschrieben wurden: [2002-01-20 11:08:18,092 / tcpConnection-8080-0 / INFO / LogTest] - testMethod1 called [2002-01-20 11:08:18,092 / tcpConnection-8080-0 / DEBUG / LogTest] - i do something [2002-01-20 11:08:18,092 / tcpConnection-8080-0 / FATAL / LogTest] - fatal error occured! [2002-01-20 11:08:18,092 / tcpConnection-8080-0 / DEBUG / LogTest] - everything is allright [2002-01-20 11:08:18,092 / tcpConnection-8080-0 / INFO / LogTest] - testMethod1 ended Zu beachten ist, wenn man für "log4j.appender.A1.File= logj.log" kein Zielverzeichnis definiert, die erzeugte Log-Datei automatisch in das Root-Verzeichnis der ServletEngine geschrieben wird. In der Log4J-Konfigurationsdatei wird der Log Level mit folgender Anweisung gesetzt: "log4j.category.myclasses.logtest=WARN" Mit der Anweisung - PropertyConfigurator.configure("g:\\log\\log.lcf") - wird die Log4J Konfigurationsdatei gelesen und Log4J initialisiert. Es können sowohl relative also auch absolute Pfadangaben definiert worden sein. Normalerweise legt man die Log4J Konfigurationsdatei in das "\WEB-INF\Classes" Verzeichnis. Verwendet man ein WEB-Archiv (WAR-Datei), ist die Log-Datei im Kontext der Web-Applikation bekannt und es entfällt die absolute Pfadangabe zur Log4J Konfigurationsdatei. |
|
URL dieses Beitrags: http://www.jsp-develop.de/forumbeitrag/view/736/ |