Loggen mit log4j ETIS 2004 Gliederung • Motivation • Geschichte • Logger • Appender • Layout • Konfiguration • Log4j vs. Sun‘ s Logging API • Zusammenfassung Log4J 2 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 3 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 4 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 LogMeldungen Log4J 5 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 6 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 7 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 8 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 9 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 10 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 11 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 12 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 13 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 14 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 15 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 16 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 17 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 18