Logging APIs (OSGi)

Logging APIs (OSGi)

The fundamental interface is org.osgi.service.log.LogService from Chapter 101 of OSGi Compendium specification. The history of org.osgi.service.log package versions is:

  • 1.0: OSGi R1

  • 1.1: OSGi R2

  • 1.2: OSGi R3

  • 1.3: OSGi R4, R4.1, R4.2, R4.3, R5, R6

  • 1.4: OSGi R7

pax-logging-api-1.x uses version 1.3 from OSGi Compendium R6. pax-logging-api-2.x will use version 1.4 from OSGi Compendium R7.

Usage with OSGi Logging API only

OSGi R6 Logging API may be used in this canonical way:

org.osgi.framework.BundleContext context = ...; ServiceReference<org.osgi.service.log.LogService> sr = context.getServiceReference(org.osgi.service.log.LogService.class); org.osgi.service.log.LogService log = context.getService(sr); log.log(org.osgi.service.log.LogService.LOG_INFO, "INFO1 through org.osgi.service.log"); log.log(org.osgi.service.log.LogService.LOG_DEBUG, "DEBUG1 through org.osgi.service.log");

Usage with OSGi R7 Logging API only

OSGi R7 Logging API adds logger concept, which matches what we all know from popular logging frameworks. So in addition to the above usage (through an OSGi service), we can actually obtain a logger instance):

org.osgi.framework.BundleContext context = ...; ServiceReference<org.osgi.service.log.LoggerFactory> sr = context.getServiceReference(org.osgi.service.log.LoggerFactory.class); org.osgi.service.log.LoggerFactory factory = context.getService(sr); org.osgi.service.log.Logger log = factory.getLogger("my.logger"); log.info("INFO through R7 org.osgi.service.log.Logger"); log.audit("AUDIT through R7 org.osgi.service.log.Logger");

Usage with Pax Logging API

Pax Logging itself registers a service that’s required to implement standard org.osgi.service.log. In fact, the OSGi service registered by Pax Logging API includes these interfaces:

  • org.osgi.service.log.LogService

  • org.knopflerfish.service.log.LogService

  • org.ops4j.pax.logging.PaxLoggingService

  • and additionally org.osgi.service.cm.ManagedService for configuration purposes

To use PaxLoggingService similar code fragment is required:

org.osgi.framework.BundleContext context = ...; ServiceReference<org.ops4j.pax.logging.PaxLoggingService> sr = context.getServiceReference(org.ops4j.pax.logging.PaxLoggingService.class); org.ops4j.pax.logging.PaxLoggingService log = context.getService(sr); log.log(org.osgi.service.log.LogService.LOG_INFO, "INFO1 through org.ops4j.pax.logging.PaxLoggingService"); log.log(org.osgi.service.log.LogService.LOG_DEBUG, "DEBUG1 through org.ops4j.pax.logging.PaxLoggingService");

So the only change is the interface used. Simply because org.ops4j.pax.logging.PaxLoggingService extends org.osgi.service.log.LogService.