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

281
16 Der Log Service
Motivation
In diesem Kapitel stellen wir Ihnen mit dem Log Service einen Service
vor, mit dem innerhalb der OSGi Servie Platform zentral Nachrichten
geloggt und ausgelesen werden können. Der Log Service erlaubt – ähn-
lich wie der Logger des JDKs – das Loggen von Nachrichten auf unter-
schiedlichen Log-Leveln. Clients, die an Log-Ereignissen interessiert
sind, können die Nachrichten empfangen und verarbeiten. Darüber
hinaus werden Log-Nachrichten innerhalb des Log Service vorgehalten,
so dass sie zu einem späteren Zeitpunkt ausgelesen werden können.
Management Agents nnen die über den Log Service bereitge-
stellte Funktionalität nutzen, um einem Administrator die aufgelaufe-
nen Log-Nachrichten anzuzeigen.
Einordnung
Der Log Service ist sowohl Bestandteil des OSGi Service Compen-
dium als auch der OSGi Mobile Specification. Spezifiziert ist er darin
jeweils in Kapitel 101 »Log Service Specification«.
16.1 Tutorial: Logging in der OSGi Service Platform
Überblick
In diesem Tutorial stellen wir Ihnen die Funktionsweise des OSGi Log-
ging Service anhand der folgenden zwei Bundles vor:
Das Bundle org.osgibook.logwriter: Das Bundle
org.osgibook.log-
writer
implementiert eine einfach Service Component, die den Log
Service verwendet, um ihre Aktivierung und Deaktivierung zu pro-
tokollieren.
Das Bundle org.osgibook.consolelogger: Innerhalb des Bundles
org.osgibook.consolelogger implementieren wir einen Log Listener,
der am Log Reader Service angemeldet wird und die geloggten
Nachrichten auf der Konsole ausgibt. Der Log Listener wird eben-
falls in Form einer Service Component realisiert.
16 Der Log Service282
In Abb. 16–1 sind die beteiligten Bundles im Überblick dargestellt.
Die Plug-in-Projekte
In Abb. 16–2 sind die fertigen Plug-in-Projekte aus diesem Tutorial
dargestellt.
Abb. 16–1
Übersicht über die
Bundles dieses Tutorials
verwendet
Klassen aus
verwendet
Service
LogService
OSGi Service Platform /
Log Service
LogReader
Service
OSGi Service Platform /
Declarative Services
MANIFEST.MF
META-INF
org.osgibook.consolelogger
OSGI-INF
MANIFEST.MF
META-INF
org.osgibook.logwriter
OSGI-INF
g
MANIFEST
.
MF
org.osgibook.logwrite
r
OSGI-INF
Bundle-SymbolicName:
org.osgibook
.logwriter
M
ANIFE
S
T.
MF
MET
A-I
NF
OSGI-INF
Bundle-SymbolicName:
org.osgibook
.consolelogger
Abb. 16–2
Die Plug-in-Projekte
28316.1 Tutorial: Logging in der OSGi Service Platform
Schritt 1a: Anlegen des Bundles org.osgibook.logwriter
Legen Sie zunächst ein neues Bundle mit dem Namen org.osgibook.
logwriter
und dem folgenden Import-Package-Header an:
Import-Package: org.osgi.framework;version="1.4.0",
org.osgi.service.component;version="1.0.0",
org.osgi.service.log;version="1.3.0"
Zusätzlich müssen Sie im Bundle Manifest über den Header Service-
Component
angeben, wo sich innerhalb des Bundles die Komponenten-
beschreibung für die Log-Writer-Komponente befindet:
Service-Component: OSGI-INF/component-description.xml
Schritt 1b: Implementieren der Log-Writer-Komponente
Anschließend implementieren Sie die Klasse org.osgibook.logwriter.
LogWriterComponent. Diese Komponente soll bei ihrer Aktivierung bzw.
Deaktivierung eine Nachricht über den Log Service ausgeben (vgl. Lis-
ting 16–1):
package org.osgibook.logwriter;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.log.LogService;
public class LogWriterComponent {
private LogService logService;
public void setLogService(LogService logService) {
this.logService = logService;
}
public void unsetLogService(LogService logService) {
this.logService = null;
}
protected void activate(ComponentContext context) {
logService.log(LogService.LOG_INFO,
"Komponente wird aktiviert");
}
protected void deactivate(ComponentContext context) {
logService.log(LogService.LOG_INFO,
"Komponente wird deaktiviert");
}
}
Listing 16–1
Die Klasse
LogWriterComponent
16 Der Log Service284
Schritt 1c: Die Beschreibung der Log-Writer-Komponente
Anschließend muss für die Log-Writer-Komponente noch die Kompo-
nentenbeschreibung in Form der Datei
OSGI-INF/component-descrip-
tion.xml
angelegt werden:
<?xml version="1.0"?>
<component name="logwriterComponent">
<implementation
class="org.osgibook.logwriter.LogWriterComponent"/>
<reference name="logService"
interface="org.osgi.service.log.LogService"
bind="setLogService"
unbind="unsetLogService"
/>
</component>
Schritt 2a: Anlegen des Bundles org.osgibook.consolelogger
Legen Sie nun ein zweites Plug-in-Projekt mit dem Namen org.osgi-
book.consolelogger
und dem folgenden Import-Package-Header an:
Import-Package: org.osgi.framework;version="1.3.0",
org.osgi.service.component;version="1.0.0",
org.osgi.service.log;version="1.3.0"
Auch hier müssen Sie die Datei spezifizieren, die die Komponentenbe-
schreibung enthält:
Service-Component: OSGI-INF/component-description.xml
Schritt 2b: Implementieren der Console-Logger-Komponente
Um die Nachrichten auf der Equinox-Konsole auszugeben, implemen-
tieren wir eine Console-Logger-Komponente, die ihrerseits das Inter-
face
LogListener implementiert. Das Interface LogListener wird vom
Log Service aufgerufen, sobald ein Bundle eine Nachricht geloggt hat
(vgl. Listing 16–2).
package org.osgibook.consolelogger;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.log.LogEntry;
import org.osgi.service.log.LogListener;
import org.osgi.service.log.LogReaderService;
import org.osgi.service.log.LogService;
public class ConsoleLoggerComponent implements LogListener {
private LogReaderService logReaderService;
Listing 16–2
Die Klasse
ConsoleLogger
28516.1 Tutorial: Logging in der OSGi Service Platform
public void setLogReaderService(LogReaderService
logReaderService) {
this.logReaderService = logReaderService;
}
public void unsetLogReaderService(LogReaderService
logReaderService) {
this.logReaderService = null;
}
protected void activate(ComponentContext componentContext) {
logReaderService.addLogListener(this);
}
protected void deactivate(ComponentContext componentContext) {
logReaderService.removeLogListener(this);
}
public void logged(LogEntry entry) {
String log = String.format("[%s] <%s> %s",
getLevelAsString(entry.getLevel()),
entry.getBundle().getSymbolicName(),
entry.getMessage());
System.out.println(log);
Throwable exception = entry.getException();
if (exception != null) {
exception.printStackTrace();
}
}
protected String getLevelAsString(int level) {
switch (level) {
case LogService.LOG_DEBUG:
return "DEBUG";
case LogService.LOG_INFO:
return "INFO";
case LogService.LOG_WARNING:
return "WARN";
case LogService.LOG_ERROR:
return "ERROR";
default:
}
return "UNKNOWN";
}
}

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