Seit Java 1.4 gibt es das Paket java.util.logging, mit dessen Hilfe das Logging standardisiert wurde. Ich möchte an dieser Stelle jeder Wertung außen vor lassend einmal vorstellen, wie mithilfe der Java Logging API die Entwicklung in Netbeans und Eclipse (und anderen Entwicklungsumgebungen) erleichtert werden kann.

Insbesondere die Kombination von jUnit Tests und verschiedenen Logleveln bzw. Loghandlern kann das Leben eines Entwicklers drastisch vereinfachen und oft auch einen Debugger überflüssig machen.Zum Verständnis eine kurze Einführung in das Java Logging API. (Weitere Infos in der offiziellen Dokumentation zu Java Logging und der Java Logging Overview) Es gibt Produzenten von Logdaten, Formatter, die die Nachrichten formatieren und Konsumenten (Handler), die die Lognachrichten dann verarbeiten.

Sowohl bei der Generierung von Lognachrichten als auch beim Konsumieren (dem Loghandler) kann man ein Loglevel angeben. Alle Nachrichten, die ein niedrigeres Loglevel haben, werden ausgefiltert. Für Handler kann man Formatter definieren, um die Logdaten in ein genehmes Format zu konvertieren. (XML, eigenes plain-text, …). Für eine bessere Übersicht und Details zu der Hierarchie sei auf die offizielle Dokumentation verwiesen.Die Standardkonfiguration von Java Logging definiert einen ConsoleHandler und Level INFO. (Im Installationsverzeichnis der Java JRE kann man in der Datei logging.properties auch die Konfiguration einsehen oder zentral ändern.)

Möchte man dies lokal ändern, so kann dies programmatisch erfolgen, doch komfortabler macht man dies über eine Konfigurationsdatei die man der JVM beim Starten mitgeben kann. So lassen sich auch für einzelne Programmstarts – oder Testläufe – eigene Konfigurationen aktivieren.

Die Konfigurationsdatei für das java.util.logging Framework wird in einem normalen „Properties“ Format abgelegt. Dort können Handler, Formatter und Loglevel definiert werden. Praktisch: Pro Package oder sogar für einzelne Klassen kann das Loglevel geändert werden.
Die Datei wird dann per JVM Argument (System Parameter) spezifiziert:

-Djava.util.logging.config.file=logging.properties

Eine beispielhafte Anwendung kann dann so aussehen, dass ich in dem Package „de.everflux.foo“ eine zu testende Klasse habe, und einen jUnit Test habe, der diese Klasse aufruf. So kann ich dann mittels

handlers = java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = ALL
de.everflux.foo.level = FINEST
.level = INFO

Das Loglevel für die generierten Nachrichten in dem Package „de.everflux.foo“ auf FINEST stellen, während für alle anderen (bzw. das Wurfel Package) das Level INFO konfiguriert wird.

Als Handler wurde lediglich der ConsoleHandler definiert, und dieser so eingestellt, dass alle Meldungen ausgegeben werden sollen, also hier keine Filterung mehr stattfindet.

In Netbeans, bzw. auch in Eclipse, kann ich dann über die „Project / Run Configuration“ oder „Launch Configuration“ entsprechende Parameter setzen. So ist dann für einzelne Testläufe schnell das Loglevel angepaßt. Berücksichtigt man schon beim Schreiben von Tests und Klassen, dass man ruhig Debugging-Ausgabe per FINER oder FINEST Loglevel Informationen loggen kann, dann ist das spätere Debugging einfacher.

Auch in Produktion – eben das Loglevel erhöhen und sich (hoffentlich hilfreiche) Daten zusenden zu lassen ist allemal einfacher, als dem Endanwender zu erklären wie man einen Debugger startet.