O'Reilly logo

Die OSGi Service Platform: Eine Einführung mit Eclipse Equinox by Matthias Lübken, Bernd Kolb, Nils Hartmann, Gerd Wütherich

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

16 Der Log Service286
Schritt 2c: Die Beschreibung der Console-Logger-Komponente
Auch für die Clock-Komponente muss eine Komponentenbeschrei-
bung in Form der Datei
OSGI-INF/component-description.xml angelegt
werden:
<?xml version="1.0"?>
<component name="consoleLoggerComponent">
<implementation
class="org.osgibook.consolelogger.ConsoleLoggerComponent"/>
<reference name="logService"
interface="org.osgi.service.log.LogReaderService"
bind="setLogReaderService"
unbind="unsetLogReaderService"
/>
</component>
Schritt 3: Ausführen des Beispiels
Anlegen der
Launch-Konfiguration
Erzeugen Sie nun eine neue Launch-Konfiguration, in der Sie neben
den Bundles aus dem Workspace auch die folgenden Bundles auswäh-
len:
org.eclipse.osgi
org.eclipse.osgi.services
org.eclipse.equinox.log
org.eclipse.equinox.ds
Um sicherzustellen, dass beim Starten des Bundles org.osgibook.
logwriter
auch tatsächlich ein Log Service vorhanden ist, stellen Sie für
dieses Bundle ein höheres Start-Level als für das Bundle
org.eclipse.
osgi.log ein.
Starten des Beispiels
Nach dem Starten der Launch-Konfiguration sehen Sie, dass die
Log-Nachrichten auf der Konsole ausgegeben werden:
osgi> [INFO] <org.osgibook.logwriter> Komponente wird aktiviert
Zusätzlich können Sie mit dem Equinox-Konsolenkommando log zu
beliebigen Zeitpunkten die im Log Service geloggten Nachrichten aus-
geben lassen:
osgi> log
[...]
>Info [5] Komponente wird aktiviert
initial@reference:file:C:/workspace/org.osgibook.logwriter/
Listing 16–3
Die Datei OSGI-
INF/component-
description.xml
28716.2 Überblick über den Log Service
16.2 Überblick über den Log Service
Die Log-Service-Spezifikation definiert zwei Services: den Log Service
zum Schreiben von Log-Nachrichten und den Log Reader Service zum
Lesen von Log-Nachrichten (vgl. Abb. 16–3).
LogService
Mit dem Log Service können Sie Nachrichten aus Ihrer Anwendung
heraus protokollieren. Dabei können Sie neben der eigentlichen Nach-
richt einen Log-Level sowie eine Service Reference übergeben. Damit
haben Clients, die Ihre Log-Nachricht verarbeiten, die Möglichkeit, zu
identifizieren, aus welchem Service die Nachricht stammt. Das Inter-
face
LogService ist vergleichbar mit der Logger-Klasse des JDK
(
java.util.Logger).
Log Reader Service
Der Log Reader Service ist das Gegenstück zum Log Service: Über
diesen Service haben Sie die Möglichkeit, auf Nachrichten, die über
den Log Service verschickt wurden, zuzugreifen bzw. sich informieren
zu lassen, sobald neue Nachrichten über den Log Service veschickt
werden. Dazu können Sie einen Log Listener am Log Reader Service
anmelden, an den alle künftigen Log-Nachrichten weitergeleitet wer-
den. Diese Möglichkeit ist insbesondere für Management Agents inte-
ressant, die Log-Nachrichten erhalten und z.B. in einem grafischen
Frontend ausgeben möchten.
Im Übrigen ist der Log Service nicht nach dem Whiteboard-Pattern
implementiert, da dieses Pattern erst entwickelt wurde, nachdem der
Service bereits spezifiziert war.
Abb. 16–3
Überblick über
den Log Service
OSGi Framework
Management
Bundle
M
ana
g
emen
t
Management
Agent
LogReader
Service
LogService
16 Der Log Service288
16.3 Verwenden des Log Service
Über den Log Service können Sie Nachrichten mit einem Log-Level
und einer optionalen Service Reference loggen. Außerdem können Sie
eine ebenfalls optionale Exception angeben. Zum Loggen einer Nach-
richt definiert das Interface
LogService eine Reihe von spezialisierten
log-Methoden (vgl. Listing 16–4):
package org.osgi.service.log;
import org.osgi.framework.ServiceReference;
public interface LogService {
public static final int LOG_ERROR = 1;
public static final int LOG_WARNING = 2;
public static final int LOG_INFO = 3;
public static final int LOG_DEBUG = 4;
public void log(int level, String message);
public void log(int level, String message, Throwable exception);
public void log(ServiceReference sr, int level, String message);
public void log(ServiceReference sr, int level, String message,
Throwable exception);
}
Mit dem level-Parameter geben Sie den Log-Level der Nachricht an
(Error, Warning, Info, Debug). Dazu können Sie die vordefinierten
Werte verwenden, die im Interface
LogService definiert sind. Die zu
loggende Nachricht geben Sie mit dem
message-Parameter an.
Wenn Sie zusätzlich zur Log-Nachricht eine Exception protokolli-
ieren möchten, können Sie diese mit dem
exception-Parameter überge-
ben. Über den
sr-Parameter können Sie eine (optionale) ServiceRefe-
rence übergeben, die einen Service repräsentiert, der die Log-Nachricht
erzeugt hat.
Beispiel
Mit der folgenden Anweisung loggen Sie über den Log Service eine
Nachricht mit dem Log Level »Info«:
LogService logService = [...]
if (logService != null) {
logService.log(LogService.LOG_INFO, “...“);
}
Listing 16–4
Das Interface
LogService
28916.4 Verwenden des Log Reader Service
16.4 Verwenden des Log Reader Service
Um die geloggten Nachrichten auszulesen oder sich über geloggte
Nachrichten informieren zu lassen, kann der Log Reader Service ver-
wendet werden. In der Regel wird der Log Reader Service
von
Management Agents genutzt, um Nachrichten, die innerhalb der OSGi
Platform geloggt wurden, an einer zentralen Stelle auszugeben. Das
Auslesen der Nachrichten kann aber auch programmatisch über das
Interface
LogReaderService erfolgen.
16.4.1 Der LogReaderService
Der Log Reader Service bietet zwei Wege, um an Log-Nachrichten zu
gelangen. Einerseits können sich Clients bereits geloggte Nachrichten
geben lassen. Andererseits können sich Clients als
LogListener anmel-
den, um über künftige Log-Nachrichten informiert zu werden:
package org.osgi.service.log;
import java.util.Enumeration;
public interface LogReaderService {
public Enumeration getLog();
public void addLogListener(LogListener listener);
public void removeLogListener(LogListener listener);
}
Über die Methode getLog() können Sie eine Liste der bereits geloggten
Nachrichten erhalten. Die Service-Spezifikation lässt allerdings den
Anbietern eines
LogReaderService explizit freie Wahl, wie viele der letz-
ten Log-Nachrichten die Implementierung des
LogReaderService aufbe-
wahrt. Außerdem überlässt die Spezifikation den Anbietern die Wahl,
ob sie auch Nachrichten vorhalten, die mit dem Debug-Level geloggt
wurden. Wenn Sie die
getLog()-Methode verwenden, erhalten Sie also
wahrscheinlich nur einen Teil der geloggten Nachrichten. Die
get-
Log()
-Methode liefert Ihnen die Nachrichten in Form einer Enumeration
von LogEntry-Objekten zurück, die neben der eigentlichen Nachricht
weitere (Kontext-)Informationen enthalten.
Listing 16–5
Das Interface
LogReaderService

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required