Für den clientseitigen Einsatz müssen die jar
-Dateien aus dem Verzeichnis /client-lib
in den Klassenpfad der Anwendungs-/ Entwicklungsumgebung
eingebunden werden.
Die Verwendung der Client-Bibliotheken ist zusammen mit Codebeispielen in Kapitel 6, Anwendung / Funktionalität beschrieben.
Die Codebasis von jadice server macht an vielen Stellen Gebrauch von Logging um auf Probleme hinzuweisen und Nachvollziehbarkeit zu ermöglichen. Zur Nutzung von Logging existieren mehrere allgemein erhältliche Frameworks, die verschiedene Ansätze verfolgen und über unterschiedlichen Leistungsumfang verfügen.
Da jadice server-Client-API zur Einbindung in eine Gesamtapplikation konzipiert ist, legt sie sich nicht auf die Verwendung eines bestimmten Logging-Frameworks fest. Es existiert stattdessen die jadice Logging Framework Fassade, die das Logging-System der integrierenden Applikation mitverwenden kann.
Das jadice Logging-Framework erlaubt ein direktes und einfaches Einbinden der bekanntesten und verbreitetsten Logging-Systeme und -Frameworks, wie JDK Logging, Log4J, SLF4J und via SLF4J Logback, JCL, x4Juli und viele andere mehr. Sofern Sie bereits eines der erwähnten Frameworks einsetzen, ist zur Ausgabe von Logmeldungen in eines dieser Logging-Systeme oft nur eine Modifikation des Klassenpfads notwendig.
Falls kein bestimmtes Logging-Delegate, sprich ein bestimmtes Logging-Framework, durch den Klassenpfad vorgegeben oder verfügbar ist, wird der in Java enthaltene JDK-Logger als Fallback verwendet. Da der JDK-Logger immer zur Verfügung steht, ist es unerheblich, wann das gewünschte Ziel-Loggingsystem im Klassenpfad zur Verfügung gestellt wird. Auch ist es möglich, während der Entwicklungsphase ein anderes Loggingsystem zu verwenden als im Produktivsystem. Durch Verwendung der Logging-Fassade ist selbst ein späterer Wechsel des Logging Systems ohne weiteren Programmieraufwand möglich.
Die folgenden Abschnitte gehen zunächst auf die Verwendung der Logging-Fassade mit unterschiedlichen Ziel-Logging-Frameworks ein.
Die Auslieferung des jadice server stellt neben dem Standard JDK-Logger zwei weitere Implementationen von Logging-Delegates zur Verfügung. Soll Log4J verwendet werden, fügen Sie die entsprechende Log4J-Implementation dem Klassenpfad der Anwendung hinzu. Zur Verwendung eines anderen Logging-Frameworks nehmen Sie statt dessen die entsprechende SLF4J-Implementation im Klassenpfad auf.
Eine detaillierte Beschreibung, wo die gewünschte Implementation des Logging-Delegates in der Auslieferung zu finden ist, ob und welche weiteren Schritte notwendig sind, entnehmen Sie bitte den folgenden Abschnitten.
Die in der Auslieferung enthaltenen Logging-Delegates benötigen keine weitere spezifische Konfiguration. Eine Anpassung des Verhaltens des Ziel-Logging-Systems, zum Beispiel des Log-Levels oder ähnlichem, wird grundsätzlich über die Konfigurationsmöglichkeiten des jeweiligen Ziel-Logging-Systems gesteuert.
Die Implementation des Logging-Delegates für Log4J entspricht folgender Namenskonvention:
logging-log4j-
version
.jar
In der Auslieferung finden Sie das entsprechende Log4J-Delegate, jeweils
passend zu den im Einsatz befindlichen jadice server-Client-API-Modulen, im Verzeichnis
client-lib/logging
.
Fügen Sie bitte den zu Ihrer jadice server-Version passenden Log4J-Delegate wie auch Log4J selber in den Klassenpfad der Anwendung ein. Ist eine log4J-Konfiguration bereits auf dem Klassenpfad verfügbar, wird keine weitere Konfiguration benötigt.
Log4J wie auch detaillierte Informationen über die Log4J Konfiguration finden Sie auf der Log4J Homepage und im Log4J Manual.
Die Namenskonvention des Logging-Delegates von SLF4J entspricht folgendem Schema:
logging-slf4j-
version
.jar
Wie auch für Log4J finden Sie das entsprechende SLF4J-Delegate, jeweils
passend zu den im Einsatz befindlichen jadice server-Client-API-Modulen, im Verzeichnis
client-lib/logging
.
Fügen Sie bitte den zu Ihrer jadice server-Version passende SLF4J-Delegate in den
Klassenpfad der Anwendung ein. Zusätzlich wird das
slf4j-api-
und eine Logging-Implementierung benötigt. Detaillierte Informationen über
SLF4J und unterstützte Typen der Logging Delegates und Implementierungen
finden Sie auf der SLF4J
Homepage beziehungsweise im SLF4J Manual.
version
.jar
Ein Großteil aller Klassen der jadice server-Client-API generiert Logging-Ausgaben. Wird
eine dieser Klassen aktiviert – also durch den
ClassLoader
geladen – fordert sie beim jadice-Logging-Framework
einen Logger an. Mit der ersten Anfrage an das Framework
wird dieses initialisiert und durchsucht den Klassenpfad nach dem
gewünschten Ziel-Logging-System. Sollte diese Suche fehlschlagen, wird die
folgende Nachricht auf der Kommandozeile
ausgegeben:
Unable to initialize logging.
Eine weitere Nachricht auf der Kommandozeile stellt daraufhin nähere Angaben über den Grund des Fehlschlags zur Verfügung. Es existieren zwei Arten von Gründen:
-
No logging delegation implementation on classpath
Tritt diese Fehlermeldung auf, so wurde keine der beiden in den vorigen Abschnitten beschriebenen Logging-Delegates für Log4J oder SLF4J im Klassenpfad gefunden. Es muss daher die
.jar
-Datei für das gewünschte Ziel-Logging-System korrekt dem Java-Klassenpfad hinzugefügt werden wie in den vorhergehenden Abschnitten beschrieben. -
Initialization failure due to exception
Diese Fehlermeldung deutet auf ein Problem des zugrundeliegenden Ziel-Logging-Systems hin und kann daher vielfältige Ursachen haben. Im Allgemeinen sollte die Dokumentation des entsprechenden Systems konsultiert werden.
Die folgenden Beispiele geben Anhaltspunkte für einzelne Fehlersituationen.
Beispiel 5.1. Fehlende Log4J-Bibliothek
Unable to initialize logging. Initialization failure due to exception: java.lang.NoClassDefFoundError: org/apache/log4j/LogManager at com.levigo.util.log.impl.Log4JLogFactory.<clinit>(Log4JLogFactory.java:23) at com.levigo.util.log.impl.LoggingBinder.getLoggerFactory(LoggingBinder.java:17) at com.levigo.util.log.LoggerFactory.<clinit>(LoggerFactory.java:24) ... (some more omitted entries) No logging binder available. Using JDK logging instead.
In diesem Fall ist es wahrscheinlich, dass die Log4J-Bibliothek nicht im Klassenpfad vorhanden ist. Zur Lösung des Problems muss die entsprechende
.jar
-Datei in den Klassenpfad der Applikation aufgenommen werden und sichergestellt werden, dass auf die Datei zugegriffen werden kann.Beispiel 5.2. Fehlende SLF4J-Bibliothek
Die folgende Fehlerausgabe zeigt das gleiche Problem, dieses Mal jedoch durch das Fehlen der notwendigen SLF4J-Bibliothek hervorgerufen. Zur Lösung des Problems muss die entsprechende
.jar
-Datei in den Klassenpfad der Applikation aufgenommen werden und sichergestellt werden, dass auf die Datei zugegriffen werden kann.Unable to initialize logging. Initialization failure due to exception: java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory at com.levigo.util.log.impl.Slf4JLogFactory.<clinit>(Slf4JLogFactory.java:17) at com.levigo.util.log.impl.LoggingBinder.getLoggerFactory(LoggingBinder.java:17) at com.levigo.util.log.LoggerFactory.<clinit>(LoggerFactory.java:24) ... (some more omitted entries) No logging binder available. Using JDK logging instead.
Beispiel 5.3. Fehlender Delegate für SLF4J
Da es sich bei SLF4J selbst ebenfalls um eine Logging-Fassade handelt, kann der folgende Fehler auftreten.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Unable to initialize logging. Initialization failure due to exception: java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder at org.slf4j.LoggerFactory.<clinit>(LoggerFactory.java:60) at com.levigo.util.log.impl.Slf4JLogFactory.<clinit>(Slf4JLogFactory.java:17) at com.levigo.util.log.impl.LoggingBinder.getLoggerFactory(LoggingBinder.java:17) at com.levigo.util.log.LoggerFactory.<clinit>(LoggerFactory.java:24) at com.levigo.jadice.gui.AbstractJadicePanel.<clinit>(AbstractJadicePanel.java:42) ... (some more omitted entries) No logging binder available. Using JDK logging instead.
Nähere Hinweise zur Behebung der Fehlersituation finden sich in der Dokumentation zu SLF4J.