Die Protokollierung sollte einfach und übersichtlich sein. Sie sind ein wesentlicher Bestandteil der täglichen Verwaltungsarbeit und liefern wichtige Informationen für die Fehlersuche bei Produktionsstörungen. Angemessene Protokollierung spart Zeit und Geld. Wenn Sie eine Reihe von Anwendungen hosten, z.B. mehr als 10, sollten Sie die Anwendungsprotokolle voneinander und von den Plattformprotokollen und Traces trennen. Logging-Frameworks wie jdk logger und log4j, die mit dem j2ee-Container zusammenarbeiten, bieten die Möglichkeit, dies über Konfigurationsdateien zu tun. So weit, so gut.
Irgendwann (ich glaube ab 5.0) beschloss IBM, jakarta/apache commons-logging (JCL) in ihr Produkt Websphere Application Server aufzunehmen. Dabei handelt es sich um ein bekanntes Open-Source-Produkt, das eine Abstraktion bietet, unter der theoretisch jede Protokollierungsimplementierung verwendet werden kann. Die Aufnahme in WAS hat zur Folge, dass sich bei Anwendungen, die dasselbe Framework verwenden, das Protokollierungsverhalten ändern kann. Das liegt daran, dass die Protokollierungsklassen standardmäßig von einem anderen Classloader geladen werden. Dieser Classloader muss in der Lage sein, sowohl die log4j.jar als auch deren Konfigurationsdatei zu finden.
Es gibt noch ein weiteres Problem: JCL muss mitgeteilt werden, dass es log4j verwenden muss. Standardmäßig wird der JDK-Logger verwendet und jede Zeile landet in SystemOut.log. Die org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory
Ich habe getan, was ich in der Dokumentation gelesen hatte, habe meine Anwendung neu bereitgestellt und alles schien in Ordnung zu sein. Bis ich den Classloading-Modus auf PARENT_FIRST änderte. Websphere-Anwendungen können diese Einstellung oder APPLICATION_FIRST haben. Im letzteren Modus werden zuerst die mit der Anwendung gebündelten jar-Dateien verwendet, bevor die Standard-Websphere-Bibliotheken geladen werden.org.apache.commons.logging.impl.Log4jFactory
Und das war's dann auch schon. Danke Apache, dass Sie die ClassNotFoundException geschluckt haben!
Nach einigem Suchen bin ich auf einen weniger bekannten Teil der offiziellen SUN jarfile-Spezifikation gestoßen, der besagt, dass Service-Schnittstellen bestimmte Implementierungsklassen haben können, die in einer Datei mit dem Namen der Schnittstelle angegeben werden. Es handelt sich um eine wirklich rudimentäre IOC-Implementierung, die in den Tagen von jdk 1.3 in Mode gewesen sein muss.
Verfasst von
Sander Hautvast
Contact



