You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by bu...@apache.org on 2018/07/13 14:37:40 UTC

svn commit: r1032489 - in /websites/staging/felix/trunk/content: ./ documentation/subprojects/apache-felix-log.html

Author: buildbot
Date: Fri Jul 13 14:37:40 2018
New Revision: 1032489

Log:
Staging update by buildbot for felix

Modified:
    websites/staging/felix/trunk/content/   (props changed)
    websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-log.html

Propchange: websites/staging/felix/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Fri Jul 13 14:37:40 2018
@@ -1 +1 @@
-1835842
+1835843

Modified: websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-log.html
==============================================================================
--- websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-log.html (original)
+++ websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-log.html Fri Jul 13 14:37:40 2018
@@ -88,52 +88,131 @@ h2:hover > .headerlink, h3:hover > .head
   visibility: hidden;
 }
 h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
-<p>The OSGi Service Compendium specification defines a general purpose Log Service for the OSGi Platform. It is a very simple specification that doesn't provide all the functionality commonly available in enterprise-level logging tools, but its extensible service model can be used to build fairly sophisticated logging solutions.</p>
-<p>The Log Service specification defines four main entities:</p>
+<p>The <a href="https://osgi.org/specification/osgi.cmpn/7.0.0/">OSGi Service Compendium specification</a> defines a general purpose <a href="https://osgi.org/specification/osgi.cmpn/7.0.0/service.log.html">Log Service</a> for the OSGi Platform. It is a very simple specification that doesn't provide all the functionality commonly available in enterprise-level logging tools, but its extensible service model can be used to build fairly sophisticated logging solutions.</p>
+<p>The Log Service specification defines the following entities:</p>
 <ul>
-<li><em><code>org.osgi.service.log.LogService</code></em> - service interface to log information, including log level, message, exception, and <code>ServiceReference</code> that generated the log.</li>
-<li><em><code>org.osgi.service.log.LogReaderService</code></em> - service interface to add and remove <code>LogListener</code> instances and to retrieve recent log entries.</li>
+<li><em><code>org.osgi.service.log.Logger</code></em> - (<em>since 1.4</em>) interface that allows a bundle to log information, including a message, a level, an exception, and a <code>ServiceReference</code> object. The formatting style using <code>{}</code> placeholders follows the <em>slf4j</em> approach. A derivative of <code>Logger</code> called <code>FormatterLogger</code> uses the <code>java.util.Formatter</code> syntax.</li>
+<li><em><code>org.osgi.service.log.LoggerFactory</code></em> - (<em>since 1.4</em>) service interface that allows a bundle to obtain a Logger. A Logger is named and associated with a <code>Bundle</code> object.</li>
+<li><em><code>org.osgi.service.log.admin.LoggerContext</code></em> - (<em>since 1.4</em>) interface that allows the configuration of effective logging levels for a Bundle. The configuration can be set in Configuration Admin and via method calls.</li>
+<li><em><code>org.osgi.service.log.admin.LoggerAdmin</code></em> - (<em>since 1.4</em>) interface for managing the configuration of log levels.</li>
+<li><em><code>org.osgi.service.log.LogService</code></em> - <em>legacy</em> service interface that allows a bundle to log information, including a message, a level, an exception, a <code>ServiceReference</code> object, and a <code>Bundle</code> object. The methods of this service are deprecated and it is recommended to use LoggerFactory and Loggers instead.</li>
+<li><em><code>org.osgi.service.log.LogReaderService</code></em> - service interface that allows access to a list of recent <code>LogEntry</code> objects, and allows the registration of a <code>LogListener</code> object that receives <code>LogEntry</code> objects as they are created.</li>
 <li><em><code>org.osgi.service.log.LogEntry</code></em> - interface defining a log entry.</li>
 <li><em><code>org.osgi.service.log.LogListener</code></em> - interface defining a listener for log entries, which is notified about new log entries.</li>
 </ul>
