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>