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 Normale Log-Level DEBUG feingranulare Informationsereignisse, zum Debuggen INFO informierende Nachrichten, groben Ablauf aufzeigen WARN potentiell nachteilige Situationen ERROR Fehler, Anwendung läuft evtl. weiter FATAL ernster Fehler, meist Abbruch der Anwendung Spezielle Log-Level ALL niedrigste Priorität, Loggen anschalten OFF höchste Priorität, Loggen abschalten 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