Apache Felix Logback is a small integration of the Logback backend with OSGi.
With OSGi R7 the Log Service Specification 1.4 (Log 1.4) brings a slew of new features designed to improve the developer experience with logging, the details of which can be read about here.
This project is intended to help bridge the last frontier of OSGi logging by leveraging many capabilities of Logback, the new Log 1.4 features to provide a unified backend where:
To add Logback to an OSGi framework include the following dependencies
:::xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.x</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.x</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.x</version> </dependency>
These provide the slf4j
logging API over the Logback backend.
Configuring logback is most easily handled by setting the system property logback.configurationFile
to point to a file on the file system.
This is an example using a bndrun file:
:::properties -runproperties: logback.configurationFile=file:${.}/logback.xml
where in bnd ${.}
gives the path to the directory of the bndrun file.
Logback offers many features from it's configuration file, so make sure to look through the documentation.
There are at least two possible deployment scenarios.
The standard approach is to install all bundles into the OSGi runtime.
pros:
cons:
The immediate approach overcomes the cons of the standard approach and initializes the log engine as early as possible in order to avoid buffering, binding issues, or losing records.
pros:
cons:
Of course adding Logback does not magically result in all logs being funneled into the same appenders, particularly the OSGi logs. However, it is quite common to assemble an OSGi application from a variety of bundles which use a variety of logging APIs. Many of these can already be mapped onto Logback.
Many examples of setting up the various logging APIs can be found in the integration tests of the project.
The following APIs are tested:
The OSGi Log specification 1.4 describes events resulting in log records. Log 1.4 defines logger names mapping to these events.
Event | Logger Name | Events types |
---|---|---|
Bundle event | Events.Bundle | INSTALLED - BundleEvent INSTALLEDSTARTED - BundleEvent STARTEDSTOPPED - BundleEvent STOPPEDUPDATED - BundleEvent UPDATEDUNINSTALLED - BundleEvent UNINSTALLEDRESOLVED - BundleEvent RESOLVEDUNRESOLVED - BundleEvent UNRESOLVED |
Service event | Events.Service | REGISTERED - ServiceEvent REGISTEREDMODIFIED - ServiceEvent MODIFIEDUNREGISTERING - ServiceEvent UNREGISTERING |
Framework event | Events.Framework | STARTED - FrameworkEvent STARTEDERROR - FrameworkEvent ERRORPACKAGES_REFRESHED - FrameworkEvent PACKAGES REFRESHEDSTARTLEVEL_CHANGED - FrameworkEvent STARTLEVEL CHANGEDWARNING - FrameworkEvent WARNINGINFO - FrameworkEvent INFO |
Legacy Log Service events | LogService | any log events originating from bundles that used the original LogService logging API |
Note: In order to improve the granularity of the logging associated with these events, Apache Felix Logback allows appending a period (.
) followed by any number of segments (separated by periods) of the Bundle-SymbolicName
for the logger names used in configuring the levels. This greatly improves the configurability.
Consider the following logback.xml
example:
:::xml <configuration> <!-- defined a console append --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%.15thread] %-5level %logger{36}:%line - %msg%n</pattern> </encoder> </appender> <!-- log all Bundle events --> <logger name="Events.Bundle" level="TRACE"/> <!-- log WARN Framework service events of bundles whose BSN starts with `org.eclipse.osgi` (guess who that is?) --> <logger name="Events.Service.org.eclipse.osgi" level="WARN"/> <!-- turn OFF legacy Log Service records from bundles whose BSN starts with `org.baz` --> <logger name="LogService.org.baz" level="OFF"/> <!-- log DEBUG Service events for bundles whose BSN starts with `org.fum` --> <logger name="Events.Service.org.fum" level="DEBUG"/> <!-- log DEBUG from any log API using a logger name starting with `org.my.foo` --> <logger name="org.my.foo" level="DEBUG"/> <root level="ERROR"> <appender-ref ref="STDOUT" /> </root> </configuration>
eclipse.log.enabled=false