You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2012/04/04 15:06:32 UTC

svn commit: r1309363 [1/2] - in /karaf/trunk: ./ assemblies/features/standard/src/main/feature/ log/ log/command/ log/command/src/main/java/org/apache/karaf/log/ log/command/src/main/java/org/apache/karaf/log/command/ log/command/src/main/java/org/apac...

Author: cschneider
Date: Wed Apr  4 13:06:29 2012
New Revision: 1309363

URL: http://svn.apache.org/viewvc?rev=1309363&view=rev
Log:
KARAF-963 Log modules refactored

Added:
    karaf/trunk/log/   (with props)
    karaf/trunk/log/command/
      - copied from r1309258, karaf/trunk/shell/log/
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/
      - copied from r1309258, karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/
    karaf/trunk/log/command/src/test/java/org/apache/karaf/log/
    karaf/trunk/log/command/src/test/java/org/apache/karaf/log/command/
      - copied from r1309258, karaf/trunk/shell/log/src/test/java/org/apache/karaf/shell/log/
    karaf/trunk/log/core/
      - copied from r1309258, karaf/trunk/management/mbeans/log/
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/
      - copied from r1309258, karaf/trunk/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/Level.java
      - copied, changed from r1309258, karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/Level.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogEventFormatter.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogService.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/Log.java
      - copied, changed from r1309258, karaf/trunk/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/internal/LogMBeanImpl.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LogEventFormatterImpl.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LruList.java
      - copied, changed from r1309258, karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/
      - copied from r1309258, karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/layout/
    karaf/trunk/log/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
      - copied, changed from r1309258, karaf/trunk/management/mbeans/log/src/main/resources/OSGI-INF/blueprint/log-management.xml
    karaf/trunk/log/core/src/test/
    karaf/trunk/log/core/src/test/java/
    karaf/trunk/log/core/src/test/java/org/
    karaf/trunk/log/core/src/test/java/org/apache/
    karaf/trunk/log/core/src/test/java/org/apache/karaf/
    karaf/trunk/log/core/src/test/java/org/apache/karaf/log/
    karaf/trunk/log/core/src/test/java/org/apache/karaf/log/core/
    karaf/trunk/log/core/src/test/java/org/apache/karaf/log/core/internal/
    karaf/trunk/log/core/src/test/java/org/apache/karaf/log/core/internal/SetLogLevelTest.java
      - copied, changed from r1309258, karaf/trunk/shell/log/src/test/java/org/apache/karaf/shell/log/SetLogLevelTest.java
    karaf/trunk/log/pom.xml
Removed:
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/Level.java
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LruList.java
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/VmLogAppender.java
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/layout/
    karaf/trunk/log/command/src/main/java/org/apache/karaf/shell/
    karaf/trunk/log/command/src/test/java/org/apache/karaf/log/command/SetLogLevelTest.java
    karaf/trunk/log/command/src/test/java/org/apache/karaf/shell/
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LogMBeanImpl.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/management/
    karaf/trunk/log/core/src/main/resources/OSGI-INF/blueprint/log-management.xml
    karaf/trunk/management/mbeans/log/
    karaf/trunk/shell/log/
Modified:
    karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml
    karaf/trunk/log/command/pom.xml
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/ClearLog.java
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/DisplayException.java
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/DisplayLog.java
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/GetLogLevel.java
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/SetLogLevel.java
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/completers/LogLevelCompleter.java
    karaf/trunk/log/command/src/main/resources/OSGI-INF/blueprint/shell-log.xml
    karaf/trunk/log/command/src/test/java/org/apache/karaf/log/command/completers/LogLevelCompleterTest.java
    karaf/trunk/log/core/pom.xml
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogMBean.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/AbsoluteTimeDateFormat.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/DateTimeDateFormat.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/FormattingInfo.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/ISO8601DateFormat.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/PatternConverter.java
    karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/PatternParser.java
    karaf/trunk/management/mbeans/pom.xml
    karaf/trunk/pom.xml
    karaf/trunk/shell/pom.xml

