You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2016/01/13 12:20:41 UTC

[1/2] karaf git commit: [KARAF-4264] Upgrade to pax-web 6 (snapshot)

Repository: karaf
Updated Branches:
  refs/heads/master 68b95fb3d -> 39d2035b2


[KARAF-4264] Upgrade to pax-web 6 (snapshot)

Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/654cc14f
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/654cc14f
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/654cc14f

Branch: refs/heads/master
Commit: 654cc14f8df823a06ca6be58a468ba54b7f2ee34
Parents: 68b95fb
Author: Guillaume Nodet <gn...@apache.org>
Authored: Tue Jan 12 11:53:41 2016 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Wed Jan 13 12:04:13 2016 +0100

----------------------------------------------------------------------
 .../karaf/http/command/ServletListCommand.java  |  2 +-
 .../org/apache/karaf/http/core/ServletInfo.java | 10 ++++-----
 .../karaf/http/core/internal/HttpMBeanImpl.java |  2 +-
 .../http/core/internal/ServletServiceImpl.java  | 11 ++++------
 pom.xml                                         |  2 +-
 .../web/internal/WebContainerServiceImpl.java   | 22 ++++----------------
 .../karaf/web/internal/WebEventHandler.java     |  2 +-
 .../karaf/webconsole/http/HttpPlugin.java       | 14 +++++--------
 8 files changed, 22 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/654cc14f/http/src/main/java/org/apache/karaf/http/command/ServletListCommand.java