-<h2 id="accessing-the-log-service">Accessing the log service<a class="headerlink" href="#accessing-the-log-service" title="Permanent link">&para;</a></h2>
-<p>To access a <code>LogService</code> instance it is necessary to look it up in the OSGi service registry as demonstrated in the following code snippet:</p>
-<div class="codehilite"><pre><span class="n">public</span> <span class="n">class</span> <span class="n">Activator</span> <span class="n">implements</span> <span class="n">BundleActivator</span>
-<span class="p">{</span>
-    <span class="n">public</span> <span class="n">void</span> <span class="n">start</span><span class="p">(</span><span class="n">BundleContext</span> <span class="n">context</span><span class="p">)</span> <span class="n">throws</span> <span class="n">Exception</span> 
-    <span class="p">{</span>   
-        <span class="n">ServiceReference</span> <span class="n">ref</span> <span class="p">=</span> <span class="n">context</span><span class="p">.</span><span class="n">getServiceReference</span><span class="p">(</span><span class="n">LogService</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">getName</span><span class="p">());</span>
-        <span class="k">if</span> <span class="p">(</span><span class="n">ref</span> !<span class="p">=</span> <span class="n">null</span><span class="p">)</span>
-        <span class="p">{</span>
-            <span class="n">LogService</span> <span class="nb">log</span> <span class="p">=</span> <span class="p">(</span><span class="n">LogService</span><span class="p">)</span> <span class="n">context</span><span class="p">.</span><span class="n">getService</span><span class="p">(</span><span class="n">ref</span><span class="p">);</span>
+<h2 id="accessing-loggers">Accessing Loggers<a class="headerlink" href="#accessing-loggers" title="Permanent link">&para;</a></h2>
+<p>Loggers are obtained through the <code>LoggerFactory</code> service:</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Activator</span> <span class="kd">implements</span> <span class="n">BundleActivator</span>
+<span class="o">{</span>
+    <span class="kd">private</span> <span class="kd">volatile</span> <span class="n">LoggerFactory</span> <span class="n">loggerFactory</span><span class="o">;</span>
+
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">start</span><span class="o">(</span><span class="n">BundleContext</span> <span class="n">context</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> 
+    <span class="o">{</span>   
+        <span class="n">ServiceReference</span> <span class="n">ref</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getServiceReference</span><span class="o">(</span><span class="n">LoggerFactory</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">());</span>
+        <span class="k">if</span> <span class="o">(</span><span class="n">ref</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
+        <span class="o">{</span>
+            <span class="n">loggerFactory</span> <span class="o">=</span> <span class="o">(</span><span class="n">LoggerFactory</span><span class="o">)</span> <span class="n">context</span><span class="o">.</span><span class="na">getService</span><span class="o">(</span><span class="n">ref</span><span class="o">);</span>
+        <span class="o">}</span>
+    <span class="o">}</span>
+
+    <span class="c1">//..</span>
+</pre></div>
+
+
+<p>Elsewhere in the bundle you can then use the <code>LoggerFactory</code> to get a <code>Logger</code> for any class:</p>
+<div class="codehilite"><pre><span class="n">Logger</span> <span class="n">logger</span> <span class="o">=</span> <span class="n">loggerFactory</span><span class="o">.</span><span class="na">getLogger</span><span class="o">(</span><span class="n">Foo</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
+</pre></div>
+
+
+<p>Declarative Services (<em>since 1.4</em>) has a convenient integration which allows a component to obtain a logger specific to it's class with little effort by using a reference who's service type is <code>LoggerFactory</code> while the injection type is either <code>Logger</code> or <code>FormatterLogger</code>:</p>
+<div class="codehilite"><pre><span class="nd">@Reference</span><span class="o">(</span><span class="n">service</span> <span class="o">=</span> <span class="n">LoggerFactory</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
+<span class="kd">private</span> <span class="n">Logger</span> <span class="n">logger</span><span class="o">;</span>
+</pre></div>
+
 
-            <span class="o">//</span> <span class="n">Use</span> <span class="n">the</span> <span class="nb">log</span><span class="p">...</span>
-        <span class="p">}</span>
-    <span class="p">}</span>
+<p>The <code>Logger</code> interface defines 6 levels of logging to coincide with most other log APIs:</p>
+<ul>
+<li>AUDIT</li>
+<li>ERROR</li>
+<li>WARN</li>
+<li>INFO</li>
+<li>DEBUG</li>
+<li>TRACE</li>
+</ul>
+<p>Each level has methods on the Logger interface appropriate to that level such as <code>.info(...)</code> and <code>.isInfoEnabled()</code>.</p>
+<h2 id="configuring-log-levels">Configuring  Log Levels<a class="headerlink" href="#configuring-log-levels" title="Permanent link">&para;</a></h2>
+<p>Since 1.4 the <strong>Log Service Specification</strong> provides the ability to manage the log levels both programatically and through <strong>Configuration Admin</strong>.</p>
+<p>Programatic configuration is achieved through the <code>LoggerAdmin</code> service:</p>
+<div class="codehilite"><pre><span class="n">ServiceReference</span> <span class="n">ref</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getServiceReference</span><span class="o">(</span>
+    <span class="n">LoggerAdmin</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">());</span>
+
+<span class="k">if</span> <span class="o">(</span><span class="n">ref</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
+<span class="o">{</span>
+    <span class="n">LoggerAdmin</span> <span class="n">loggerAdmin</span> <span class="o">=</span> <span class="o">(</span><span class="n">LoggerAdmin</span><span class="o">)</span> <span class="n">context</span><span class="o">.</span><span class="na">getService</span><span class="o">(</span><span class="n">ref</span><span class="o">);</span>
+
+    <span class="c1">// get the ROOT logger context</span>
+    <span class="n">LoggerContext</span> <span class="n">rootContext</span> <span class="o">=</span> <span class="n">loggerAdmin</span><span class="o">.</span><span class="na">getLoggerContext</span><span class="o">(</span><span class="kc">null</span><span class="o">);</span>
+
+    <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">LogLevel</span><span class="o">&gt;</span> <span class="n">levels</span> <span class="o">=</span> <span class="n">rootContext</span><span class="o">.</span><span class="na">getLogLevels</span><span class="o">();</span>
+    <span class="c1">// adjust the levels</span>
+    <span class="n">rootContext</span><span class="o">.</span><span class="na">setLogLevels</span><span class="o">(</span><span class="n">levels</span><span class="o">);</span>
+
+    <span class="c1">// get the levels for a bundle (felix scr in this case)</span>
+    <span class="n">LoggerContext</span> <span class="n">scrContext</span> <span class="o">=</span> <span class="n">loggerAdmin</span><span class="o">.</span><span class="na">getLoggerContext</span><span class="o">(</span>
+        <span class="s">&quot;org.apache.felix.scr&quot;</span><span class="o">);</span>
+
+    <span class="c1">// set all of scr to DEBUG mode</span>
+    <span class="n">scrContext</span><span class="o">.</span><span class="na">setLogLevels</span><span class="o">(</span>
+        <span class="n">Collections</span><span class="o">.</span><span class="na">singletonMap</span><span class="o">(</span>
+            <span class="n">Logger</span><span class="o">.</span><span class="na">ROOT_LOGGER_NAME</span><span class="o">,</span> <span class="n">LogLevel</span><span class="o">.</span><span class="na">DEBUG</span><span class="o">));</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>Likewise logging configuration can be handled through <strong>Configuration Admin</strong>. Following the previous example of configuring <strong>Felix SCR</strong> for <code>DEBUG</code>  mode:</p>
+<ul>
+<li>create a configuration object whose PID is <em><code>org.osgi.service.log.admin|org.apache.felix.scr</code></em></li>
+<li>set the property <code>ROOT</code> in the configuration to <code>DEBUG</code>
+  e.g. <code>ROOT=DEBUG</code></li>
+</ul>
+<h2 id="accessing-the-log-service-legacy">Accessing the log service (legacy)<a class="headerlink" href="#accessing-the-log-service-legacy" title="Permanent link">&para;</a></h2>
+<p>To access a <code>LogService</code> instance it is necessary to look it up in the OSGi service registry as demonstrated in the following code snippet:</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Activator</span> <span class="kd">implements</span> <span class="n">BundleActivator</span>
+<span class="o">{</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">start</span><span class="o">(</span><span class="n">BundleContext</span> <span class="n">context</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> 
+    <span class="o">{</span>   
+        <span class="n">ServiceReference</span> <span class="n">ref</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getServiceReference</span><span class="o">(</span><span class="n">LogService</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">());</span>
+        <span class="k">if</span> <span class="o">(</span><span class="n">ref</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
+        <span class="o">{</span>
+            <span class="n">LogService</span> <span class="n">log</span> <span class="o">=</span> <span class="o">(</span><span class="n">LogService</span><span class="o">)</span> <span class="n">context</span><span class="o">.</span><span class="na">getService</span><span class="o">(</span><span class="n">ref</span><span class="o">);</span>
+
+            <span class="c1">// Use the log...</span>
+        <span class="o">}</span>
+    <span class="o">}</span>
 
-    <span class="o">//</span><span class="p">..</span>
+    <span class="c1">//..</span>
 </pre></div>
 
 
-<p>It is possible, and advisable, to use more sophisticated service acquisition mechanisms like a Service Tracker, Dynamic Services or iPOJO.</p>
-<h2 id="using-the-log-service">Using the log service<a class="headerlink" href="#using-the-log-service" title="Permanent link">&para;</a></h2>
+<p>It is possible, and advisable, to use more sophisticated service acquisition mechanisms like a Service Tracker, Declarative Services or iPOJO.</p>
+<h2 id="using-the-log-service-legacy">Using the log service (legacy)<a class="headerlink" href="#using-the-log-service-legacy" title="Permanent link">&para;</a></h2>
 <p>The <code>LogService</code> interface provides four methods for logging:</p>
-<div class="codehilite"><pre><span class="n">public</span> <span class="n">interface</span> <span class="n">LogService</span>
-<span class="p">{</span>
-    <span class="o">//</span><span class="p">..</span>
-
-    <span class="o">//</span> <span class="n">Log</span> <span class="n">a</span> <span class="n">message</span> <span class="n">specifying</span> <span class="n">a</span> <span class="nb">log</span> <span class="n">level</span>
-    <span class="n">public</span> <span class="nb">log</span><span class="p">(</span><span class="n">int</span> <span class="n">level</span><span class="p">,</span> <span class="n">java</span><span class="p">.</span><span class="n">lang</span><span class="p">.</span><span class="n">String</span> <span class="n">message</span><span class="p">)</span>
-
-    <span class="o">//</span> <span class="n">Log</span> <span class="n">an</span> <span class="n">exception</span>
-    <span class="n">public</span> <span class="nb">log</span><span class="p">(</span><span class="n">int</span> <span class="n">level</span><span class="p">,</span> <span class="n">java</span><span class="p">.</span><span class="n">lang</span><span class="p">.</span><span class="n">String</span> <span class="n">message</span><span class="p">,</span> <span class="n">java</span><span class="p">.</span><span class="n">lang</span><span class="p">.</span><span class="n">Throwable</span> <span class="n">exception</span><span class="p">)</span>
-
-    <span class="o">//</span> <span class="n">Log</span> <span class="n">a</span> <span class="n">message</span> <span class="n">specifying</span> <span class="n">the</span> <span class="n">ServiceReference</span> <span class="n">that</span> <span class="n">generated</span> <span class="n">it</span>
-    <span class="n">public</span> <span class="nb">log</span><span class="p">(</span><span class="n">ServiceReference</span> <span class="n">sr</span><span class="p">,</span> <span class="n">int</span> <span class="n">level</span><span class="p">,</span> <span class="n">java</span><span class="p">.</span><span class="n">lang</span><span class="p">.</span><span class="n">String</span> <span class="n">message</span><span class="p">)</span>
-
-    <span class="o">//</span> <span class="n">Log</span> <span class="n">a</span> <span class="n">message</span> <span class="n">specifying</span> <span class="n">the</span> <span class="n">ServiceReference</span> <span class="n">and</span> <span class="n">exception</span>
-    <span class="n">public</span> <span class="nb">log</span><span class="p">(</span><span class="n">ServiceReference</span> <span class="n">sr</span><span class="p">,</span> <span class="n">int</span> <span class="n">level</span><span class="p">,</span> <span class="n">java</span><span class="p">.</span><span class="n">lang</span><span class="p">.</span><span class="n">String</span> <span class="n">message</span><span class="p">,</span> <span class="n">java</span><span class="p">.</span><span class="n">lang</span><span class="p">.</span><span class="n">Throwable</span> <span class="n">exception</span><span class="p">)</span>  
-<span class="p">}</span>
+<div class="codehilite"><pre><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">LogService</span>
+<span class="o">{</span>
+    <span class="c1">//..</span>
+
+    <span class="c1">// Log a message specifying a log level</span>
+    <span class="kd">public</span> <span class="nf">log</span><span class="o">(</span><span class="kt">int</span> <span class="n">level</span><span class="o">,</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">String</span> <span class="n">message</span><span class="o">)</span>
+
+    <span class="c1">// Log an exception</span>
+    <span class="kd">public</span> <span class="nf">log</span><span class="o">(</span><span class="kt">int</span> <span class="n">level</span><span class="o">,</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">String</span> <span class="n">message</span><span class="o">,</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Throwable</span> <span class="n">exception</span><span class="o">)</span>
+
+    <span class="c1">// Log a message specifying the ServiceReference that generated it</span>
+    <span class="kd">public</span> <span class="nf">log</span><span class="o">(</span><span class="n">ServiceReference</span> <span class="n">sr</span><span class="o">,</span> <span class="kt">int</span> <span class="n">level</span><span class="o">,</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">String</span> <span class="n">message</span><span class="o">)</span>
+
+    <span class="c1">// Log a message specifying the ServiceReference and exception</span>
+    <span class="kd">public</span> <span class="nf">log</span><span class="o">(</span><span class="n">ServiceReference</span> <span class="n">sr</span><span class="o">,</span> <span class="kt">int</span> <span class="n">level</span><span class="o">,</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">String</span> <span class="n">message</span><span class="o">,</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Throwable</span> <span class="n">exception</span><span class="o">)</span>  
+<span class="o">}</span>
 </pre></div>
 
 
@@ -146,35 +225,35 @@ h2:hover > .headerlink, h3:hover > .head
 </ul>
 <h2 id="retrieving-log-entries">Retrieving log entries<a class="headerlink" href="#retrieving-log-entries" title="Permanent link">&para;</a></h2>
 <p>The <code>LogReaderService</code> provides a <code>getLog()</code> method to retrieve an <code>Enumeration</code> of the latest log entries. The following code snippets demonstrates how to retrieve it from the service registry and use it:</p>
-<div class="codehilite"><pre><span class="n">ServiceReference</span> <span class="n">ref</span> <span class="p">=</span> <span class="n">context</span><span class="p">.</span><span class="n">getServiceReference</span><span class="p">(</span><span class="n">LogReaderService</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">getName</span><span class="p">());</span>
-<span class="k">if</span> <span class="p">(</span><span class="n">ref</span> !<span class="p">=</span> <span class="n">null</span><span class="p">)</span>
-<span class="p">{</span>
-    <span class="n">LogReaderService</span> <span class="n">reader</span> <span class="p">=</span> <span class="p">(</span><span class="n">LogReaderService</span><span class="p">)</span> <span class="n">context</span><span class="p">.</span><span class="n">getService</span><span class="p">(</span><span class="n">ref</span><span class="p">);</span>   
-    <span class="n">Enumeration</span><span class="o">&lt;</span><span class="n">LogEntry</span><span class="o">&gt;</span> <span class="n">latestLogs</span> <span class="p">=</span> <span class="n">reader</span><span class="p">.</span><span class="n">getLog</span><span class="p">();</span>
-<span class="p">}</span>
+<div class="codehilite"><pre><span class="n">ServiceReference</span> <span class="n">ref</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getServiceReference</span><span class="o">(</span><span class="n">LogReaderService</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">());</span>
+<span class="k">if</span> <span class="o">(</span><span class="n">ref</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
+<span class="o">{</span>
+    <span class="n">LogReaderService</span> <span class="n">reader</span> <span class="o">=</span> <span class="o">(</span><span class="n">LogReaderService</span><span class="o">)</span> <span class="n">context</span><span class="o">.</span><span class="na">getService</span><span class="o">(</span><span class="n">ref</span><span class="o">);</span>   
+    <span class="n">Enumeration</span><span class="o">&lt;</span><span class="n">LogEntry</span><span class="o">&gt;</span> <span class="n">latestLogs</span> <span class="o">=</span> <span class="n">reader</span><span class="o">.</span><span class="na">getLog</span><span class="o">();</span>
+<span class="o">}</span>
 </pre></div>
 
 
 <h2 id="creating-and-registering-a-loglistener">Creating and registering a <code>LogListener</code><a class="headerlink" href="#creating-and-registering-a-loglistener" title="Permanent link">&para;</a></h2>
 <p>The Log Service specification doesn't define any particular entity to store, display, or write log entries; it's up to the developer to implement this functionality or to choose an available implementation capable of doing that. To create such a bundle, the first step is to create an implementation of the <code>LogListener</code> interface. The following code shows a simple implementation that echoes the log message:</p>
-<div class="codehilite"><pre><span class="n">public</span> <span class="n">class</span> <span class="n">LogWriter</span> <span class="n">implements</span> <span class="n">LogListener</span>
-<span class="p">{</span>
-    <span class="o">//</span> <span class="n">Invoked</span> <span class="n">by</span> <span class="n">the</span> <span class="nb">log</span> <span class="n">service</span> <span class="n">implementation</span> <span class="k">for</span> <span class="n">each</span> <span class="nb">log</span> <span class="n">entry</span>
-    <span class="n">public</span> <span class="n">void</span> <span class="n">logged</span><span class="p">(</span><span class="n">LogEntry</span> <span class="n">entry</span><span class="p">)</span> 
-    <span class="p">{</span>
-        <span class="n">System</span><span class="p">.</span><span class="n">out</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">entry</span><span class="p">.</span><span class="n">getMessage</span><span class="p">());</span>
-    <span class="p">}</span>
-<span class="p">}</span>
+<div class="codehilite"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">LogWriter</span> <span class="kd">implements</span> <span class="n">LogListener</span>
+<span class="o">{</span>
+    <span class="c1">// Invoked by the log service implementation for each log entry</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">logged</span><span class="o">(</span><span class="n">LogEntry</span> <span class="n">entry</span><span class="o">)</span> 
+    <span class="o">{</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">entry</span><span class="o">.</span><span class="na">getMessage</span><span class="o">());</span>
+    <span class="o">}</span>
+<span class="o">}</span>
 </pre></div>
 
 
 <p>The only method to implement is <code>logged()</code> method, which is called every time a log entry is created in the associated logging service. A <code>LogListener</code> implementation must be registered with the <code>LogReaderService</code> so it can start receiving log entries, as demonstrated in the following code snippet:</p>
-<div class="codehilite"><pre><span class="n">ServiceReference</span> <span class="n">ref</span> <span class="p">=</span> <span class="n">context</span><span class="p">.</span><span class="n">getServiceReference</span><span class="p">(</span><span class="n">LogReaderService</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">getName</span><span class="p">());</span>
-<span class="k">if</span> <span class="p">(</span><span class="n">ref</span> !<span class="p">=</span> <span class="n">null</span><span class="p">)</span>
-<span class="p">{</span>
-    <span class="n">LogReaderService</span> <span class="n">reader</span> <span class="p">=</span> <span class="p">(</span><span class="n">LogReaderService</span><span class="p">)</span> <span class="n">context</span><span class="p">.</span><span class="n">getService</span><span class="p">(</span><span class="n">ref</span><span class="p">);</span>
-    <span class="n">reader</span><span class="p">.</span><span class="n">addLogListener</span><span class="p">(</span><span class="n">new</span> <span class="n">LogWriter</span><span class="p">());</span>
-<span class="p">}</span>
+<div class="codehilite"><pre><span class="n">ServiceReference</span> <span class="n">ref</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getServiceReference</span><span class="o">(</span><span class="n">LogReaderService</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">());</span>
+<span class="k">if</span> <span class="o">(</span><span class="n">ref</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
+<span class="o">{</span>
+    <span class="n">LogReaderService</span> <span class="n">reader</span> <span class="o">=</span> <span class="o">(</span><span class="n">LogReaderService</span><span class="o">)</span> <span class="n">context</span><span class="o">.</span><span class="na">getService</span><span class="o">(</span><span class="n">ref</span><span class="o">);</span>
+    <span class="n">reader</span><span class="o">.</span><span class="na">addLogListener</span><span class="o">(</span><span class="k">new</span> <span class="n">LogWriter</span><span class="o">());</span>
+<span class="o">}</span>
 </pre></div>
 
 
@@ -199,10 +278,15 @@ h2:hover > .headerlink, h3:hover > .head
 <td>false</td>
 <td>Determines whether or not debug messages will be stored in the history</td>
 </tr>
+<tr>
+<td><code>org.osgi.service.log.admin.loglevel</code></td>
+<td><code>WARN</code></td>
+<td>The default log level of the root Logger Context</td>
+</tr>
 </tbody>
 </table>
       <div class="timestamp" style="margin-top: 30px; font-size: 80%; text-align: right;">
-        Rev. 1712598 by cziegeler on Wed, 4 Nov 2015 17:48:20 +0000
+        Rev. 1835843 by rotty3000 on Fri, 13 Jul 2018 14:37:22 +0000
       </div>
       <div class="trademarkFooter"> 
         Apache Felix, Felix, Apache, the Apache feather logo, and the Apache Felix project