Client

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.

Client Logging

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.

Die jadice Logging Framework Fassade

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.

Verwendung existierender Logging-Systeme

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.

Log4J

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.

SLF4J

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-version.jar 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.

Mögliche Fehlermeldungen

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:

  1. 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.

  2. 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.


[jadice server Version 5.8.7.0: Dokumentation für Entwickler und Administratoren. Veröffentlicht: 2021-04-15]