180 likes | 411 Views
Loggen mit log4j. ETIS 2004. Gliederung. Motivation Geschichte Logger Appender Layout Konfiguration Log4j vs. Sun‘ s Logging API Zusammenfassung. Motivation Log4J (I). Loggen in vielen Projekten benötigt (in Entwicklung + produktiver Umgebung) Low level debug-Methode Aufgaben:
E N D
Loggen mit log4j ETIS 2004
Gliederung • Motivation • Geschichte • Logger • Appender • Layout • Konfiguration • Log4j vs. Sun‘ s Logging API • Zusammenfassung Log4J
Motivation Log4J (I) • Loggen in vielen Projekten benötigt (in Entwicklung + produktiver Umgebung) • Low level debug-Methode • Aufgaben: • Innere Abläufe der Anwendung verfolgen • Informationen über den Zustand des Programms • Informationen über wichtige Ereignisse • Variablenwerte kontrollieren • Fehlersuche Log4J
Motivation Log4J (II) • System.out.print(...) • Meldungen nicht abschaltbar (nur löschbar), nicht staffelbar • nur Standardausgabe • Fehlersuche mit Debugger: • Problem, wenn nicht verfügbar • Debugging transient - Logaufrufe bleiben im Programm • Loggen oft schneller • Selber programmieren belastet eigentliches Projekt zusätzlich Log4J
Motivation Log4j (III) • Evtl. Probleme beim Loggen: • Anwendung verlangsamt • Informationen schwer finden • Ziele Log4J: • Wenig Performanceverluste durch Logging • klassifizierbare Informationen (z.B. Ausschalten bestimmter Loginformationen) • Anwendung zur Laufzeit konfigurierbar • Loginformationen an- und ausschalten • frei definierbare Ausgabeformate/-orte der Log-Meldungen Log4J
Geschichte • Open Source Projekt, um Log-Statements in eine Anwendung zu bringen (de facto Standard) • Apaches Jakarta Projekt • einsetzbar ab JDK 1.1 • Hauptbestandteile: • Logger (Wird geloggt?) • Appender (Wohin?) • Layouts (Format?) Log4J
Klasse Logger • Kernkomponente • Klassenname als Loggername ist Konvention • Bereitstellung als statische Variable in Anwendung • private static Logger logger = Logger.getLogger(“test.Sample“); • Besitzt Methoden, um Meldungen auf verschiedenen Stufen auszugeben (Stufen erweiterbar) • logger.debug(“irgendwas“); Log4J
Vordefinierte Log-Level ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF Log4J
Log-Level (I) • Logger haben bestimmtes Level • z.B. Logger hat Level WARN (z.B. in Konfigurationsdatei festgelegt) • Log-Methoden haben bestimmtes Level • z.B. c.info(...): Log-Meldung auf Level INFO • Level des Loggers entscheidet, ob Log-Meldung geschrieben wird • Schreiben, wenn Level der Log-Methode höher oder gleich dem Level seines Loggers • INFO < WARN c.info() ignoriert Log4J
Log-Level (II) • Logger bilden durch “.“ getrennte hierarchische Baum-Struktur • z.B. java.sql.Connection • Ein Root-Logger • weitere Logger ein Vorfahr und evtl. mehrere Nachfahren • java Vorfahr java.sql • Level der Logger vererbbar, wenn nicht explizit gesetzt, z.B. • java: INFO, java.sql: keine Zuweisung java.sql = INFO • java: INFO, java.sql: WARN java.sql = WARN • Wenn Klassenname = Loggername Logging für einzelne Klasse oder packages ein- und ausschaltbar Log4J
Logging - Performance Log-Statements bleiben i.d.R. im Code • Versteckte Kosten für Parameterkonstruktion • logger.debug(“irgendwas“); • if-Statement als Performance-Wrapper • if (logger.isDebugEnabled() == true){ • logger.debug(“irgendwas“ + ichBinTeuer()); • } Log4J
Appender • jedem Logger sind ein oder mehrere Appender zuordenbar • Appender in Loggerhierarchie vererbt • Appender legt fest, wohin geloggt wird • z.B. Console, File, JDBC, SMTP... (können um eigene erweitert werden) • Vererbungskonzept Appender: Kinder des Loggers erben automatisch alle Appender des Vaters • z.B. Vater hat Konsole-Appender, Kind hat File-Appender Kind schreibt auf Konsole und in File • Logger-Attribut additivity = false unterbindet Vererbung Log4J
Layout • Appender wird bei Konfiguration Layout-Pattern übergeben • optische Aufbesserung • verbesserte Fehlersuche • Z.B. PatternLayout, HTMLLayout, XMLLayout (können um eigene erweitert werden) • Pattern-Layout am flexibelsten, C printf-Funktion nachempfunden Log4J
Konfiguration • Ziel: Logging-Verhalten zur Laufzeit konfigurieren • in Konfigurationsdatei Verhalten einstellen • für Anbindung an Konfigurationsdatei sorgen durch einmaligen Aufruf von configure() • BasicConfigurator • ohne Konfigurationsdatei, belegt System mit sinnvollen Startwerten • PropertyConfigurator • bezieht Daten aus Properties-Datei • DOMConfigurator • ähnlich P. Dateiformat XML Log4J
Properties-Datei • #obersten Logger auf DEBUG setzen, Appender: A1 • log4j.rootLogger = DEBUG, A1 • #A1 ist ConsoleAppender Ausgabe auf Console • log4j.appender.A1 = org.apache.log4j.ConsoleAppender • #A1 verwendet ein Pattern Layout • log4j.appender.A1.layout = org.apache.log4j.PatternLayout • log4j.appender.A1.layout.ConversionPattern = [%d / %p / %c ] - %m%n%n Log4J
Log4J vs. Sun‘s Log API • Ähnlichkeiten in Namensgebung (Klassen: Logger, Level) • Konzept hierarchischer Logger ähnlich • Log4J viele Appender, Sun 3 Handler • Log4J Konfiguration in XML + Properties-Datei, Sun nur Properties-Datei • Log4J ab JDK 1.1, Sun erst ab 1.4 • Log4J gereift und robust, performanter, umfangreicher • Portierungen für C/C++, Python, .NET Log4J
Zusammenfassung • open source • gute Performance, Funktionalität, Handhabung • gute Integrierbarkeit in eigene Anwendungen • umfangreiche Erweiterungsmöglichkeiten • in existierenden Systemen verwendet (JBoss) • GUI-basierte Tools vorhanden (Chainsaw, LogFactor5) • momentan besser als Sun‘ s Logging API, Wechsel allerdings recht unproblematisch Log4J
Quellen • Wille, S., Go To Java Server Pages, Addison-Wesley, München, 2001 • Evertz, M.: Logger Dir Einen, Javamagazin, 11/2002, S.23 • http://jakarta.apache.org/log4j/docs/documentation.html • http://www.linux-magazin.de/Artikel/ausgabe/2002/04/coffee/coffee.html • http://www.zdnet.de/builder/artikel/program/200208/java-logging-api_01-wc.html • http://www.jguru.com/faq/Log4j/ • http://www.jsp-develop.de/knowledgebase/print/736/ • Eickstädt, D., Reuhl, T., Java mit Open Source-Tools, Markt+Technik, München, 2003 Log4J