----------------------------------------------------------------------
diff --git a/http/src/main/java/org/apache/karaf/http/command/ServletListCommand.java b/http/src/main/java/org/apache/karaf/http/command/ServletListCommand.java
index 1932499..afbe003 100644
--- a/http/src/main/java/org/apache/karaf/http/command/ServletListCommand.java
+++ b/http/src/main/java/org/apache/karaf/http/command/ServletListCommand.java
@@ -49,7 +49,7 @@ public class ServletListCommand implements Action {
         table.column(new Col("Url"));
 
         for (ServletInfo info : servletService.getServlets()) {
-            table.addRow().addContent(info.getBundle().getBundleId(), info.getClassName(), info.getName(),
+            table.addRow().addContent(info.getBundleId(), info.getClassName(), info.getName(),
                                       info.getStateString(), info.getAlias(), Arrays.toString(info.getUrls()));
         }
         table.print(System.out, !noFormat);

http://git-wip-us.apache.org/repos/asf/karaf/blob/654cc14f/http/src/main/java/org/apache/karaf/http/core/ServletInfo.java
----------------------------------------------------------------------
diff --git a/http/src/main/java/org/apache/karaf/http/core/ServletInfo.java b/http/src/main/java/org/apache/karaf/http/core/ServletInfo.java
index 9fc83df..c2e2fa3 100644
--- a/http/src/main/java/org/apache/karaf/http/core/ServletInfo.java
+++ b/http/src/main/java/org/apache/karaf/http/core/ServletInfo.java
@@ -21,7 +21,7 @@ import org.osgi.framework.Bundle;
 
 public class ServletInfo {
     private String name;
-    private Bundle bundle;
+    private long bundleId;
     private String className;
     private String alias;
     private int state;
@@ -33,11 +33,11 @@ public class ServletInfo {
     public void setName(String name) {
         this.name = name;
     }
-    public Bundle getBundle() {
-        return bundle;
+    public long getBundleId() {
+        return bundleId;
     }
-    public void setBundle(Bundle bundle) {
-        this.bundle = bundle;
+    public void setBundleId(long bundleId) {
+        this.bundleId = bundleId;
     }
     public String getClassName() {
         return className;

http://git-wip-us.apache.org/repos/asf/karaf/blob/654cc14f/http/src/main/java/org/apache/karaf/http/core/internal/HttpMBeanImpl.java
----------------------------------------------------------------------
diff --git a/http/src/main/java/org/apache/karaf/http/core/internal/HttpMBeanImpl.java b/http/src/main/java/org/apache/karaf/http/core/internal/HttpMBeanImpl.java
index 563af61..f6c0ef5 100644
--- a/http/src/main/java/org/apache/karaf/http/core/internal/HttpMBeanImpl.java
+++ b/http/src/main/java/org/apache/karaf/http/core/internal/HttpMBeanImpl.java
@@ -59,7 +59,7 @@ public class HttpMBeanImpl extends StandardMBean implements HttpMBean {
             
                 CompositeData data = new CompositeDataSupport(servletType,
                         new String[]{"Bundle-ID", "Servlet", "Servlet Name", "State", "Alias", "URL"},
-                        new Object[]{info.getBundle().getBundleId(), info.getClassName(), info.getName(), info.getStateString(), info.getAlias(), Arrays.toString(info.getUrls())});
+                        new Object[]{info.getBundleId(), info.getClassName(), info.getName(), info.getStateString(), info.getAlias(), Arrays.toString(info.getUrls())});
                 table.put(data);
             
             }

http://git-wip-us.apache.org/repos/asf/karaf/blob/654cc14f/http/src/main/java/org/apache/karaf/http/core/internal/ServletServiceImpl.java
----------------------------------------------------------------------
diff --git a/http/src/main/java/org/apache/karaf/http/core/internal/ServletServiceImpl.java b/http/src/main/java/org/apache/karaf/http/core/internal/ServletServiceImpl.java
index 8733ae4..706c64b 100644
--- a/http/src/main/java/org/apache/karaf/http/core/internal/ServletServiceImpl.java
+++ b/http/src/main/java/org/apache/karaf/http/core/internal/ServletServiceImpl.java
@@ -38,12 +38,9 @@ public class ServletServiceImpl implements ServletService {
         List<ServletInfo> servletInfos = new ArrayList<ServletInfo>();
         Collection<ServletEvent> events = servletEventHandler.getServletEvents();
         for (ServletEvent event : events) {
-            Servlet servlet = event.getServlet();
-            String servletClassName = " ";
-            if (servlet != null) {
-                servletClassName = servlet.getClass().getName();
-                servletClassName = servletClassName.substring(servletClassName.lastIndexOf(".") + 1,
-                                                              servletClassName.length());
+            String servletClassName = event.getServletClassName();
+            if (servletClassName.contains(".")) {
+                servletClassName = servletClassName.substring(servletClassName.lastIndexOf(".") + 1, servletClassName.length());
             }
             String servletName = event.getServletName() != null ? event.getServletName() : " ";
             if (servletName.contains(".")) {
@@ -54,7 +51,7 @@ public class ServletServiceImpl implements ServletService {
 
             String[] urls = (String[])(event.getUrlParameter() != null ? event.getUrlParameter() : new String[] {""});
             ServletInfo info = new ServletInfo();
-            info.setBundle(event.getBundle());
+            info.setBundleId(event.getBundleId());
             info.setName(servletName);
             info.setClassName(servletClassName);
             info.setState(event.getType());

http://git-wip-us.apache.org/repos/asf/karaf/blob/654cc14f/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index f0bda12..66da129 100644
--- a/pom.xml
+++ b/pom.xml
@@ -261,7 +261,7 @@
         <pax.logging.version>1.8.5</pax.logging.version>
         <pax.base.version>1.5.0</pax.base.version>
         <pax.url.version>2.4.5</pax.url.version>
-        <pax.web.version>4.2.4</pax.web.version>
+        <pax.web.version>6.0.0-SNAPSHOT</pax.web.version>
         <pax.tinybundle.version>2.1.1</pax.tinybundle.version>
         <pax.jdbc.version>0.7.0</pax.jdbc.version>
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/654cc14f/web/src/main/java/org/apache/karaf/web/internal/WebContainerServiceImpl.java
----------------------------------------------------------------------
diff --git a/web/src/main/java/org/apache/karaf/web/internal/WebContainerServiceImpl.java b/web/src/main/java/org/apache/karaf/web/internal/WebContainerServiceImpl.java
index bab1bdd..d2e33b6 100644
--- a/web/src/main/java/org/apache/karaf/web/internal/WebContainerServiceImpl.java
+++ b/web/src/main/java/org/apache/karaf/web/internal/WebContainerServiceImpl.java
@@ -117,15 +117,8 @@ public class WebContainerServiceImpl implements WebContainerService, BundleListe
         if (bundleIds != null && !bundleIds.isEmpty()) {
             for (long bundleId : bundleIds) {
                 if (webEventHandler.getBundleEvents().containsKey(bundleId)) {
-                    WebEvent webEvent = webEventHandler.getBundleEvents().get(bundleId);
-                    Bundle bundle = webEvent.getBundle();
-                    if (bundle != null) {
-                        // deploy
-                        warManager.start(bundleId, null);
-                    } else {
-                        System.out.println("Bundle ID " + bundleId + " is invalid");
-                        LOGGER.warn("Bundle ID {} is invalid", bundleId);
-                    }
+                    // deploy
+                    warManager.start(bundleId, null);
                 }
             }
         }
@@ -135,15 +128,8 @@ public class WebContainerServiceImpl implements WebContainerService, BundleListe
         if (bundleIds != null && !bundleIds.isEmpty()) {
             for (long bundleId : bundleIds) {
                 if (webEventHandler.getBundleEvents().containsKey(bundleId)) {
-                    WebEvent webEvent = webEventHandler.getBundleEvents().get(bundleId);
-                    Bundle bundle = webEvent.getBundle();
-                    if (bundle != null) {
-                        // deploy
-                        warManager.stop(bundleId);
-                    } else {
-                        System.out.println("Bundle ID " + bundleId + " is invalid");
-                        LOGGER.warn("Bundle ID {} is invalid", bundleId);
-                    }
+                    // undeploy
+                    warManager.stop(bundleId);
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/karaf/blob/654cc14f/web/src/main/java/org/apache/karaf/web/internal/WebEventHandler.java
----------------------------------------------------------------------
diff --git a/web/src/main/java/org/apache/karaf/web/internal/WebEventHandler.java b/web/src/main/java/org/apache/karaf/web/internal/WebEventHandler.java
index 01ef52e..11ad198 100644
--- a/web/src/main/java/org/apache/karaf/web/internal/WebEventHandler.java
+++ b/web/src/main/java/org/apache/karaf/web/internal/WebEventHandler.java
@@ -34,7 +34,7 @@ public class WebEventHandler implements WebListener {
     }
 
     public void webEvent(WebEvent event) {
-        getBundleEvents().put(event.getBundle().getBundleId(), event);
+        getBundleEvents().put(event.getBundleId(), event);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/654cc14f/webconsole/http/src/main/java/org/apache/karaf/webconsole/http/HttpPlugin.java
----------------------------------------------------------------------
diff --git a/webconsole/http/src/main/java/org/apache/karaf/webconsole/http/HttpPlugin.java b/webconsole/http/src/main/java/org/apache/karaf/webconsole/http/HttpPlugin.java
index 9dae1bd..10deb36 100644
--- a/webconsole/http/src/main/java/org/apache/karaf/webconsole/http/HttpPlugin.java
+++ b/webconsole/http/src/main/java/org/apache/karaf/webconsole/http/HttpPlugin.java
@@ -208,12 +208,8 @@ public class HttpPlugin extends AbstractWebConsolePlugin {
         List<ServletDetails> result = new ArrayList<ServletDetails>(events.size());
 
         for (ServletEvent event : events) {
-            Servlet servlet = event.getServlet();
-            String servletClassName = " ";
-            if (servlet != null) {
-                servletClassName = servlet.getClass().getName();
-                servletClassName = servletClassName.substring(servletClassName.lastIndexOf(".") + 1, servletClassName.length());
-            }
+            String servletClassName = event.getServletClassName();
+            servletClassName = servletClassName.substring(servletClassName.lastIndexOf(".") + 1, servletClassName.length());
             String servletName = event.getServletName() != null ? event.getServletName() : " ";
             if (servletName.contains(".")) {
                 servletName = servletName.substring(servletName.lastIndexOf(".") + 1, servletName.length());
@@ -224,7 +220,7 @@ public class HttpPlugin extends AbstractWebConsolePlugin {
             String[] urls = (String[]) (event.getUrlParameter() != null ? event.getUrlParameter() : new String[]{""});
 
             ServletDetails details = new ServletDetails();
-            details.setId(event.getBundle().getBundleId());
+            details.setId(event.getBundleId());
             details.setAlias(alias);
             details.setServlet(servletClassName);
             details.setServletName(servletName);
@@ -243,9 +239,9 @@ public class HttpPlugin extends AbstractWebConsolePlugin {
         for (WebEvent event : bundleEvents.values()) {
 
             WebDetail webDetail = new WebDetail();
-            webDetail.setBundleId(event.getBundle().getBundleId());
+            webDetail.setBundleId(event.getBundleId());
             webDetail.setContextPath(event.getContextPath().trim().concat("/"));
-            int state = event.getBundle().getState();
+            int state = bundleContext.getBundle(event.getBundleId()).getState();
             String stateStr;
             if (state == Bundle.ACTIVE) {
                 stateStr = "Active";


[2/2] karaf git commit: [KARAF-4189] [KARAF-4190] Switch to log4j v2

Posted by gn...@apache.org.
[KARAF-4189] [KARAF-4190] Switch to log4j v2


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/39d2035b
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/39d2035b
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/39d2035b

Branch: refs/heads/master
Commit: 39d2035b2942dc5791a6e4c63fb969fa23e88636
Parents: 654cc14
Author: Guillaume Nodet <gn...@apache.org>
Authored: Wed Jan 13 12:00:44 2016 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Wed Jan 13 12:04:17 2016 +0100

----------------------------------------------------------------------
 .../resources/etc/org.ops4j.pax.logging.cfg     |  54 ++++---
 assemblies/features/framework/pom.xml           |   2 +-
 .../framework/src/main/feature/feature.xml      |   2 +-
 .../static/src/main/feature/features.xml        |   2 +-
 .../apache/karaf/bundle/command/LoadTest.java   |   2 +-
 .../webapp/WEB-INF/karaf/etc/startup.properties |   2 +-
 .../java/org/apache/karaf/itests/LogTest.java   |   4 +-
 .../resources/etc/org.ops4j.pax.logging.cfg     |  87 +++++++---
 log/pom.xml                                     |   2 +-
 .../org/apache/karaf/log/command/LoadTest.java  |  70 ++++++++
 .../karaf/log/core/internal/LogServiceImpl.java | 161 ++++---------------
 .../log/core/internal/LogServiceInternal.java   |  41 +++++
 .../log/core/internal/LogServiceLog4j1Impl.java | 141 ++++++++++++++++
 .../log/core/internal/LogServiceLog4j2Impl.java | 132 +++++++++++++++
 .../log/core/internal/SetLogLevelTest.java      |   2 +
 pom.xml                                         |  13 +-
 16 files changed, 528 insertions(+), 189 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/assemblies/features/base/src/main/resources/resources/etc/org.ops4j.pax.logging.cfg
----------------------------------------------------------------------
diff --git a/assemblies/features/base/src/main/resources/resources/etc/org.ops4j.pax.logging.cfg b/assemblies/features/base/src/main/resources/resources/etc/org.ops4j.pax.logging.cfg
index ca35d6d..f2d5ce0 100644
--- a/assemblies/features/base/src/main/resources/resources/etc/org.ops4j.pax.logging.cfg
+++ b/assemblies/features/base/src/main/resources/resources/etc/org.ops4j.pax.logging.cfg
@@ -17,31 +17,43 @@
 #
 ################################################################################
 
+# Common pattern layout for appenders
+log4j2.pattern = %d{ISO8601} | %-5p | %-16t | %-32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
+
 # Root logger
-log4j.rootLogger=INFO, out, osgi:*
-log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer
+log4j2.rootLogger.level = INFO
+# uncomment to use asynchronous loggers, which require mvn:com.lmax/disruptor/3.3.2 library
+#log4j2.rootLogger.type = asyncRoot
+#log4j2.rootLogger.includeLocation = false
+log4j2.rootLogger.appenderRefs = RollingFile, PaxOsgi
+log4j2.rootLogger.appenderRef.RollingFile.ref = RollingFile
+log4j2.rootLogger.appenderRef.PaxOsgi.ref = PaxOsgi
+
+# Appenders configuration
+log4j2.appenders = console, rolling, osgi
 
 # CONSOLE appender not used by default
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
+log4j2.appender.console.type = Console
+log4j2.appender.console.name = STDOUT
+log4j2.appender.console.layout.type = PatternLayout
+log4j2.appender.console.layout.pattern = ${log4j2.pattern}
 
 # File appender
-log4j.appender.out=org.apache.log4j.RollingFileAppender
-log4j.appender.out.layout=org.apache.log4j.PatternLayout
-log4j.appender.out.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
-log4j.appender.out.file=${karaf.data}/log/karaf.log
-log4j.appender.out.append=true
-log4j.appender.out.maxFileSize=1MB
-log4j.appender.out.maxBackupIndex=10
+log4j2.appender.rolling.type = RollingRandomAccessFile
+log4j2.appender.rolling.name = RollingFile
+log4j2.appender.rolling.fileName = ${karaf.data}/log/karaf.log
+log4j2.appender.rolling.filePattern = ${karaf.data}/log/karaf.log.%i
+# uncomment to not force a disk flush
+#log4j2.appender.rolling.immediateFlush = false
+log4j2.appender.rolling.append = false
+log4j2.appender.rolling.layout.type = PatternLayout
+log4j2.appender.rolling.layout.pattern = ${log4j2.pattern}
+log4j2.appender.rolling.policies.type = Policies
+log4j2.appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
+log4j2.appender.rolling.policies.size.size = 16MB
 
-# Sift appender
-log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender
-log4j.appender.sift.key=bundle.name
-log4j.appender.sift.default=karaf
-log4j.appender.sift.appender=org.apache.log4j.FileAppender
-log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout
-log4j.appender.sift.appender.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %m%n
-log4j.appender.sift.appender.file=${karaf.data}/log/$\\{bundle.name\\}.log
-log4j.appender.sift.appender.append=true
+# OSGi appender
+log4j2.appender.osgi.type = PaxOsgi
+log4j2.appender.osgi.name = PaxOsgi
+log4j2.appender.osgi.filter = *
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/assemblies/features/framework/pom.xml
----------------------------------------------------------------------
diff --git a/assemblies/features/framework/pom.xml b/assemblies/features/framework/pom.xml
index 03d97ba..42b150e 100644
--- a/assemblies/features/framework/pom.xml
+++ b/assemblies/features/framework/pom.xml
@@ -97,7 +97,7 @@
         </dependency>
         <dependency>
             <groupId>org.ops4j.pax.logging</groupId>
-            <artifactId>pax-logging-service</artifactId>
+            <artifactId>pax-logging-log4j2</artifactId>
         </dependency>
         <dependency>
             <groupId>org.ops4j.pax.url</groupId>

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/assemblies/features/framework/src/main/feature/feature.xml
----------------------------------------------------------------------
diff --git a/assemblies/features/framework/src/main/feature/feature.xml b/assemblies/features/framework/src/main/feature/feature.xml
index 29a11c7..548d9c0 100644
--- a/assemblies/features/framework/src/main/feature/feature.xml
+++ b/assemblies/features/framework/src/main/feature/feature.xml
@@ -26,7 +26,7 @@
         <bundle start="true" start-level="5">mvn:org.ops4j.pax.url/pax-url-aether/${pax.url.version}</bundle>
         <!-- logging -->
         <bundle start="true" start-level="8">mvn:org.ops4j.pax.logging/pax-logging-api/${pax.logging.version}</bundle>
-        <bundle start="true" start-level="8">mvn:org.ops4j.pax.logging/pax-logging-service/${pax.logging.version}</bundle>
+        <bundle start="true" start-level="8">mvn:org.ops4j.pax.logging/pax-logging-log4j2/${pax.logging.version}</bundle>
         <!-- config admin -->
         <bundle start="true" start-level="10">mvn:org.apache.felix/org.apache.felix.configadmin/${felix.configadmin.version}</bundle>
         <!-- file install -->

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/assemblies/features/static/src/main/feature/features.xml
----------------------------------------------------------------------
diff --git a/assemblies/features/static/src/main/feature/features.xml b/assemblies/features/static/src/main/feature/features.xml
index 86d2f23..8f191a5 100644
--- a/assemblies/features/static/src/main/feature/features.xml
+++ b/assemblies/features/static/src/main/feature/features.xml
@@ -21,7 +21,7 @@
     <feature version="${project.version}" description="Karaf core feature" name="static-framework">
         <!-- logging -->
         <bundle start="true" start-level="8">mvn:org.ops4j.pax.logging/pax-logging-api/${pax.logging.version}</bundle>
-        <bundle start="true" start-level="8">mvn:org.ops4j.pax.logging/pax-logging-service/${pax.logging.version}</bundle>
+        <bundle start="true" start-level="8">mvn:org.ops4j.pax.logging/pax-logging-log4j2/${pax.logging.version}</bundle>
         <!-- static config admin -->
         <bundle start="true" start-level="10">mvn:org.apache.karaf.services/org.apache.karaf.services.staticcm/${project.version}</bundle>
     </feature>

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/bundle/core/src/main/java/org/apache/karaf/bundle/command/LoadTest.java
----------------------------------------------------------------------
diff --git a/bundle/core/src/main/java/org/apache/karaf/bundle/command/LoadTest.java b/bundle/core/src/main/java/org/apache/karaf/bundle/command/LoadTest.java
index 8ed318f..27577b9 100644
--- a/bundle/core/src/main/java/org/apache/karaf/bundle/command/LoadTest.java
+++ b/bundle/core/src/main/java/org/apache/karaf/bundle/command/LoadTest.java
@@ -54,7 +54,7 @@ public class LoadTest implements Action {
     int refresh = 20;
 
     @Option(name = "--excludes", description = "List of bundles (ids or symbolic names) to exclude")
-    List<String> excludes = Arrays.asList("0", "org.ops4j.pax.url.mvn", "org.ops4j.pax.logging.pax-logging-api", "org.ops4j.pax.logging.pax-logging-service");
+    List<String> excludes = Arrays.asList("0", "org.ops4j.pax.url.mvn", "org.ops4j.pax.logging.pax-logging-api", "org.ops4j.pax.logging.pax-logging-log4j2");
 
     @Reference
     Session session;

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/demos/web/src/main/webapp/WEB-INF/karaf/etc/startup.properties
----------------------------------------------------------------------
diff --git a/demos/web/src/main/webapp/WEB-INF/karaf/etc/startup.properties b/demos/web/src/main/webapp/WEB-INF/karaf/etc/startup.properties
index dd81815..9d41b5f 100644
--- a/demos/web/src/main/webapp/WEB-INF/karaf/etc/startup.properties
+++ b/demos/web/src/main/webapp/WEB-INF/karaf/etc/startup.properties
@@ -23,7 +23,7 @@ mvn\:org.apache.felix/org.apache.felix.metatype/1.1.2 = 5
 mvn\:org.apache.karaf.services/org.apache.karaf.services.eventadmin/4.0.4-SNAPSHOT = 5
 mvn\:org.ops4j.pax.url/pax-url-aether/2.4.4 = 5
 mvn\:org.ops4j.pax.logging/pax-logging-api/1.8.4 = 8
-mvn\:org.ops4j.pax.logging/pax-logging-service/1.8.4 = 8
+mvn\:org.ops4j.pax.logging/pax-logging-log4j2/1.8.4 = 8
 mvn\:org.apache.felix/org.apache.felix.configadmin/1.8.8 = 10
 mvn\:org.apache.felix/org.apache.felix.fileinstall/3.5.0 = 11
 mvn\:org.apache.karaf.features/org.apache.karaf.features.core/4.0.4-SNAPSHOT = 15

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/itests/src/test/java/org/apache/karaf/itests/LogTest.java
----------------------------------------------------------------------
diff --git a/itests/src/test/java/org/apache/karaf/itests/LogTest.java b/itests/src/test/java/org/apache/karaf/itests/LogTest.java
index ba226c7..484c9e5 100644
--- a/itests/src/test/java/org/apache/karaf/itests/LogTest.java
+++ b/itests/src/test/java/org/apache/karaf/itests/LogTest.java
@@ -21,7 +21,6 @@ import javax.management.MBeanServerConnection;
 import javax.management.ObjectName;
 import javax.management.remote.JMXConnector;
 
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.junit.PaxExam;
@@ -68,9 +67,10 @@ public class LogTest extends KarafTestSupport {
         assertTrue("Should be empty but was: " + displayOutput, displayOutput.trim().isEmpty());
     }
     
-    public void assertSetLevel(String level) {
+    public void assertSetLevel(String level) throws InterruptedException {
         System.out.println(executeCommand("log:set " + level));
         assertContains(level, executeCommand("log:get"));
+        Thread.sleep(100);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/itests/src/test/resources/etc/org.ops4j.pax.logging.cfg
----------------------------------------------------------------------
diff --git a/itests/src/test/resources/etc/org.ops4j.pax.logging.cfg b/itests/src/test/resources/etc/org.ops4j.pax.logging.cfg
index 96bce06..3d79f24 100644
--- a/itests/src/test/resources/etc/org.ops4j.pax.logging.cfg
+++ b/itests/src/test/resources/etc/org.ops4j.pax.logging.cfg
@@ -17,32 +17,71 @@
 #
 ################################################################################
 
+# Common pattern layout for appenders
+log4j2.pattern = %d{ISO8601} | %-5p | %-16t | %-32c{1} | %m%n
+
 # Root logger
-log4j.rootLogger=INFO, stdout, out, osgi:VmLogAppender
-log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer
-
-# Reduce noisy output
-log4j.logger.org.apache.karaf.features.internal=WARN
-log4j.logger.org.apache.karaf.shell.impl.action.osgi=WARN
-log4j.logger.org.apache.aries=ERROR
-log4j.logger.org.eclipse.jetty.jmx=ERROR
-log4j.logger.org.apache.sshd=ERROR
-log4j.logger.org.springframework=WARN
-log4j.logger.org.ops4j.pax.exam.invoker.junit.internal=WARN
-log4j.logger.org.apache.felix.fileinstall=WARN
-log4j.logger.org.ops4j.pax.swissbox.bnd.BndUtils=ERROR
+log4j2.rootLogger.level = INFO
+# uncomment to use asynchronous loggers, which require mvn:com.lmax/disruptor/3.3.2 library
+#log4j2.rootLogger.type = asyncRoot
+#log4j2.rootLogger.includeLocation = false
+log4j2.rootLogger.appenderRefs = RollingFile, PaxOsgi
+log4j2.rootLogger.appenderRef.RollingFile.ref = RollingFile
+log4j2.rootLogger.appenderRef.PaxOsgi.ref = PaxOsgi
+
+# Appenders configuration
+log4j2.appenders = console, rolling, osgi
+
+# CONSOLE appender not used by default
+log4j2.appender.console.type = Console
+log4j2.appender.console.name = STDOUT
+log4j2.appender.console.layout.type = PatternLayout
+log4j2.appender.console.layout.pattern = ${log4j2.pattern}
+
+# File appender
+log4j2.appender.rolling.type = RollingRandomAccessFile
+log4j2.appender.rolling.name = RollingFile
+log4j2.appender.rolling.fileName = ${karaf.data}/log/karaf.log
+log4j2.appender.rolling.filePattern = ${karaf.data}/log/karaf.log.%i
+# uncomment to not force a disk flush
+#log4j2.appender.rolling.immediateFlush = false
+log4j2.appender.rolling.append = false
+log4j2.appender.rolling.layout.type = PatternLayout
+log4j2.appender.rolling.layout.pattern = ${log4j2.pattern}
+log4j2.appender.rolling.policies.type = Policies
+log4j2.appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
+log4j2.appender.rolling.policies.size.size = 16MB
+
+# OSGi appender
+log4j2.appender.osgi.type = PaxOsgi
+log4j2.appender.osgi.name = PaxOsgi
+log4j2.appender.osgi.filter = *
+
+log4j2.loggers = l00, l01, l02, l03, l04, l05, l06, l07, l08
+
+log4j2.logger.l00.name = org.apache.karaf.features.internal
+log4j2.logger.l00.level = WARN
+log4j2.logger.l01.name = org.apache.karaf.shell.impl.action.osgi
+log4j2.logger.l01.level = WARN
+log4j2.logger.l02.name = org.apache.aries
+log4j2.logger.l02.level = ERROR
+log4j2.logger.l03.name = org.eclipse.jetty.jmx
+log4j2.logger.l03.level = ERROR
+log4j2.logger.l04.name = org.apache.sshd
+log4j2.logger.l04.level = ERROR
+log4j2.logger.l05.name = org.springframework
+log4j2.logger.l05.level = ERROR
+log4j2.logger.l06.name = org.ops4j.pax.exam.invoker.junit.internal
+log4j2.logger.l06.level = ERROR
+log4j2.logger.l07.name = org.apache.felix.fileinstall
+log4j2.logger.l07.level = ERROR
+log4j2.logger.l08.name = org.ops4j.pax.swissbox.bnd.BndUtils
+log4j2.logger.l08.level = ERROR
+
 
 # CONSOLE appender
-log4j.appender.stdout.threshold=DEBUG
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-50.50c | %m%n
-#log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-40.40c | %-3.3X{bundle.id} - %-20.20X{bundle.name} | %m%n
+#log4j.appender.stdout.threshold=DEBUG
 
 # File appender
-log4j.appender.out.threshold=DEBUG
-log4j.appender.out=org.apache.log4j.FileAppender
-log4j.appender.out.layout=org.apache.log4j.PatternLayout
-log4j.appender.out.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-50.50c | %m%n
-log4j.appender.out.file=${karaf.home}/log/karaf.log
-log4j.appender.out.append=true
+#log4j.appender.out.threshold=DEBUG
+#log4j.appender.out.append=true

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/log/pom.xml
----------------------------------------------------------------------
diff --git a/log/pom.xml b/log/pom.xml
index fa492ce..e4e10f5 100644
--- a/log/pom.xml
+++ b/log/pom.xml
@@ -52,7 +52,7 @@
 
         <dependency>
             <groupId>org.ops4j.pax.logging</groupId>
-            <artifactId>pax-logging-service</artifactId>
+            <artifactId>pax-logging-log4j2</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/log/src/main/java/org/apache/karaf/log/command/LoadTest.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/command/LoadTest.java b/log/src/main/java/org/apache/karaf/log/command/LoadTest.java
new file mode 100644
index 0000000..ab8514f
--- /dev/null
+++ b/log/src/main/java/org/apache/karaf/log/command/LoadTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.command;
+
+import org.apache.karaf.log.core.LogService;
+import org.apache.karaf.shell.api.action.Action;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Reference;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Clear the last log entries.
+ */
+@Command(scope = "log", name = "load-test", description = "Load test log.")
+@Service
+public class LoadTest implements Action {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(LoadTest.class);
+
+    @Option(name = "--threads")
+    private int threads = 1;
+
+    @Option(name = "--messaged")
+    private int messages = 1000;
+
+    @Override
+    public Object execute() throws Exception {
+        Thread[] th = new Thread[threads];
+        for (int i = 0; i < threads; i++) {
+            final int idxThread = i;
+            th[i] = new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    for (int i = 0; i < messages; i++) {
+                        LOGGER.info("Message {} / {}", idxThread, i);
+                    }
+                }
+            });
+        }
+        long t0 = System.currentTimeMillis();
+        for (Thread thread : th) {
+            thread.start();
+        }
+        for (Thread thread : th) {
+            thread.join();
+        }
+        long t1 = System.currentTimeMillis();
+        System.out.println("Time: " + (t1 - t0) + " ms");
+        System.out.println("Throughput: " + ((messages * threads) / (t1 - t0 + 0.0)) + " msg/ms");
+        return null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java
index 4751873..bbb8792 100644
--- a/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java
+++ b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java
@@ -18,9 +18,7 @@ package org.apache.karaf.log.core.internal;
 
 import java.io.IOException;
 import java.util.Dictionary;
-import java.util.Enumeration;
 import java.util.Map;
-import java.util.TreeMap;
 
 import org.apache.karaf.log.core.Level;
 import org.apache.karaf.log.core.LogService;
@@ -32,11 +30,7 @@ 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 ALL_LOGGER = "ALL";
-    static final String ROOT_LOGGER = "ROOT";
-    
+
     private final ConfigurationAdmin configAdmin;
     private final LruList events;
 
@@ -45,8 +39,20 @@ public class LogServiceImpl implements LogService {
         this.events = events;
     }
 
+    private LogServiceInternal getDelegate(Dictionary<String, Object> config) {
+        if (config.get("log4j.rootLogger") != null) {
+            return new LogServiceLog4j1Impl(config);
+        }
+        else if (config.get("log4j2.rootLogger.level") != null) {
+            return new LogServiceLog4j2Impl(config);
+        }
+        else {
+            throw new IllegalStateException("Unrecognized configuration");
+        }
+    }
+
     public String getLevel() {
-        return getLevel(null).get(ROOT_LOGGER);
+        return getLevel(LogServiceInternal.ROOT_LOGGER).get(LogServiceInternal.ROOT_LOGGER);
     }
 
     public Map<String, String> getLevel(String logger) {
@@ -56,118 +62,37 @@ public class LogServiceImpl implements LogService {
         } 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;
-        }
-
-        Map<String, String> loggers = new TreeMap<String, String>();
-
-        if (ALL_LOGGER.equalsIgnoreCase(logger)) {
-            String root = getLevelFromProperty((String) props.get(ROOT_LOGGER_PREFIX));
-            loggers.put("ROOT", root);
-            for (Enumeration e = props.keys(); e.hasMoreElements(); ) {
-                String prop = (String) e.nextElement();
-                if (prop.startsWith(LOGGER_PREFIX)) {
-                    String val = getLevelFromProperty((String) props.get(prop));
-                    loggers.put(prop.substring(LOGGER_PREFIX.length()), val);
-                }
-            }
-            return loggers;
-        }
-
-        String l = logger;
-        String val;
-        for (;;) {
-            String prop;
-            if (l == null) {
-                prop = ROOT_LOGGER_PREFIX;
-            } else {
-                prop = LOGGER_PREFIX + l;
-            }
-            val = (String) props.get(prop);
-            val = getLevelFromProperty(val);
-            if (val != null || l == null) {
-                break;
-            }
-            int idx = l.lastIndexOf('.');
-            if (idx < 0) {
-                l = null;
-            } else {
-                l = l.substring(0, idx);
-            }
+        if (logger == null) {
+            logger = LogServiceInternal.ROOT_LOGGER;
         }
-
-        if (logger == null)
-            logger = ROOT_LOGGER;
-
-        loggers.put(logger, val);
-
-        return loggers;
+        return getDelegate(cfg.getProperties()).getLevel(logger);
     }
 
     public void setLevel(String level) {
-        setLevel(null, level);
+        setLevel(LogServiceInternal.ROOT_LOGGER, level);
     }
 
     @SuppressWarnings("unchecked")
     public void setLevel(String logger, String level) {
-        if (ROOT_LOGGER.equalsIgnoreCase(logger)) {
-            logger = null;
-        }
-
         // make sure both uppercase and lowercase levels are supported
         level = level.toUpperCase();
-
         // check if the level is valid
-        Level.valueOf(level);
-
-        if (Level.isDefault(level) && logger == null) {
+        Level lvl = Level.valueOf(level);
+        // Default logger
+        if (logger == null) {
+            logger = LogServiceInternal.ROOT_LOGGER;
+        }
+        // Verify
+        if (lvl == Level.DEFAULT && LogServiceInternal.ROOT_LOGGER.equals(logger)) {
             throw new IllegalStateException("Can not unset the ROOT logger");
         }
 
+        // Get config
         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.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);
-        }
+        Dictionary<String, Object> props = cfg.getProperties();
+        // Update
+        getDelegate(props).setLevel(logger, level);
+        // Save
         try {
             cfg.update(props);
         } catch (IOException e) {
@@ -176,22 +101,7 @@ public class LogServiceImpl implements LogService {
     }
 
     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;
-        }
+        return (event.getLoggerName().lastIndexOf(logger) >= 0);
     }
 
     private Configuration getConfiguration() {
@@ -249,13 +159,4 @@ public class LogServiceImpl implements LogService {
         events.removeAppender(appender);
     }
 
-    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;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceInternal.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceInternal.java b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceInternal.java
new file mode 100644
index 0000000..d7e06b4
--- /dev/null
+++ b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceInternal.java
@@ -0,0 +1,41 @@
+/*
+ * 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 java.util.Enumeration;
+import java.util.Map;
+import java.util.TreeMap;
+
+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 interface LogServiceInternal {
+
+    String ALL_LOGGER = "ALL";
+    String ROOT_LOGGER = "ROOT";
+
+    Map<String, String> getLevel(String logger);
+
+    void setLevel(String logger, String level);
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceLog4j1Impl.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceLog4j1Impl.java b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceLog4j1Impl.java
new file mode 100644
index 0000000..a538cb5
--- /dev/null
+++ b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceLog4j1Impl.java
@@ -0,0 +1,141 @@
+/*
+ * 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.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.karaf.log.core.Level;
+
+public class LogServiceLog4j1Impl implements LogServiceInternal {
+
+    static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger";
+    static final String LOGGER_PREFIX = "log4j.logger.";
+
+    private final Dictionary<String, Object> config;
+
+    public LogServiceLog4j1Impl(Dictionary<String, Object> config) {
+        this.config = config;
+    }
+
+    public Map<String, String> getLevel(String logger) {
+        Map<String, String> loggers = new TreeMap<>();
+
+        if (ROOT_LOGGER.equalsIgnoreCase(logger)) {
+            logger = null;
+        }
+        if (ALL_LOGGER.equalsIgnoreCase(logger)) {
+            String root = getLevelFromProperty((String) config.get(ROOT_LOGGER_PREFIX));
+            loggers.put(ROOT_LOGGER, root);
+            for (Enumeration e = config.keys(); e.hasMoreElements(); ) {
+                String prop = (String) e.nextElement();
+                if (prop.startsWith(LOGGER_PREFIX)) {
+                    String val = getLevelFromProperty((String) config.get(prop));
+                    loggers.put(prop.substring(LOGGER_PREFIX.length()), val);
+                }
+            }
+            return loggers;
+        }
+
+        String l = logger;
+        String val;
+        for (;;) {
+            String prop;
+            if (l == null) {
+                prop = ROOT_LOGGER_PREFIX;
+            } else {
+                prop = LOGGER_PREFIX + l;
+            }
+            val = (String) config.get(prop);
+            val = getLevelFromProperty(val);
+            if (val != null || l == null) {
+                break;
+            }
+            int idx = l.lastIndexOf('.');
+            if (idx < 0) {
+                l = null;
+            } else {
+                l = l.substring(0, idx);
+            }
+        }
+
+        if (logger == null)
+            logger = ROOT_LOGGER;
+
+        loggers.put(logger, val);
+
+        return loggers;
+    }
+
+    public void setLevel(String logger, String level) {
+        String val;
+        String prop;
+        if (logger == null || LogServiceInternal.ROOT_LOGGER.equalsIgnoreCase(logger)) {
+            prop = ROOT_LOGGER_PREFIX;
+        } else {
+            prop = LOGGER_PREFIX + logger;
+        }
+
+        val = (String) config.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) {
+            config.remove(prop);
+        } else {
+            config.put(prop, val);
+        }
+    }
+
+    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;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceLog4j2Impl.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceLog4j2Impl.java b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceLog4j2Impl.java
new file mode 100644
index 0000000..229d5ce
--- /dev/null
+++ b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceLog4j2Impl.java
@@ -0,0 +1,132 @@
+/*
+ * 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.util.Collections;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.karaf.log.core.Level;
+
+public class LogServiceLog4j2Impl implements LogServiceInternal {
+
+    static final String ROOT_LOGGER_LEVEL = "log4j2.rootLogger.level";
+    static final String LOGGERS = "log4j2.loggers";
+    static final String LOGGER_PREFIX = "log4j2.logger.";
+    static final String NAME_SUFFIX = ".name";
+    static final String LEVEL_SUFFIX = ".level";
+
+    private final Dictionary<String, Object> config;
+
+    public LogServiceLog4j2Impl(Dictionary<String, Object> config) {
+        this.config = config;
+    }
+
+    public Map<String, String> getLevel(String logger) {
+        Map<String, String> loggers = new TreeMap<>();
+
+        String root = (String) config.get(ROOT_LOGGER_LEVEL);
+        loggers.put(ROOT_LOGGER, root);
+        if (ROOT_LOGGER.equals(logger)) {
+            return loggers;
+        }
+
+        String ids = (String) config.get(LOGGERS);
+        if (ids != null) {
+            for (String id : ids.split(",")) {
+                id = id.trim();
+                if (!id.equalsIgnoreCase(ROOT_LOGGER)) {
+                    String name = (String) config.get(name(id));
+                    String level = (String) config.get(level(id));
+                    if (name != null && level != null) {
+                        loggers.put(name, level);
+                    }
+                }
+            }
+        }
+        if (ALL_LOGGER.equalsIgnoreCase(logger)) {
+            return loggers;
+        }
+
+        String l = logger;
+        String val;
+        for (;;) {
+            val = loggers.get(l != null ? l : ROOT_LOGGER);
+            if (val != null || l == null) {
+                return Collections.singletonMap(logger, val);
+            }
+            int idx = l.lastIndexOf('.');
+            if (idx < 0) {
+                l = null;
+            } else {
+                l = l.substring(0, idx);
+            }
+        }
+    }
+
+    public void setLevel(String logger, String level) {
+        if (logger == null || LogServiceInternal.ROOT_LOGGER.equalsIgnoreCase(logger)) {
+            config.put(ROOT_LOGGER_LEVEL, level);
+        } else {
+            Map<String, String> names = new HashMap<>();
+            String ids = (String) config.get(LOGGERS);
+            if (ids != null) {
+                for (String id : ids.split(",")) {
+                    id = id.trim();
+                    if (!id.equalsIgnoreCase(ROOT_LOGGER)) {
+                        String name = (String) config.get(name(id));
+                        if (name != null) {
+                            names.put(name, id);
+                        }
+                    }
+                }
+            }
+
+            if (Level.isDefault(level)) {
+                if (names.containsKey(logger)) {
+                    config.remove(level(names.get(logger)));
+                }
+            }
+            else {
+                if (names.containsKey(logger)) {
+                    config.put(level(names.get(logger)), level);
+                }
+                else {
+                    String id = logger.toLowerCase().replace('.', '_').replace('$', '_');
+                    config.put(name(id), logger);
+                    if (ids != null) {
+                        config.put(LOGGERS, ids + "," + id);
+                    } else {
+                        config.put(LOGGERS, id);
+                    }
+                    config.put(level(id), level);
+                }
+            }
+        }
+    }
+
+    private String name(String logger) {
+        return LOGGER_PREFIX + logger + NAME_SUFFIX;
+    }
+
+    private String level(String logger) {
+        return LOGGER_PREFIX + logger + LEVEL_SUFFIX;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/log/src/test/java/org/apache/karaf/log/core/internal/SetLogLevelTest.java
----------------------------------------------------------------------
diff --git a/log/src/test/java/org/apache/karaf/log/core/internal/SetLogLevelTest.java b/log/src/test/java/org/apache/karaf/log/core/internal/SetLogLevelTest.java
index 73459d3..a6e4d46 100644
--- a/log/src/test/java/org/apache/karaf/log/core/internal/SetLogLevelTest.java
+++ b/log/src/test/java/org/apache/karaf/log/core/internal/SetLogLevelTest.java
@@ -45,6 +45,8 @@ public class SetLogLevelTest extends TestCase {
         super.setUp();
 
         properties = new Hashtable<String, String>();
+        properties.put(ROOT_LOGGER, "info");
+
         final Configuration configuration = EasyMock.createMock(Configuration.class);
         EasyMock.expect(configuration.getProperties()).andReturn(properties);
         configuration.update(properties);        

http://git-wip-us.apache.org/repos/asf/karaf/blob/39d2035b/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 66da129..35672c6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -393,6 +393,7 @@
             </snapshots>
         </repository>
         <!-- Jolokia snapshots -->
+        <!--
         <repository>
             <id>labs-consol-snapshot</id>
             <name>ConSol* Labs Repository (Snapshots)</name>
@@ -404,6 +405,7 @@
                 <enabled>false</enabled>
             </releases>
         </repository>
+        -->
     </repositories>
     <pluginRepositories>
         <!-- Apache snapshots -->
@@ -1240,12 +1242,11 @@
                 <groupId>org.ops4j.pax.logging</groupId>
                 <artifactId>pax-logging-service</artifactId>
                 <version>${pax.logging.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>log4j</groupId>
-                        <artifactId>log4j</artifactId>
-                    </exclusion>
-                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.logging</groupId>
+                <artifactId>pax-logging-log4j2</artifactId>
+                <version>${pax.logging.version}</version>
             </dependency>
 
             <dependency>