Modified: karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml
URL: http://svn.apache.org/viewvc/karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml?rev=1309363&r1=1309362&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml (original)
+++ karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml Wed Apr  4 13:06:29 2012
@@ -32,8 +32,8 @@
         <bundle start-level="30">mvn:org.apache.karaf.diagnostic/org.apache.karaf.diagnostic.common/${project.version}</bundle>
         <bundle start-level="30">mvn:org.apache.karaf.diagnostic/org.apache.karaf.diagnostic.command/${project.version}</bundle>
         <bundle start-level="30">mvn:org.apache.karaf.diagnostic/org.apache.karaf.diagnostic.management/${project.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.log/${project.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.log/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.log/org.apache.karaf.log.core/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.log/org.apache.karaf.log.command/${project.version}</bundle>
         <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.dev/${project.version}</bundle>
         <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.dev/${project.version}</bundle>
         <bundle start-level="30">mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.command/${project.version}</bundle>

Propchange: karaf/trunk/log/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Apr  4 13:06:29 2012
@@ -0,0 +1 @@
+target

Modified: karaf/trunk/log/command/pom.xml
URL: http://svn.apache.org/viewvc/karaf/trunk/log/command/pom.xml?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/command/pom.xml (original)
+++ karaf/trunk/log/command/pom.xml Wed Apr  4 13:06:29 2012
@@ -22,16 +22,16 @@
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
-        <groupId>org.apache.karaf.shell</groupId>
-        <artifactId>shell</artifactId>
+        <groupId>org.apache.karaf.log</groupId>
+        <artifactId>log</artifactId>
         <version>3.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>org.apache.karaf.shell.log</artifactId>
+    <artifactId>org.apache.karaf.log.command</artifactId>
     <packaging>bundle</packaging>
-    <name>Apache Karaf :: Shell :: Log Commands</name>
-    <description>This bundle provides Karaf shell commands to manipulate Log service.</description>
+    <name>Apache Karaf :: Log :: Command</name>
+    <description>Shell commands to manipulate Log service</description>
 
     <properties>
         <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
@@ -39,6 +39,10 @@
 
     <dependencies>
         <dependency>
+            <groupId>org.apache.karaf.log</groupId>
+            <artifactId>org.apache.karaf.log.core</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.karaf.shell</groupId>
             <artifactId>org.apache.karaf.shell.console</artifactId>
         </dependency>
@@ -89,16 +93,9 @@
                 <configuration>
                     <instructions>
                         <Import-Package>
-                            !${project.artifactId}*,
-                            org.apache.aries.blueprint,
-                            org.osgi.service.blueprint.container,
-                            org.osgi.service.blueprint.reflect,
-                            org.apache.felix.service.command,
-                            org.apache.karaf.shell.commands,
-                            org.apache.karaf.shell.console,
                             *
                         </Import-Package>
-                        <Private-Package>!*</Private-Package>
+                        <Private-Package>org.apache.karaf.log.command*</Private-Package>
                     </instructions>
                 </configuration>
             </plugin>

Modified: karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/ClearLog.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/ClearLog.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/ClearLog.java (original)
+++ karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/ClearLog.java Wed Apr  4 13:06:29 2012
@@ -14,8 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log;
+package org.apache.karaf.log.command;
 
+import org.apache.karaf.log.core.LogService;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 
@@ -25,18 +26,14 @@ import org.apache.karaf.shell.console.Os
 @Command(scope = "log", name = "clear", description = "Clear log entries.")
 public class ClearLog extends OsgiCommandSupport {
 
-    protected LruList events;
-   
-    public LruList getEvents() {
-        return events;
-    }
-
-    public void setEvents(LruList events) {
-        this.events = events;
+    protected LogService logService;
+    
+    public ClearLog(LogService logService) {
+        this.logService = logService;
     }
-
+   
     protected Object doExecute() throws Exception {
-        events.clear();
+        logService.clearEvents();
         return null;
     }
 

Modified: karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/DisplayException.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/DisplayException.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/DisplayException.java (original)
+++ karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/DisplayException.java Wed Apr  4 13:06:29 2012
@@ -14,46 +14,27 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log;
+package org.apache.karaf.log.command;
 
+import org.apache.karaf.log.core.LogService;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
-import org.ops4j.pax.logging.spi.PaxLoggingEvent;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
 
 @Command(scope = "log", name = "exception-display", description = "Displays the last occurred exception from the log.")
 public class DisplayException extends OsgiCommandSupport {
 
     @Argument(index = 0, name = "logger", description = "The name of the logger. This can be ROOT, ALL, or the name of a logger specified in the org.ops4j.pax.logger.cfg file.", required = false, multiValued = false)
     String logger;
+    private final LogService logService;
     
-    protected LruList events;
-
-    public LruList getEvents() {
-        return events;
+    public DisplayException(LogService logService) {
+        this.logService = logService;
     }
-
-    public void setEvents(LruList events) {
-        this.events = events;
-    }
-
+    
     protected Object doExecute() throws Exception {
-        PaxLoggingEvent throwableEvent = null;
-        Iterable<PaxLoggingEvent> le = events.getElements(Integer.MAX_VALUE);
-        for (PaxLoggingEvent event : le) {
-        	// if this is an exception, and the log is the same as the requested log,
-        	// then save this exception and continue iterating from oldest to newest
-            if ((event.getThrowableStrRep() != null)
-            		&&(logger != null)
-            		&&(checkIfFromRequestedLog(event))) {
-                throwableEvent = event;
-              // Do not break, as we iterate from the oldest to the newest event
-            } else if ((event.getThrowableStrRep() != null)&&(logger == null)) {
-            	// now check if there has been no log passed in, and if this is an exception
-                // then save this exception and continue iterating from oldest to newest
-                throwableEvent = event;            	
-            }
-        }
+        PaxLoggingEvent throwableEvent = logService.getLastException(logger);
         if (throwableEvent != null) {
             for (String r : throwableEvent.getThrowableStrRep()) {
                 System.out.println(r);
@@ -63,8 +44,6 @@ public class DisplayException extends Os
         return null;
     }
         
-    protected boolean checkIfFromRequestedLog(PaxLoggingEvent event) {
-    	return (event.getLoggerName().lastIndexOf(logger)>=0) ? true : false;
-    }
+
 
 }

Modified: karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/DisplayLog.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/DisplayLog.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/DisplayLog.java (original)
+++ karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/DisplayLog.java Wed Apr  4 13:06:29 2012
@@ -14,15 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log;
+package org.apache.karaf.log.command;
 
 import java.io.PrintStream;
 
+import org.apache.karaf.log.core.LogEventFormatter;
+import org.apache.karaf.log.core.LogService;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
-import org.apache.karaf.shell.log.layout.PatternConverter;
-import org.apache.karaf.shell.log.layout.PatternParser;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.ops4j.pax.logging.spi.PaxLoggingEvent;
 
@@ -44,102 +44,22 @@ public class DisplayLog extends OsgiComm
     @Argument(index = 0, name = "logger", description = "The name of the logger. This can be ROOT, ALL, or the name of a logger specified in the org.ops4j.pax.logger.cfg file.", required = false, multiValued = false)
     String logger;
 
-    protected String pattern;
-    protected LruList events;
-    protected String fatalColor;
-    protected String errorColor;
-    protected String warnColor;
-    protected String infoColor;
-    protected String debugColor;
-    protected String traceColor;
-
-    private static final String FATAL = "fatal";
-    private static final String ERROR = "error";
-    private static final String WARN = "warn";
-    private static final String INFO = "info";
-    private static final String DEBUG = "debug";
-    private static final String TRACE = "trace";
-
-    private static final char FIRST_ESC_CHAR = 27;
-	private static final char SECOND_ESC_CHAR = '[';
-    private static final char COMMAND_CHAR = 'm';
+    protected final LogService logService;
 
-    public LruList getEvents() {
-        return events;
-    }
-
-    public void setEvents(LruList events) {
-        this.events = events;
-    }
-
-    public String getPattern() {
-        return pattern;
-    }
-
-    public void setPattern(String pattern) {
-        this.pattern = pattern;
-    }
-
-    public String getFatalColor() {
-        return fatalColor;
-    }
-
-    public void setFatalColor(String fatalColor) {
-        this.fatalColor = fatalColor;
-    }
-
-    public String getErrorColor() {
-        return errorColor;
-    }
-
-    public void setErrorColor(String errorColor) {
-        this.errorColor = errorColor;
-    }
-
-    public String getWarnColor() {
-        return warnColor;
-    }
-
-    public void setWarnColor(String warnColor) {
-        this.warnColor = warnColor;
-    }
-
-    public String getInfoColor() {
-        return infoColor;
-    }
-
-    public void setInfoColor(String infoColor) {
-        this.infoColor = infoColor;
-    }
-
-    public String getDebugColor() {
-        return debugColor;
-    }
-
-    public void setDebugColor(String debugColor) {
-        this.debugColor = debugColor;
-    }
-
-    public String getTraceColor() {
-        return traceColor;
-    }
-
-    public void setTraceColor(String traceColor) {
-        this.traceColor = traceColor;
+    protected final LogEventFormatter formatter;
+    
+    public DisplayLog(LogService logService, LogEventFormatter formatter) {
+        this.logService = logService;
+        this.formatter = formatter;
     }
 
     protected Object doExecute() throws Exception {
-        final PatternConverter cnv = new PatternParser(overridenPattern != null ? overridenPattern : pattern).parse();
+        
         final PrintStream out = System.out;
 
-        Iterable<PaxLoggingEvent> le = events.getElements(entries == 0 ? Integer.MAX_VALUE : entries);
+        Iterable<PaxLoggingEvent> le = logService.getEvents(entries == 0 ? Integer.MAX_VALUE : entries);
         for (PaxLoggingEvent event : le) {
-			if ((logger != null) && (event != null)
-					&& (checkIfFromRequestedLog(event))) {
-				display(cnv, event, out);
-			} else if ((event != null) && (logger == null)) {
-				display(cnv, event, out);
-			}
+            printEvent(out, event);
         }
         out.println();
         return null;
@@ -149,55 +69,14 @@ public class DisplayLog extends OsgiComm
     	return (event.getLoggerName().lastIndexOf(logger)>=0) ? true : false;
     }
 
-    protected void display(PatternConverter cnv, PaxLoggingEvent event, PrintStream stream) {
-        String color = getColor(event);
-        StringBuffer sb = new StringBuffer();
-        sb.setLength(0);
-        if (color != null) {
-            sb.append(FIRST_ESC_CHAR);
-            sb.append(SECOND_ESC_CHAR);
-            sb.append(color);
-            sb.append(COMMAND_CHAR);
-        }
-        for (PatternConverter pc = cnv; pc != null; pc = pc.next) {
-            pc.format(sb, event);
-        }
-        if (event.getThrowableStrRep() != null) {
-            for (String r : event.getThrowableStrRep()) {
-                sb.append(r).append('\n');
-            }
-        }
-        if (color != null) {
-            sb.append(FIRST_ESC_CHAR);
-            sb.append(SECOND_ESC_CHAR);
-            sb.append("0");
-            sb.append(COMMAND_CHAR);
-        }
-        stream.print(sb.toString());
-    }
-
-    private String getColor(PaxLoggingEvent event) {
-        String color = null;
-        if (!noColor) {
-            String lvl = event.getLevel().toString().toLowerCase();
-            if (FATAL.equals(lvl)) {
-                color = fatalColor;
-            } else if (ERROR.equals(lvl)) {
-                color = errorColor;
-            } else if (WARN.equals(lvl)) {
-                color = warnColor;
-            } else if (INFO.equals(lvl)) {
-                color = infoColor;
-            } else if (DEBUG.equals(lvl)) {
-                color = debugColor;
-            } else if (TRACE.equals(lvl)) {
-                color = traceColor;
-            }
-            if (color != null && color.length() == 0) {
-                color = null;
+    protected void printEvent(final PrintStream out, PaxLoggingEvent event) {
+        if ((logger != null) && 
+            (event != null)&&
+            (checkIfFromRequestedLog(event))) {
+                out.append(formatter.format(event, overridenPattern, noColor));
             }
+            else if ((event != null)&&(logger == null)){
+                out.append(formatter.format(event, overridenPattern, noColor));
         }
-        return color;
     }
-
 }

Modified: karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/GetLogLevel.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/GetLogLevel.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/GetLogLevel.java (original)
+++ karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/GetLogLevel.java Wed Apr  4 13:06:29 2012
@@ -14,18 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log;
-
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.Map;
-import java.util.TreeMap;
+package org.apache.karaf.log.command;
 
+import org.apache.karaf.log.core.LogService;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 
 /**
@@ -37,83 +30,15 @@ public class GetLogLevel extends OsgiCom
     @Argument(index = 0, name = "logger", description = "The name of the logger, ALL or ROOT (default)", required = false, multiValued = false)
     String logger;
 
-    static final String CONFIGURATION_PID  = "org.ops4j.pax.logging";
-    static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger";
-    static final String LOGGER_PREFIX      = "log4j.logger.";
-    static final String ALL_LOGGER         = "ALL";
-    static final String ROOT_LOGGER        = "ROOT";
+    private final LogService logService;
+    
+    public GetLogLevel(LogService logService) {
+        this.logService = logService;
+    }
 
     protected Object doExecute() throws Exception {
-        ConfigurationAdmin cfgAdmin = getConfigAdmin();
-        Configuration cfg = cfgAdmin.getConfiguration(CONFIGURATION_PID, null);
-        Dictionary props = cfg.getProperties();
-
-        if (ROOT_LOGGER.equalsIgnoreCase(this.logger)) {
-            this.logger = null;
-        }
-        if (ALL_LOGGER.equalsIgnoreCase(logger)) {
-            String root = getLevel((String) props.get(ROOT_LOGGER_PREFIX));
-            Map<String, String> loggers = new TreeMap<String, String>();
-            for (Enumeration e = props.keys(); e.hasMoreElements();) {
-                String prop = (String) e.nextElement();
-                if (prop.startsWith(LOGGER_PREFIX)) {
-                    String val = getLevel((String) props.get(prop));
-                    loggers.put(prop.substring(LOGGER_PREFIX.length()), val);
-                }
-            }
-            System.out.println("ROOT: " + root);
-            for (String logger : loggers.keySet()) {
-                System.out.println(logger + ": " + loggers.get(logger));
-            }
-        } else {
-            String logger = this.logger;
-            String val;
-            for (;;) {
-                String prop;
-                if (logger == null) {
-                    prop = ROOT_LOGGER_PREFIX;
-                } else {
-                    prop = LOGGER_PREFIX + logger;
-                }
-                val = (String) props.get(prop);
-                val = getLevel(val);
-                if (val != null || logger == null) {
-                    break;
-                }
-                int idx = logger.lastIndexOf('.');
-                if (idx < 0) {
-                    logger = null;
-                } else {
-                    logger = logger.substring(0, idx);
-                }
-            }
-            String st = "Level: " + val;
-            if (logger != this.logger) {
-                st += " (inherited from " + (logger != null ? logger : "ROOT") + ")";
-            }
-            System.out.println(st);
-        }
+        System.out.println(logService.getLevelSt(logger));
         return null;
     }
 
-    protected String getLevel(String prop) {
-        if (prop == null) {
-            return null;
-        } else {
-            String val = prop.trim();
-            int idx = val.indexOf(",");
-            if (idx == 0) {
-                val = null;
-            } else if (idx > 0) {
-                val = val.substring(0, idx);
-            }
-            return val;
-        }
-    }
-
-    protected ConfigurationAdmin getConfigAdmin() {
-        ServiceReference ref = getBundleContext().getServiceReference(ConfigurationAdmin.class.getName());
-        return getService(ConfigurationAdmin.class, ref);
-    }
-
 }

Modified: karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java (original)
+++ karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java Wed Apr  4 13:06:29 2012
@@ -14,35 +14,31 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log;
+package org.apache.karaf.log.command;
 
 import java.io.PrintStream;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 
+import org.apache.karaf.log.core.LogEventFormatter;
+import org.apache.karaf.log.core.LogService;
 import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.log.layout.PatternConverter;
-import org.apache.karaf.shell.log.layout.PatternParser;
 import org.ops4j.pax.logging.spi.PaxAppender;
 import org.ops4j.pax.logging.spi.PaxLoggingEvent;
 
 @Command(scope = "log", name = "tail", description = "Continuously display log entries.")
 public class LogTail extends DisplayLog {
 	
+    public LogTail(LogService logService, LogEventFormatter formatter) {
+        super(logService, formatter);
+    }
+
     protected Object doExecute() throws Exception {
-        final PatternConverter cnv = new PatternParser(overridenPattern != null ? overridenPattern : pattern).parse();
         final PrintStream out = System.out;
 
-        Iterable<PaxLoggingEvent> le = events.getElements(entries == 0 ? Integer.MAX_VALUE : entries);
+        Iterable<PaxLoggingEvent> le = this.logService.getEvents(entries == 0 ? Integer.MAX_VALUE : entries);
         for (PaxLoggingEvent event : le) {
-            if ((logger != null) && 
-                (event != null)&&
-                (checkIfFromRequestedLog(event))) {
-                    display(cnv, event, out);
-                }
-                else if ((event != null)&&(logger == null)){
-                    display(cnv, event, out);      
-            }
+            printEvent(out, event);
         }
         // Tail
         final BlockingQueue<PaxLoggingEvent> queue = new LinkedBlockingQueue<PaxLoggingEvent>();
@@ -52,22 +48,15 @@ public class LogTail extends DisplayLog 
             }
         };
         try {
-            events.addAppender(appender);
+            logService.addAppender(appender);
             for (;;) {
             	PaxLoggingEvent event = queue.take();
-                if ((logger != null) && 
-                     (event != null)&&
-                     (checkIfFromRequestedLog(event))) {
-                            display(cnv, event, out);
-                    }
-                else if ((event != null)&&(logger == null)){
-                            display(cnv, event, out);      
-                    }
+            	printEvent(out, event);
             }
         } catch (InterruptedException e) {
             // Ignore
         } finally {
-            events.removeAppender(appender);
+            logService.removeAppender(appender);
         }
         out.println();
         return null;

Modified: karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/SetLogLevel.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/SetLogLevel.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/SetLogLevel.java (original)
+++ karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/SetLogLevel.java Wed Apr  4 13:06:29 2012
@@ -14,17 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log;
-
-import java.io.IOException;
-import java.util.Dictionary;
+package org.apache.karaf.log.command;
 
+import org.apache.karaf.log.core.LogService;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
 
 /**
  * Set the log level for a given logger
@@ -38,88 +33,15 @@ public class SetLogLevel extends OsgiCom
     @Argument(index = 1, name = "logger", description = "Logger name or ROOT (default)", required = false, multiValued = false)
     String logger;
 
-    static final String CONFIGURATION_PID  = "org.ops4j.pax.logging";
-    static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger";
-    static final String LOGGER_PREFIX      = "log4j.logger.";
-    static final String ROOT_LOGGER        = "ROOT";
-
-    protected Object doExecute() throws Exception {
-        if (ROOT_LOGGER.equalsIgnoreCase(this.logger)) {
-            this.logger = null;
-        }
-        
-        // make sure both uppercase and lowercase levels are supported
-        level = level.toUpperCase();
-
-
-
-        try {
-            Level.valueOf(level);
-        } catch (IllegalArgumentException e) {
-            System.err.println("level must be set to TRACE, DEBUG, INFO, WARN or ERROR (or DEFAULT to unset it)");
-            return null;
-        }
-        
-        if (Level.isDefault(level) && logger == null) {
-            System.err.println("Can not unset the ROOT logger");
-            return null;
-        }
-
-        Configuration cfg = getConfiguration();
-        Dictionary props = cfg.getProperties();
-
-        String logger = this.logger;
-        String val;
-        String prop;
-        if (logger == null) {
-            prop = ROOT_LOGGER_PREFIX;
-        } else {
-            prop = LOGGER_PREFIX + logger;
-        }
-        val = (String) props.get(prop);
-        if (Level.isDefault(level)) {
-            if (val != null) {
-                val = val.trim();
-                int idx = val.indexOf(",");
-                if (idx < 0) {
-                    val = null;
-                } else {
-                    val = val.substring(idx);
-                }
-            }
-        } else {
-            if (val == null) {
-                val = level;
-            } else {
-                val = val.trim();
-                int idx = val.indexOf(",");
-                if (idx < 0) {
-                    val = level;
-                } else {
-                    val = level + val.substring(idx);
-                }
-            }
-        }
-        if (val == null) {
-            props.remove(prop);
-        } else {
-            props.put(prop, val);
-        }
-        cfg.update(props);
-
-        return null;
-    }
-    
+    private LogService logService;
     
-
-    protected Configuration getConfiguration() throws IOException {
-        Configuration cfg = getConfigAdmin().getConfiguration(CONFIGURATION_PID, null);
-        return cfg;
+    public SetLogLevel(LogService logService) {
+        this.logService = logService;
     }
 
-    protected ConfigurationAdmin getConfigAdmin() {
-        ServiceReference ref = getBundleContext().getServiceReference(ConfigurationAdmin.class.getName());
-        return getService(ConfigurationAdmin.class, ref);
+    protected Object doExecute() throws Exception {
+        logService.setLevelSt(logger, level);
+        return null;
     }
 
 }

Modified: karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/completers/LogLevelCompleter.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/completers/LogLevelCompleter.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/completers/LogLevelCompleter.java (original)
+++ karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/completers/LogLevelCompleter.java Wed Apr  4 13:06:29 2012
@@ -14,13 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log.completers;
+package org.apache.karaf.log.command.completers;
 
 import java.util.List;
 
+import org.apache.karaf.log.core.Level;
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
-import org.apache.karaf.shell.log.Level;
 
 /**
  * {@link Completer} implementation for completing log levels  
@@ -31,8 +31,8 @@ public class LogLevelCompleter extends S
         super(Level.strings());
     }
     
-    @Override @SuppressWarnings("unchecked")
-    public int complete(String buffer, int cursor, List candidates) {
+    @Override
+    public int complete(String buffer, int cursor, @SuppressWarnings("rawtypes") List candidates) {
         if (buffer == null) {
             return super.complete(null, cursor, candidates);
         } else {

Modified: karaf/trunk/log/command/src/main/resources/OSGI-INF/blueprint/shell-log.xml
URL: http://svn.apache.org/viewvc/karaf/trunk/log/command/src/main/resources/OSGI-INF/blueprint/shell-log.xml?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/command/src/main/resources/OSGI-INF/blueprint/shell-log.xml (original)
+++ karaf/trunk/log/command/src/main/resources/OSGI-INF/blueprint/shell-log.xml Wed Apr  4 13:06:29 2012
@@ -21,82 +21,48 @@
            xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
            default-activation="lazy">
 
-    <!-- TODO: use dynamic CM config -->
-
-    <cm:property-placeholder persistent-id="org.apache.karaf.log" update-strategy="reload">
-        <cm:default-properties>
-            <cm:property name="size" value="500"/>
-            <cm:property name="pattern" value="%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n"/>
-            <cm:property name="fatalColor" value="31"/>
-            <cm:property name="errorColor" value="31"/>
-            <cm:property name="warnColor" value="35"/>
-            <cm:property name="infoColor" value="36"/>
-            <cm:property name="debugColor" value="39"/>
-            <cm:property name="traceColor" value="39"/>
-        </cm:default-properties>
-    </cm:property-placeholder>
-
     <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
         <command>
-            <action class="org.apache.karaf.shell.log.DisplayLog">
-                <property name="events" ref="events"/>
-                <property name="pattern" value="${pattern}"/>
-                <property name="fatalColor" value="${fatalColor}"/>
-                <property name="errorColor" value="${errorColor}"/>
-                <property name="warnColor" value="${warnColor}"/>
-                <property name="infoColor" value="${infoColor}"/>
-                <property name="debugColor" value="${debugColor}"/>
-                <property name="traceColor" value="${traceColor}"/>
+            <action class="org.apache.karaf.log.command.DisplayLog">
+                <argument ref="logService" />
+                <argument ref="formatter"/>
             </action>
         </command>
         <command>
-            <action class="org.apache.karaf.shell.log.DisplayException">
-                <property name="events" ref="events"/>
+            <action class="org.apache.karaf.log.command.DisplayException">
+                <argument ref="logService" />
             </action>
         </command>
         <command>
-            <action class="org.apache.karaf.shell.log.ClearLog">
-                <property name="events" ref="events"/>
+            <action class="org.apache.karaf.log.command.ClearLog">
+                <argument ref="logService" />
             </action>
         </command>
         <command>
-            <action class="org.apache.karaf.shell.log.GetLogLevel" />
+            <action class="org.apache.karaf.log.command.GetLogLevel">
+                <argument ref="logService" />
+            </action>
         </command>
         <command>
-            <action class="org.apache.karaf.shell.log.SetLogLevel" />
+            <action class="org.apache.karaf.log.command.SetLogLevel" >
+                <argument ref="logService" />
+            </action>
             <completers>
             	<ref component-id="logLevelCompleter"/>
             	<null/>
             </completers>
         </command>
         <command>
-            <action class="org.apache.karaf.shell.log.LogTail">
-                <property name="events" ref="events"/>
-                <property name="pattern" value="${pattern}"/>
-                <property name="fatalColor" value="${fatalColor}"/>
-                <property name="errorColor" value="${errorColor}"/>
-                <property name="warnColor" value="${warnColor}"/>
-                <property name="infoColor" value="${infoColor}"/>
-                <property name="debugColor" value="${debugColor}"/>
-                <property name="traceColor" value="${traceColor}"/>
+            <action class="org.apache.karaf.log.command.LogTail">
+                <argument ref="logService" />
+                <argument ref="formatter"/>                
             </action>
         </command>
     </command-bundle>
-
-    <bean id="vmLogAppender" class="org.apache.karaf.shell.log.VmLogAppender">
-        <property name="events" ref="events"/>
-    </bean>
-
-    <bean id="events" class="org.apache.karaf.shell.log.LruList">
-        <argument value="${size}"/>
-    </bean>
     
-    <bean id="logLevelCompleter" class="org.apache.karaf.shell.log.completers.LogLevelCompleter"/>
+    <reference id="formatter" interface="org.apache.karaf.log.core.LogEventFormatter"/>
+    <reference id="logService" interface="org.apache.karaf.log.core.LogService"/>
 
-    <service ref="vmLogAppender" interface="org.ops4j.pax.logging.spi.PaxAppender">
-        <service-properties>
-                <entry key="org.ops4j.pax.logging.appender.name" value="VmLogAppender"/>
-        </service-properties>
-    </service>
+    <bean id="logLevelCompleter" class="org.apache.karaf.log.command.completers.LogLevelCompleter"/>
 
 </blueprint>

Modified: karaf/trunk/log/command/src/test/java/org/apache/karaf/log/command/completers/LogLevelCompleterTest.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/command/src/test/java/org/apache/karaf/log/command/completers/LogLevelCompleterTest.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/command/src/test/java/org/apache/karaf/log/command/completers/LogLevelCompleterTest.java (original)
+++ karaf/trunk/log/command/src/test/java/org/apache/karaf/log/command/completers/LogLevelCompleterTest.java Wed Apr  4 13:06:29 2012
@@ -14,15 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log.completers;
+package org.apache.karaf.log.command.completers;
 
 import java.util.LinkedList;
 import java.util.List;
 
-import org.apache.karaf.shell.log.Level;
-
 import junit.framework.TestCase;
 
+import org.apache.karaf.log.core.Level;
+
 /**
  * Test cases for {@link LogLevelCompleter}
  */

Modified: karaf/trunk/log/core/pom.xml
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/pom.xml?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/core/pom.xml (original)
+++ karaf/trunk/log/core/pom.xml Wed Apr  4 13:06:29 2012
@@ -22,16 +22,16 @@
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
-        <groupId>org.apache.karaf.management.mbeans</groupId>
-        <artifactId>mbeans</artifactId>
+        <groupId>org.apache.karaf.log</groupId>
+        <artifactId>log</artifactId>
         <version>3.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>org.apache.karaf.management.mbeans.log</artifactId>
+    <artifactId>org.apache.karaf.log.core</artifactId>
     <packaging>bundle</packaging>
-    <name>Apache Karaf :: Management :: MBeans :: Log</name>
-    <description>The log mbean bundle provides a Log JMX MBean which allow you to manipulate the Karaf log layer.</description>
+    <name>Apache Karaf :: Log :: Core</name>
+    <description>Core Seervices and JMX MBean to manipulate the Karaf log layer</description>
 
     <properties>
         <appendedResourcesDirectory>${basedir}/../../../etc/appended-resources/</appendedResourcesDirectory>
@@ -84,21 +84,11 @@
                 <configuration>
                     <instructions>
                         <Export-Package>
-                            org.apache.karaf.management.mbeans.log;version=${project.version}
+                            org.apache.karaf.log.core
                         </Export-Package>
-                        <Import-Package>
-                            !org.apache.karaf.management.mbeans.log,
-                            javax.management,
-                            javax.management.loading,
-                            org.apache.karaf.management;version=${project.version},
-                            org.apache.aries.blueprint,
-                            org.osgi.service.blueprint.container,
-                            org.osgi.service.blueprint.reflect,
-                            *
-                        </Import-Package>
                         <Private-Package>
-                            org.apache.karaf.management.mbeans.log.internal,
-                            !*
+                            org.apache.karaf.log.core.internal,
+                            org.apache.karaf.log.core.internal.layout
                         </Private-Package>
                     </instructions>
                 </configuration>

Copied: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/Level.java (from r1309258, karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/Level.java)
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/Level.java?p2=karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/Level.java&p1=karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/Level.java&r1=1309258&r2=1309363&rev=1309363&view=diff
==============================================================================
--- karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/Level.java (original)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/Level.java Wed Apr  4 13:06:29 2012
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log;
+package org.apache.karaf.log.core;
 
 /**
  * Enumeration of available log levels for the log:set command and

Added: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogEventFormatter.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogEventFormatter.java?rev=1309363&view=auto
==============================================================================
--- karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogEventFormatter.java (added)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogEventFormatter.java Wed Apr  4 13:06:29 2012
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.log.core;
+
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+
+public interface LogEventFormatter {
+
+    public abstract String format(PaxLoggingEvent event, String overridenPattern, boolean noColor);
+
+}

Modified: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogMBean.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogMBean.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogMBean.java (original)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogMBean.java Wed Apr  4 13:06:29 2012
@@ -14,19 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.management.mbeans.log;
+package org.apache.karaf.log.core;
 
-import java.util.List;
 
 /**
  * Log MBean.
  */
 public interface LogMBean {
 
-    String getLevel() throws Exception;
-    String getLevel(String logger) throws Exception;
+    String getLevel();
+    String getLevel(String logger);
 
-    void setLevel(String level) throws Exception;
-    void setLevel(String level, String logger) throws Exception;
+    void setLevel(String level);
+    void setLevel(String logger, String level);
 
 }

Added: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogService.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogService.java?rev=1309363&view=auto
==============================================================================
--- karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogService.java (added)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/LogService.java Wed Apr  4 13:06:29 2012
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.log.core;
+
+import org.ops4j.pax.logging.spi.PaxAppender;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+
+public interface LogService {
+    Level getLevel();
+    void setLevel(Level level);
+    Level getLevel(String logger);
+    void setLevel(String logger, Level level);
+    
+    String getLevelSt();
+    String getLevelSt(String logger);
+
+    void setLevelSt(String level);
+    void setLevelSt(String logger, String level);
+    
+    void clearEvents();
+    Iterable<PaxLoggingEvent> getEvents();
+    Iterable<PaxLoggingEvent> getEvents(int maxNum);
+    PaxLoggingEvent getLastException(String logger);
+    void addAppender(PaxAppender appender);
+    void removeAppender(PaxAppender appender);
+}

Copied: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/Log.java (from r1309258, karaf/trunk/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/internal/LogMBeanImpl.java)
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/Log.java?p2=karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/Log.java&p1=karaf/trunk/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/internal/LogMBeanImpl.java&r1=1309258&r2=1309363&rev=1309363&view=diff
==============================================================================
--- karaf/trunk/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/internal/LogMBeanImpl.java (original)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/Log.java Wed Apr  4 13:06:29 2012
@@ -14,180 +14,44 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.management.mbeans.log.internal;
-
-import org.apache.karaf.management.mbeans.log.LogMBean;
-import org.ops4j.pax.logging.spi.PaxLoggingEvent;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
+package org.apache.karaf.log.core.internal;
 
 import javax.management.NotCompliantMBeanException;
 import javax.management.StandardMBean;
-import java.io.IOException;
-import java.util.*;
+
+import org.apache.karaf.log.core.LogMBean;
+import org.apache.karaf.log.core.LogService;
 
 /**
  * Implementation of the Log MBean.
  */
-public class LogMBeanImpl extends StandardMBean implements LogMBean {
+public class Log extends StandardMBean implements LogMBean {
 
-    static final String CONFIGURATION_PID = "org.ops4j.pax.logging";
-    static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger";
-    static final String LOGGER_PREFIX = "log4j.logger.";
-    static final String ROOT_LOGGER = "ROOT";
-    private BundleContext bundleContext;
+    private final LogService logService;
 
-    public LogMBeanImpl() throws NotCompliantMBeanException {
+    public Log(LogService logService) throws NotCompliantMBeanException {
         super(LogMBean.class);
+        this.logService = logService;
     }
 
-    public String getLevel() throws Exception {
-        return getLevel(null);
-    }
-
-    public String getLevel(String logger) throws Exception {
-        ConfigurationAdmin cfgAdmin = getConfigAdmin();
-        Configuration cfg = cfgAdmin.getConfiguration(CONFIGURATION_PID, null);
-        Dictionary props = cfg.getProperties();
-
-        if (ROOT_LOGGER.equalsIgnoreCase(logger)) {
-            logger = null;
-        }
-
-        String val;
-        for (; ; ) {
-            String prop;
-            if (logger == null) {
-                prop = ROOT_LOGGER_PREFIX;
-            } else {
-                prop = LOGGER_PREFIX + logger;
-            }
-            val = (String) props.get(prop);
-            val = getLevelFromProperty(val);
-            if (val != null || logger == null) {
-                break;
-            }
-            int idx = logger.lastIndexOf('.');
-            if (idx < 0) {
-                logger = null;
-            } else {
-                logger = logger.substring(0, idx);
-            }
-        }
-        String st = "Level: " + val;
-        return st;
-    }
-
-    public void setLevel(String level) throws Exception {
-        setLevel(level, null);
-    }
-
-    public void setLevel(String level, String logger) throws Exception {
-        if (ROOT_LOGGER.equalsIgnoreCase(logger)) {
-            logger = null;
-        }
-
-        // make sure both uppercase and lowercase levels are supported
-        level = level.toUpperCase();
-
-        if (!level.equals("TRACE") && !level.equals("DEBUG") && !level.equals("INFO")
-                && !level.equals("WARN") && !level.equals("ERROR") && !level.equals("DEFAULT")) {
-            throw new IllegalArgumentException("level must be set to TRACE, DEBUG, INFO, WARN or ERROR (or DEFAULT to unset it)");
-        }
-
-        Configuration cfg = getConfiguration();
-        Dictionary props = cfg.getProperties();
-
-        String val;
-        String prop;
-        if (logger == null) {
-            prop = ROOT_LOGGER_PREFIX;
-        } else {
-            prop = LOGGER_PREFIX + logger;
-        }
-        val = (String) props.get(prop);
-        if (level.equals("DEFAULT")) {
-            if (val != null) {
-                val = val.trim();
-                int idx = val.indexOf(",");
-                if (idx < 0) {
-                    val = null;
-                } else {
-                    val = val.substring(idx);
-                }
-            }
-        } else {
-            if (val == null) {
-                val = level;
-            } else {
-                val = val.trim();
-                int idx = val.indexOf(",");
-                if (idx < 0) {
-                    val = level;
-                } else {
-                    val = level + val.substring(idx);
-                }
-            }
-        }
-        if (val == null) {
-            props.remove(prop);
-        } else {
-            props.put(prop, val);
-        }
-        cfg.update(props);
-    }
-
-    private boolean checkIfFromRequestedLog(PaxLoggingEvent event, String logger) {
-        return (event.getLoggerName().lastIndexOf(logger) >= 0) ? true : false;
-    }
-
-    private String render(PaxLoggingEvent event) {
-        StringBuffer sb = new StringBuffer();
-        sb.setLength(0);
-        if (event.getThrowableStrRep() != null) {
-            for (String r : event.getThrowableStrRep()) {
-                sb.append(r).append('\n');
-            }
-        }
-        return sb.toString();
-    }
-
-    private String getLevelFromProperty(String prop) {
-        if (prop == null) {
-            return null;
-        } else {
-            String val = prop.trim();
-            int idx = val.indexOf(",");
-            if (idx == 0) {
-                val = null;
-            } else if (idx > 0) {
-                val = val.substring(0, idx);
-            }
-            return val;
-        }
-    }
-
-    public BundleContext getBundleContext() {
-        return this.bundleContext;
+    @Override
+    public String getLevel() {
+        return logService.getLevelSt();
     }
 
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
+    @Override
+    public String getLevel(String logger) {
+        return logService.getLevelSt(logger);
     }
 
-    protected Configuration getConfiguration() throws IOException {
-        Configuration cfg = getConfigAdmin().getConfiguration(CONFIGURATION_PID, null);
-        return cfg;
+    @Override
+    public void setLevel(String level) {
+        this.logService.setLevelSt(level);
     }
 
-    protected ConfigurationAdmin getConfigAdmin() {
-        ServiceReference ref = bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
-        if (ref != null) {
-            return (ConfigurationAdmin) bundleContext.getService(ref);
-        }
-        return null;
+    @Override
+    public void setLevel(String logger, String level) {
+        this.logService.setLevelSt(logger, level);
     }
 
 }

Added: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LogEventFormatterImpl.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LogEventFormatterImpl.java?rev=1309363&view=auto
==============================================================================
--- karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LogEventFormatterImpl.java (added)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LogEventFormatterImpl.java Wed Apr  4 13:06:29 2012
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.log.core.internal;
+
+import org.apache.karaf.log.core.LogEventFormatter;
+import org.apache.karaf.log.core.internal.layout.PatternConverter;
+import org.apache.karaf.log.core.internal.layout.PatternParser;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+
+public class LogEventFormatterImpl implements LogEventFormatter {
+
+    protected String pattern;
+    protected String fatalColor;
+    protected String errorColor;
+    protected String warnColor;
+    protected String infoColor;
+    protected String debugColor;
+    protected String traceColor;
+
+    private static final String FATAL = "fatal";
+    private static final String ERROR = "error";
+    private static final String WARN = "warn";
+    private static final String INFO = "info";
+    private static final String DEBUG = "debug";
+    private static final String TRACE = "trace";
+
+    private static final char FIRST_ESC_CHAR = 27;
+    private static final char SECOND_ESC_CHAR = '[';
+    private static final char COMMAND_CHAR = 'm';
+
+    public String getPattern() {
+        return pattern;
+    }
+
+    public void setPattern(String pattern) {
+        this.pattern = pattern;
+    }
+
+    public String getFatalColor() {
+        return fatalColor;
+    }
+
+    public void setFatalColor(String fatalColor) {
+        this.fatalColor = fatalColor;
+    }
+
+    public String getErrorColor() {
+        return errorColor;
+    }
+
+    public void setErrorColor(String errorColor) {
+        this.errorColor = errorColor;
+    }
+
+    public String getWarnColor() {
+        return warnColor;
+    }
+
+    public void setWarnColor(String warnColor) {
+        this.warnColor = warnColor;
+    }
+
+    public String getInfoColor() {
+        return infoColor;
+    }
+
+    public void setInfoColor(String infoColor) {
+        this.infoColor = infoColor;
+    }
+
+    public String getDebugColor() {
+        return debugColor;
+    }
+
+    public void setDebugColor(String debugColor) {
+        this.debugColor = debugColor;
+    }
+
+    public String getTraceColor() {
+        return traceColor;
+    }
+
+    public void setTraceColor(String traceColor) {
+        this.traceColor = traceColor;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.karaf.log.core.internal.LogEventFormatter#format(org.ops4j.pax.logging.spi.PaxLoggingEvent, java.lang.String, boolean)
+     */
+    @Override
+    public String format(PaxLoggingEvent event, String overridenPattern, boolean noColor) {
+        final PatternConverter cnv = new PatternParser(overridenPattern != null ? overridenPattern : pattern).parse();
+        String color = getColor(event, noColor);
+        StringBuffer sb = new StringBuffer();
+        sb.setLength(0);
+        if (color != null) {
+            sb.append(FIRST_ESC_CHAR);
+            sb.append(SECOND_ESC_CHAR);
+            sb.append(color);
+            sb.append(COMMAND_CHAR);
+        }
+        for (PatternConverter pc = cnv; pc != null; pc = pc.next) {
+            pc.format(sb, event);
+        }
+        if (event.getThrowableStrRep() != null) {
+            for (String r : event.getThrowableStrRep()) {
+                sb.append(r).append('\n');
+            }
+        }
+        if (color != null) {
+            sb.append(FIRST_ESC_CHAR);
+            sb.append(SECOND_ESC_CHAR);
+            sb.append("0");
+            sb.append(COMMAND_CHAR);
+        }
+        return sb.toString();
+    }
+
+    private String getColor(PaxLoggingEvent event, boolean noColor) {
+        String color = null;
+        if (!noColor) {
+            String lvl = event.getLevel().toString().toLowerCase();
+            if (FATAL.equals(lvl)) {
+                color = fatalColor;
+            } else if (ERROR.equals(lvl)) {
+                color = errorColor;
+            } else if (WARN.equals(lvl)) {
+                color = warnColor;
+            } else if (INFO.equals(lvl)) {
+                color = infoColor;
+            } else if (DEBUG.equals(lvl)) {
+                color = debugColor;
+            } else if (TRACE.equals(lvl)) {
+                color = traceColor;
+            }
+            if (color != null && color.length() == 0) {
+                color = null;
+            }
+        }
+        return color;
+    }
+
+}

Added: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java?rev=1309363&view=auto
==============================================================================
--- karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java (added)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java Wed Apr  4 13:06:29 2012
@@ -0,0 +1,250 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.log.core.internal;
+
+import java.io.IOException;
+import java.util.Dictionary;
+
+import org.apache.karaf.log.core.Level;
+import org.apache.karaf.log.core.LogService;
+import org.ops4j.pax.logging.spi.PaxAppender;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+public class LogServiceImpl implements LogService {
+    static final String CONFIGURATION_PID = "org.ops4j.pax.logging";
+    static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger";
+    static final String LOGGER_PREFIX = "log4j.logger.";
+    static final String ROOT_LOGGER = "ROOT";
+    
+    private final ConfigurationAdmin configAdmin;
+    private final LruList events;
+
+    public LogServiceImpl(ConfigurationAdmin configAdmin, LruList events) {
+        this.configAdmin = configAdmin;
+        this.events = events;
+    }
+
+    public Level getLevel() {
+        return getLevel(null);
+    }
+
+    public Level getLevel(String logger) {
+        Configuration cfg;
+        try {
+            cfg = configAdmin.getConfiguration(CONFIGURATION_PID, null);
+        } catch (IOException e) {
+            throw new RuntimeException("Error retrieving Log information from config admin", e);
+        }
+        @SuppressWarnings("rawtypes")
+        Dictionary props = cfg.getProperties();
+
+        if (ROOT_LOGGER.equalsIgnoreCase(logger)) {
+            logger = null;
+        }
+
+        String val;
+        for (; ; ) {
+            String prop;
+            if (logger == null) {
+                prop = ROOT_LOGGER_PREFIX;
+            } else {
+                prop = LOGGER_PREFIX + logger;
+            }
+            val = (String) props.get(prop);
+            val = getLevelFromProperty(val);
+            if (val != null || logger == null) {
+                break;
+            }
+            int idx = logger.lastIndexOf('.');
+            if (idx < 0) {
+                logger = null;
+            } else {
+                logger = logger.substring(0, idx);
+            }
+        }
+        return Level.valueOf(val);
+    }
+
+    public void setLevel(Level level) {
+        setLevel(null, level);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void setLevel(String logger, Level logLevel) {
+        if (ROOT_LOGGER.equalsIgnoreCase(logger)) {
+            logger = null;
+        }
+        
+        if (logLevel == Level.DEFAULT && logger == null) {
+            throw new RuntimeException("Can not unset the ROOT logger");
+        }
+
+        Configuration cfg = getConfiguration();
+        @SuppressWarnings("rawtypes")
+        Dictionary props = cfg.getProperties();
+        
+        String level = logLevel.toString();
+
+        String val;
+        String prop;
+        if (logger == null) {
+            prop = ROOT_LOGGER_PREFIX;
+        } else {
+            prop = LOGGER_PREFIX + logger;
+        }
+        val = (String) props.get(prop);
+        if (level.equals("DEFAULT")) {
+            if (val != null) {
+                val = val.trim();
+                int idx = val.indexOf(",");
+                if (idx < 0) {
+                    val = null;
+                } else {
+                    val = val.substring(idx);
+                }
+            }
+        } else {
+            if (val == null) {
+                val = level;
+            } else {
+                val = val.trim();
+                int idx = val.indexOf(",");
+                if (idx < 0) {
+                    val = level;
+                } else {
+                    val = level + val.substring(idx);
+                }
+            }
+        }
+        if (val == null) {
+            props.remove(prop);
+        } else {
+            props.put(prop, val);
+        }
+        try {
+            cfg.update(props);
+        } catch (IOException e) {
+            throw new RuntimeException("Error writing log config to config admin", e);
+        }
+    }
+
+    private boolean checkIfFromRequestedLog(PaxLoggingEvent event, String logger) {
+        return (event.getLoggerName().lastIndexOf(logger) >= 0) ? true : false;
+    }
+
+    private String getLevelFromProperty(String prop) {
+        if (prop == null) {
+            return null;
+        } else {
+            String val = prop.trim();
+            int idx = val.indexOf(",");
+            if (idx == 0) {
+                val = null;
+            } else if (idx > 0) {
+                val = val.substring(0, idx);
+            }
+            return val;
+        }
+    }
+
+    private Configuration getConfiguration() {
+        try {
+            return configAdmin.getConfiguration(CONFIGURATION_PID, null);
+        } catch (IOException e) {
+            throw new RuntimeException("Error retrieving Log information from config admin", e);
+        }
+    }
+
+    @Override
+    public Iterable<PaxLoggingEvent> getEvents() {
+        return events.getElements();
+    }
+
+    @Override
+    public Iterable<PaxLoggingEvent> getEvents(int maxNum) {
+        return events.getElements(maxNum);
+    }
+
+    @Override
+    public void clearEvents() {
+        events.clear();
+    }
+    
+    @Override
+    public PaxLoggingEvent getLastException(String logger) {
+        PaxLoggingEvent throwableEvent = null;
+        Iterable<PaxLoggingEvent> le = getEvents();
+        for (PaxLoggingEvent event : le) {
+            // if this is an exception, and the log is the same as the requested log,
+            // then save this exception and continue iterating from oldest to newest
+            if ((event.getThrowableStrRep() != null)
+                    &&(logger != null)
+                    &&(checkIfFromRequestedLog(event, logger))) {
+                throwableEvent = event;
+              // Do not break, as we iterate from the oldest to the newest event
+            } else if ((event.getThrowableStrRep() != null)&&(logger == null)) {
+                // now check if there has been no log passed in, and if this is an exception
+                // then save this exception and continue iterating from oldest to newest
+                throwableEvent = event;             
+            }
+        }
+
+        return throwableEvent;
+    }
+
+    @Override
+    public void addAppender(PaxAppender appender) {
+        events.addAppender(appender);
+    }
+
+    @Override
+    public void removeAppender(PaxAppender appender) {
+        events.removeAppender(appender);
+    }
+
+    @Override
+    public String getLevelSt() {
+        return getLevel().toString();
+    }
+
+    @Override
+    public String getLevelSt(String logger) {
+        return getLevel(logger).toString();
+    }
+
+    @Override
+    public void setLevelSt(String level) {
+        setLevel(convertToLevel(level));
+    }
+
+    @Override
+    public void setLevelSt(String logger, String level) {
+        setLevel(logger, convertToLevel(level));
+    }
+
+    public Level convertToLevel(String level) {
+        level = level.toUpperCase();
+        Level res = Level.valueOf(level);
+        if (res == null) {
+            throw new IllegalArgumentException("level must be set to TRACE, DEBUG, INFO, WARN or ERROR (or DEFAULT to unset it)");
+        }
+        return res;
+    }
+
+}

Copied: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LruList.java (from r1309258, karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java)
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LruList.java?p2=karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LruList.java&p1=karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java&r1=1309258&r2=1309363&rev=1309363&view=diff
==============================================================================
--- karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java (original)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/LruList.java Wed Apr  4 13:06:29 2012
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.karaf.shell.log;
+package org.apache.karaf.log.core.internal;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -28,7 +28,7 @@ import org.ops4j.pax.logging.spi.PaxLogg
 /**
  * A list that only keep the last N elements added
  */
-public class LruList {
+public class LruList implements PaxAppender {
 
     private PaxLoggingEvent[] elements;
     private transient int start = 0;
@@ -115,5 +115,10 @@ public class LruList {
     public synchronized void removeAppender(PaxAppender appender) {
         this.appenders.remove(appender);
     }
+    
+    public void doAppend(PaxLoggingEvent event) {
+        event.getProperties(); // ensure MDC properties are copied
+        add(event);
+    }
 
 }

Modified: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/AbsoluteTimeDateFormat.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/AbsoluteTimeDateFormat.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/AbsoluteTimeDateFormat.java (original)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/AbsoluteTimeDateFormat.java Wed Apr  4 13:06:29 2012
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log.layout;
+package org.apache.karaf.log.core.internal.layout;
 
 import java.text.DateFormat;
 import java.text.FieldPosition;

Modified: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/DateTimeDateFormat.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/DateTimeDateFormat.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/DateTimeDateFormat.java (original)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/DateTimeDateFormat.java Wed Apr  4 13:06:29 2012
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log.layout;
+package org.apache.karaf.log.core.internal.layout;
 
 import java.text.DateFormatSymbols;
 import java.text.FieldPosition;

Modified: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/FormattingInfo.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/FormattingInfo.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/FormattingInfo.java (original)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/FormattingInfo.java Wed Apr  4 13:06:29 2012
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log.layout;
+package org.apache.karaf.log.core.internal.layout;
 
 
 /**

Modified: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/ISO8601DateFormat.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/ISO8601DateFormat.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/ISO8601DateFormat.java (original)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/ISO8601DateFormat.java Wed Apr  4 13:06:29 2012
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log.layout;
+package org.apache.karaf.log.core.internal.layout;
 
 import java.text.FieldPosition;
 import java.text.ParsePosition;

Modified: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/PatternConverter.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/PatternConverter.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/PatternConverter.java (original)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/PatternConverter.java Wed Apr  4 13:06:29 2012
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log.layout;
+package org.apache.karaf.log.core.internal.layout;
 
 import org.ops4j.pax.logging.spi.PaxLoggingEvent;
 

Modified: karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/PatternParser.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/PatternParser.java?rev=1309363&r1=1309258&r2=1309363&view=diff
==============================================================================
--- karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/PatternParser.java (original)
+++ karaf/trunk/log/core/src/main/java/org/apache/karaf/log/core/internal/layout/PatternParser.java Wed Apr  4 13:06:29 2012
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.shell.log.layout;
+package org.apache.karaf.log.core.internal.layout;
 
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;

Copied: karaf/trunk/log/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml (from r1309258, karaf/trunk/management/mbeans/log/src/main/resources/OSGI-INF/blueprint/log-management.xml)
URL: http://svn.apache.org/viewvc/karaf/trunk/log/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml?p2=karaf/trunk/log/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml&p1=karaf/trunk/management/mbeans/log/src/main/resources/OSGI-INF/blueprint/log-management.xml&r1=1309258&r2=1309363&rev=1309363&view=diff
==============================================================================
--- karaf/trunk/management/mbeans/log/src/main/resources/OSGI-INF/blueprint/log-management.xml (original)
+++ karaf/trunk/log/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml Wed Apr  4 13:06:29 2012
@@ -12,25 +12,64 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
+    xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">
+
+    <ext:property-placeholder placeholder-prefix="$(" placeholder-suffix=")"/>
+
+    <cm:property-placeholder persistent-id="org.apache.karaf.log" update-strategy="reload">
+        <cm:default-properties>
+            <cm:property name="size" value="500"/>
+            <cm:property name="pattern" value="%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n"/>
+            <cm:property name="fatalColor" value="31"/>
+            <cm:property name="errorColor" value="31"/>
+            <cm:property name="warnColor" value="35"/>
+            <cm:property name="infoColor" value="36"/>
+            <cm:property name="debugColor" value="39"/>
+            <cm:property name="traceColor" value="39"/>
+        </cm:default-properties>
+    </cm:property-placeholder>
+    
+    <reference id="configAdmin" interface="org.osgi.service.cm.ConfigurationAdmin"/>
+    
+    <bean id="events" class="org.apache.karaf.log.core.internal.LruList">
+        <argument value="${size}"/>
+    </bean>
     
-    <!-- Reference to the MBean Server -->
-    <reference id="mbeanServer" interface="javax.management.MBeanServer">
-        <reference-listener ref="mbeanRegistrer" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer"/>
-    </reference>
+    <service ref="events" interface="org.ops4j.pax.logging.spi.PaxAppender">
+        <service-properties>
+                <entry key="org.ops4j.pax.logging.appender.name" value="VmLogAppender"/>
+        </service-properties>
+    </service>
+    
+    <bean id="logService" class="org.apache.karaf.log.core.internal.LogServiceImpl">
+        <argument ref="configAdmin"/>
+        <argument ref="events" />
+    </bean>
+    
+    <service ref="logService" interface="org.apache.karaf.log.core.LogService"/>
 
-    <!-- Log MBean -->
-    <bean id="logMBean" class="org.apache.karaf.management.mbeans.log.internal.LogMBeanImpl">
-        <property name="bundleContext" ref="blueprintBundleContext"/>
+    <bean id="logMBean" class="org.apache.karaf.log.core.internal.Log">
+        <argument ref="logService"/>
     </bean>
 
-    <!-- Register MBean in the MBean Server -->
-    <bean id="mbeanRegistrer" class="org.apache.karaf.management.MBeanRegistrer">
-        <property name="mbeans">
-            <map>
-                <entry value="org.apache.karaf:type=log,name=${karaf.name}" key-ref="logMBean"/>
-            </map>
-        </property>
+    <service ref="logMBean" auto-export="interfaces">
+        <service-properties>
+            <entry key="jmx.objectname" value="org.apache.karaf:type=log,name=$(karaf.name)"/>
+        </service-properties>
+    </service>
+    
+    <bean id="formatter" class="org.apache.karaf.log.core.internal.LogEventFormatterImpl">
+        <property name="pattern" value="${pattern}"/>
+        <property name="fatalColor" value="${fatalColor}"/>
+        <property name="errorColor" value="${errorColor}"/>
+        <property name="warnColor" value="${warnColor}"/>
+        <property name="infoColor" value="${infoColor}"/>
+        <property name="debugColor" value="${debugColor}"/>
+        <property name="traceColor" value="${traceColor}"/>
     </bean>
+    
+    <service ref="formatter" interface="org.apache.karaf.log.core.LogEventFormatter"/>
 
 </blueprint>
\ No newline at end of file