Logging richtig gemacht! http://www.sxc.hu/photo/338505
Logging is a great tool! 2 Logging richtig gemacht!
Qualität eine Systems und Logging Logging: Qualitativer Einflußfaktor Monitoring & Bug-Hunting Performance (Durchsatz + Latenz!) Security Audits aber auch Löcher Skalierbarkeit (z.b. centralized logging) Kapazitäten (Größe der Logs) 3 Logging richtig gemacht!
Aber nicht selten 4 Logging richtig gemacht!
Step #1: Know your tools Log-Frameworks l Log4J l java.util-logging (JUL) l LogBack l tinylog Loggt Default nach /dev/null Konfiguration nur Systemweit?! Zweiter Versuch? Log-Fassaden l Apache Commons Logger (JCL) l SLF4J (JCL-Nachfolger) Standard seit Jahren Moderner 5 Logging richtig gemacht!
Step #1 : Know your tools Welches Framework soll ich verwenden? 6 Logging richtig gemacht!
Step #2 : Configure your tools Folgendes Vorgehen hat sich bewährt: l Implementiere im Projekt bevorzugt gegen JCL oder SLF4J. l Leite ALLE Log-Ausgaben anderer Frameworks um! Bridges für EclipseLink, Hibernate, Spring,.. Bridges für JCL/JUL/SLF4J l Unit-Test: Konfiguriere die Logger von JCL/SLF4J! l Deploye deine Ziel-Logger (log4j- - Konfiguration erst ganz am Schluss 7 Logging richtig gemacht!
Step #2: Configure your tools! 8 Logging richtig gemacht!
Step #2 : Configure your tools Logkonfiguration 1. In jedes src/test/resources Konfiguration des Logging für Unit-Tests (z.b. simple-log.properties) 2. Produktivkonfiguration (log4.xml) Weglassen (z.b. J2EE Container) bzw. Extern oder: src/web/web-inf/classes 3. log4-x.xx.jar / logback-x.xx.jar Bevorzugt gar nicht im Classpath, sondern z.b. in src/main/web/web-inf/lib 9 Logging richtig gemacht!
Step #3 : Be polite! Keine ASCII Art-Battles Keine Log-Level WARs! 10 Logging richtig gemacht!
Step #4 : Die richtige Log-Kategorie l Technische Infos -> Klassennamen. Wie bewährt. l Ablaufinformationen, Protokoll der User-Interaktionen bzw. Schnittstellen-Verkehr Eigene Log-Kategorien wie z.b. "UI" und "SQL" Damit lassen sich diese leichter trennen. (z.b. TRACE der SQL Statements, aber nicht vom Rest der App.) 11 Logging richtig gemacht!
Step #5 : Der richtige Log-Level Level FATAL ERROR WARN INFO DEBUG TRACE Die Welt Semantik und Verwendung Anwendungsfehler, aber nur solche die auch solche sind. Erwartbare Fehler ("File not found", "Not a number") gehören nicht hier rein Fehler und Hinweise auf Situationen, die unerwartet, aber nicht zwangsläufig ein Problem darstellen. Sprich: Hinweise, die Dir einen späteren Folgefehler erklären bzw. dem Administrator Tipps geben Nachrichten, die wichtige Eck-Hinweise darauf geben was passiert (Technisch + Inhaltlich). Dieser Log-Level sollte später in Produktion aktiv bleiben und nur mäßige, aber gehaltvolle Einträge liefern. Beispiele: Status/Version, Ende eines Jobs, zentrale Operationen Hinweise auf grobe Details in der Anwendung, die einen detaillierteren Überblick geben was in der Anwendung passiert. Allerdings sollten auch Debug-Level Nachrichten nicht zu sehr ins Detail gehen. Nachrichten die insbesondere Abläufe, Parameter, Werte etc. im Detail beschreiben. 12 Logging richtig gemacht!
Step #5 : Eine gute Log-Nachricht ist ein unformatierter, kurzer Satz mit wenigen, aber wichtigen Details (IDs) 13 Logging richtig gemacht!
Step #6 : Exceptions to Log or not to Log? Exceptions 1x behandeln & 1x loggen D.h. nur loggen, wenn: a. nicht weitergeworfen b. an der Stelle behandelt wurde c. oder Schnittstellengrenzen überschreitet 14 Logging richtig gemacht!
Step #8 : Log-Performance Teure DEBUG und TRACE-Statements nur bedingt ausführen if (LOG.isTraceEnabled()) { String jobid = job.getcurrentjob().getid(); String username = Session.get().getUser().getDisplayName(); LOG.trace("User "+ username +" triggered recalculation of job "+ jobid); } Platzhalter nutzen (JCL, Logback LOG.debug("Temperature set to {}. Old temperature was {}.", t, oldt); Log- Weitere Aspekte, Asynchrones-Logging 15 Logging richtig gemacht!
Step #9 : Best Practices Disziplin! Disziplin! Disziplin! [ INFO] [ebapp.projectinitlistener] RENT-A-TANK Version Q3_2011 (Built on: 2011-08-18 18:59:08, SVN #727 tampered) [ INFO] [.business.projectsettings] Routing all JDK logging through SLF4J. [ INFO] [.business.projectsettings] Initializing persistence layer... [ INFO] [e.persistence.eclipselink] ServerSession(29876598)--EclipseLink, version: Eclipse Persistence Services - 2.1.2 [ INFO] [e.persistence.eclipselink] ServerSession(29876598)--file:/D:/projects/orchideo-prototype/rent-a-tank.trunk/orc [ INFO] [.business.projectsettings] Initializing configuration data store...: ::: Using volatile, non persistent defaul [TRACE] [.business.serviceprovider] No service implementation registered for 'CategoryService'. Looking for annotation. [DEBUG] [.business.serviceprovider] Auto-wiring service 'CategoryService' to 'de.exxcellent.orchideodemo.business.persi [ INFO] [ialogs.login.loginprocess] Trying to login user 'user' [TRACE] [.business.serviceprovider] No service implementation registered for 'AuthenticationService'. Looking for annot [DEBUG] [.business.serviceprovider] Auto-wiring service 'AuthenticationService' to 'de.exxcellent.orchideodemo.business [ INFO] [UI ] Notifier: Testdaten bereits vorhanden. Es wurden keine weiteren Testdaten angelegt. Saubere Kategorien, Log-Levels, Nachrichten, Performance Code-Reviews der Logs 16 Logging richtig gemacht!
Step #9 : Best Practices Selbst-beschreibende Exceptions für Entwicklung 17 Logging richtig gemacht!
Step #9 : Best Practices l Fehler-IDs in GUI-Meldungen als schnelle Referenz in das Log l Keine sensiblen Inhalte loggen (Passwörter, Datenschutz!) l Nicht als Monitoring-Ersatz missbrauchen (Performance Logs) l Log4J's MappedDiagnosticContext (MDC) and NestedDiagnosticContext (NDC) nutzen! l Eigene Log-Objekte & Appenders nutzen l In Produktion: Keine Filenames/Line-Numbers 18 Logging richtig gemacht!
Step #10 : Mehrwerte Zentrales Logging über Netzwerk (Syslog, UDP) log4net, Chainsaw, Sentinel 19 Logging richtig gemacht!
FAZIT 1. Logging vollständig konfigurieren! 2. Levels & Texte mit Bedacht wählen 3. TRACE nutzen! 4. Be nice & polite (Levels, Ästhetik, Performance) High Performance And Smarter Logging 20 Logging richtig gemacht!