You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2017/06/24 10:57:47 UTC
[1/8] logging-log4j2 git commit: LOG4J2-1926 make interface
ThreadInformation public since some implementations will live in log4j-core
Repository: logging-log4j2
Updated Branches:
refs/heads/master 633bb663f -> 81f20a6ac
LOG4J2-1926 make interface ThreadInformation public since some implementations will live in log4j-core
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/000899ac
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/000899ac
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/000899ac
Branch: refs/heads/master
Commit: 000899acba05e5b9a2a630d59164ba055553e278
Parents: 55b9fd2
Author: rpopma <rp...@apache.org>
Authored: Sat Jun 24 19:44:51 2017 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Jun 24 19:44:51 2017 +0900
----------------------------------------------------------------------
.../java/org/apache/logging/log4j/message/ThreadInformation.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/000899ac/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadInformation.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadInformation.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadInformation.java
index 2db1777..93e6e03 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadInformation.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadInformation.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.message;
/**
* Interface used to print basic or extended thread information.
*/
-interface ThreadInformation {
+public interface ThreadInformation {
/**
* Format the thread information into the provided StringBuilder.
* @param sb The StringBuilder.
[3/8] logging-log4j2 git commit: LOG4J2-1926 Remove references to
java.lang.management package
Posted by rp...@apache.org.
LOG4J2-1926 Remove references to java.lang.management package
- make inner interface ThreadInfoFactory public
- obtain ThreadInfoFactory instance from ServiceLoader, fall back to BasicThreadInfoFactory
- move ExtendedThreadInfoFactory out of ThreadDumpMessage class
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/d0023dee
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/d0023dee
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/d0023dee
Branch: refs/heads/master
Commit: d0023dee94ecee680ee3cdc0be31313337fd49ad
Parents: a0fcb15
Author: rpopma <rp...@apache.org>
Authored: Sat Jun 24 19:52:48 2017 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Jun 24 19:52:48 2017 +0900
----------------------------------------------------------------------
.../log4j/message/ThreadDumpMessage.java | 71 +++++++++-----------
1 file changed, 30 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d0023dee/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java
index 4cf7478..4fd1347 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java
@@ -19,13 +19,13 @@ package org.apache.logging.log4j.message;
import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.Serializable;
-import java.lang.management.ManagementFactory;
-import java.lang.management.ThreadInfo;
-import java.lang.management.ThreadMXBean;
-import java.lang.reflect.Method;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
+import java.util.ServiceConfigurationError;
+import java.util.ServiceLoader;
+import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.StringBuilderFormattable;
import org.apache.logging.log4j.util.Strings;
@@ -34,36 +34,20 @@ import org.apache.logging.log4j.util.Strings;
*/
@AsynchronouslyFormattable
public class ThreadDumpMessage implements Message, StringBuilderFormattable {
-
private static final long serialVersionUID = -1103400781608841088L;
-
- private static final ThreadInfoFactory FACTORY;
+ private static ThreadInfoFactory FACTORY;
private volatile Map<ThreadInformation, StackTraceElement[]> threads;
-
private final String title;
-
private String formattedMessage;
- static {
- final Method[] methods = ThreadInfo.class.getMethods();
- boolean basic = true;
- for (final Method method : methods) {
- if (method.getName().equals("getLockInfo")) {
- basic = false;
- break;
- }
- }
- FACTORY = basic ? new BasicThreadInfoFactory() : new ExtendedThreadInfoFactory();
- }
-
/**
* Generate a ThreadDumpMessage with a title.
* @param title The title.
*/
public ThreadDumpMessage(final String title) {
this.title = title == null ? Strings.EMPTY : title;
- threads = FACTORY.createThreadInfo();
+ threads = getFactory().createThreadInfo();
}
private ThreadDumpMessage(final String formattedMsg, final String title) {
@@ -71,6 +55,29 @@ public class ThreadDumpMessage implements Message, StringBuilderFormattable {
this.title = title == null ? Strings.EMPTY : title;
}
+ private static ThreadInfoFactory getFactory() {
+ if (FACTORY == null) {
+ FACTORY = initFactory(ThreadDumpMessage.class.getClassLoader());
+ }
+ return FACTORY;
+ }
+
+ private static ThreadInfoFactory initFactory(final ClassLoader classLoader) {
+ ServiceLoader<ThreadInfoFactory> serviceLoader = ServiceLoader.load(ThreadInfoFactory.class, classLoader);
+ ThreadInfoFactory result = null;
+ try {
+ Iterator<ThreadInfoFactory> iterator = serviceLoader.iterator();
+ while (result == null && iterator.hasNext()) {
+ result = iterator.next();
+ }
+ } catch (ServiceConfigurationError | LinkageError | Exception unavailable) { // if java management classes not available
+ StatusLogger.getLogger().info("ThreadDumpMessage uses BasicThreadInfoFactory: " +
+ "could not load extended ThreadInfoFactory: {}", unavailable.toString());
+ result = null;
+ }
+ return result == null ? new BasicThreadInfoFactory() : result;
+ }
+
@Override
public String toString() {
return getFormattedMessage();
@@ -162,7 +169,7 @@ public class ThreadDumpMessage implements Message, StringBuilderFormattable {
/**
* Factory to create Thread information.
*/
- private interface ThreadInfoFactory {
+ public static interface ThreadInfoFactory {
Map<ThreadInformation, StackTraceElement[]> createThreadInfo();
}
@@ -183,24 +190,6 @@ public class ThreadDumpMessage implements Message, StringBuilderFormattable {
}
/**
- * Factory to create extended thread information.
- */
- private static class ExtendedThreadInfoFactory implements ThreadInfoFactory {
- @Override
- public Map<ThreadInformation, StackTraceElement[]> createThreadInfo() {
- final ThreadMXBean bean = ManagementFactory.getThreadMXBean();
- final ThreadInfo[] array = bean.dumpAllThreads(true, true);
-
- final Map<ThreadInformation, StackTraceElement[]> threads =
- new HashMap<>(array.length);
- for (final ThreadInfo info : array) {
- threads.put(new ExtendedThreadInformation(info), info.getStackTrace());
- }
- return threads;
- }
- }
-
- /**
* Always returns null.
*
* @return null
[8/8] logging-log4j2 git commit: LOG4J2-1926 change log entry
Posted by rp...@apache.org.
LOG4J2-1926 change log entry
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/81f20a6a
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/81f20a6a
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/81f20a6a
Branch: refs/heads/master
Commit: 81f20a6accf14c1c0eb058d4d4c5579cbf4bdec3
Parents: e369b8a
Author: rpopma <rp...@apache.org>
Authored: Sat Jun 24 19:57:43 2017 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Jun 24 19:57:43 2017 +0900
----------------------------------------------------------------------
src/changes/changes.xml | 3 +++
1 file changed, 3 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/81f20a6a/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 15e469d..6b66f5d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -31,6 +31,9 @@
- "remove" - Removed
-->
<release version="2.9.0" date="2017-MM-DD" description="GA Release 2.9.0">
+ <action issue="LOG4J2-1926" dev="rpopma" type="update">
+ Facilitate log4j use in Android applications: remove dependency on RMI and Management APIs from log4j-api.
+ </action>
<action issue="LOG4J2-1699" dev="ggregory" type="add" due-to="Demetrios Dimatos, Pierrick HYMBERT">
Configurable Log File Permissions with PosixFilePermission.
</action>
[2/8] logging-log4j2 git commit: Merge remote-tracking branch
'origin/master'
Posted by rp...@apache.org.
Merge remote-tracking branch 'origin/master'
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/a0fcb155
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/a0fcb155
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/a0fcb155
Branch: refs/heads/master
Commit: a0fcb1557f19ee22e84c32901843ed4eeab1bbc4
Parents: 000899a 633bb66
Author: rpopma <rp...@apache.org>
Authored: Sat Jun 24 19:48:11 2017 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Jun 24 19:48:11 2017 +0900
----------------------------------------------------------------------
.../logging/log4j/util/ClassNamePredicate.java | 45 ---
.../logging/log4j/util/ClassPredicate.java | 46 ---
.../apache/logging/log4j/util/StackLocator.java | 39 ---
.../logging/log4j/util/StackLocatorUtil.java | 70 -----
.../log4j/util/StackWalkerStackLocator.java | 63 ----
log4j-api/pom.xml | 3 -
.../org/apache/logging/log4j/LogManager.java | 4 +-
.../appender/mom/activemq/JmsAppenderIT.java | 5 +-
.../log4j/core/appender/FileAppender.java | 38 ++-
.../log4j/core/appender/FileManager.java | 134 +++++++-
.../core/appender/RollingFileAppender.java | 40 ++-
.../RollingRandomAccessFileAppender.java | 29 +-
.../log4j/core/appender/mom/JmsAppender.java | 28 +-
.../log4j/core/appender/mom/JmsManager.java | 16 +-
.../rolling/AbstractRolloverStrategy.java | 6 -
.../rolling/DefaultRolloverStrategy.java | 25 +-
.../rolling/DirectWriteRolloverStrategy.java | 28 +-
.../appender/rolling/RollingFileManager.java | 90 ++++--
.../rolling/RollingRandomAccessFileManager.java | 43 ++-
.../action/PosixViewAttributeAction.java | 307 +++++++++++++++++++
.../PropertiesConfigurationBuilder.java | 6 +-
.../logging/log4j/core/net/JndiManager.java | 293 +++++++++---------
.../logging/log4j/core/util/FileUtils.java | 58 ++++
.../appender/FileAppenderPermissionsTest.java | 211 +++++++++++++
.../FileAppenderPermissionsXmlConfigTest.java | 66 ++++
.../log4j/core/appender/HttpAppenderTest.java | 21 +-
.../rolling/CronTriggeringPolicyTest.java | 278 ++++++++---------
.../rolling/OnStartupTriggeringPolicyTest.java | 2 +-
...lingAppenderSizeCompressPermissionsTest.java | 107 +++++++
.../RollingRandomAccessFileManagerTest.java | 33 +-
...esConfigurationTrailingSpaceOnLevelTest.java | 67 ++++
log4j-core/src/test/resources/log4j-posix.xml | 14 +
.../test/resources/log4j-rolling-gz-posix.xml | 70 +++++
...roperties-trailing-space-on-level.properties | 39 +++
pom.xml | 7 +-
src/changes/changes.xml | 12 +
src/site/xdoc/manual/appenders.xml | 177 ++++++++++-
37 files changed, 1879 insertions(+), 641 deletions(-)
----------------------------------------------------------------------
[4/8] logging-log4j2 git commit: LOG4J2-1926 moved
ExtendedThreadInfoFactory out of ThreadDumpMessage class and make it a
top-level class in log4j-core
Posted by rp...@apache.org.
LOG4J2-1926 moved ExtendedThreadInfoFactory out of ThreadDumpMessage class and make it a top-level class in log4j-core
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/75f519f7
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/75f519f7
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/75f519f7
Branch: refs/heads/master
Commit: 75f519f75cdd576b264c05af3d4608d6cb8d2f97
Parents: d0023de
Author: rpopma <rp...@apache.org>
Authored: Sat Jun 24 19:54:29 2017 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Jun 24 19:54:29 2017 +0900
----------------------------------------------------------------------
.../core/message/ExtendedThreadInfoFactory.java | 58 ++++++++++++++++++++
1 file changed, 58 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/75f519f7/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInfoFactory.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInfoFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInfoFactory.java
new file mode 100644
index 0000000..0079fbc
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInfoFactory.java
@@ -0,0 +1,58 @@
+/*
+ * 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.logging.log4j.core.message;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.logging.log4j.message.ThreadDumpMessage;
+import org.apache.logging.log4j.message.ThreadInformation;
+
+/**
+ * Factory to create extended thread information.
+ */
+public class ExtendedThreadInfoFactory implements ThreadDumpMessage.ThreadInfoFactory {
+ public ExtendedThreadInfoFactory() {
+ final Method[] methods = ThreadInfo.class.getMethods();
+ boolean basic = true;
+ for (final Method method : methods) {
+ if (method.getName().equals("getLockInfo")) {
+ basic = false;
+ break;
+ }
+ }
+ if (basic) {
+ throw new IllegalStateException();
+ }
+ }
+ @Override
+ public Map<ThreadInformation, StackTraceElement[]> createThreadInfo() {
+ final ThreadMXBean bean = ManagementFactory.getThreadMXBean();
+ final ThreadInfo[] array = bean.dumpAllThreads(true, true);
+
+ final Map<ThreadInformation, StackTraceElement[]> threads =
+ new HashMap<>(array.length);
+ for (final ThreadInfo info : array) {
+ threads.put(new ExtendedThreadInformation(info), info.getStackTrace());
+ }
+ return threads;
+ }
+}
[7/8] logging-log4j2 git commit: LOG4J2-1926 unit test that verifies
ExtendedThreadInfoFactory is loaded from ServiceLoader
Posted by rp...@apache.org.
LOG4J2-1926 unit test that verifies ExtendedThreadInfoFactory is loaded from ServiceLoader
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/e369b8a5
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/e369b8a5
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/e369b8a5
Branch: refs/heads/master
Commit: e369b8a51fe7adec9afb58a42d279d9d41a08370
Parents: 20dab46
Author: rpopma <rp...@apache.org>
Authored: Sat Jun 24 19:57:13 2017 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Jun 24 19:57:13 2017 +0900
----------------------------------------------------------------------
.../message/ExtendedThreadInformationTest.java | 36 ++++++++++++++++++++
1 file changed, 36 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e369b8a5/log4j-core/src/test/java/org/apache/logging/log4j/core/message/ExtendedThreadInformationTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/message/ExtendedThreadInformationTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/message/ExtendedThreadInformationTest.java
new file mode 100644
index 0000000..8333f19
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/message/ExtendedThreadInformationTest.java
@@ -0,0 +1,36 @@
+/*
+ * 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.logging.log4j.core.message;
+
+import org.apache.logging.log4j.message.ThreadDumpMessage;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests that ThreadDumpMessage uses ExtendedThreadInformation when available.
+ */
+public class ExtendedThreadInformationTest {
+ @Test
+ public void testMessage() {
+ final ThreadDumpMessage msg = new ThreadDumpMessage("Testing");
+
+ final String message = msg.getFormattedMessage();
+ //System.out.print(message);
+ assertTrue("No header", message.contains(" Id="));
+ }
+}
\ No newline at end of file
[6/8] logging-log4j2 git commit: LOG4J2-1926 added configuration file
to obtain ExtendedThreadInfoFactory instance from ServiceLoader
Posted by rp...@apache.org.
LOG4J2-1926 added configuration file to obtain ExtendedThreadInfoFactory instance from ServiceLoader
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/20dab46a
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/20dab46a
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/20dab46a
Branch: refs/heads/master
Commit: 20dab46a8dda6c42c0a0d91085154652a2eaac1a
Parents: 98eaaf9
Author: rpopma <rp...@apache.org>
Authored: Sat Jun 24 19:56:34 2017 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Jun 24 19:56:34 2017 +0900
----------------------------------------------------------------------
...apache.logging.log4j.message.ThreadDumpMessage$ThreadInfoFactory | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/20dab46a/log4j-core/src/main/resources/META-INF/services/org.apache.logging.log4j.message.ThreadDumpMessage$ThreadInfoFactory
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/resources/META-INF/services/org.apache.logging.log4j.message.ThreadDumpMessage$ThreadInfoFactory b/log4j-core/src/main/resources/META-INF/services/org.apache.logging.log4j.message.ThreadDumpMessage$ThreadInfoFactory
new file mode 100644
index 0000000..fad272d
--- /dev/null
+++ b/log4j-core/src/main/resources/META-INF/services/org.apache.logging.log4j.message.ThreadDumpMessage$ThreadInfoFactory
@@ -0,0 +1 @@
+org.apache.logging.log4j.core.message.ExtendedThreadInfoFactory
[5/8] logging-log4j2 git commit: LOG4J2-1926 Facilitate Adroid use:
Moved ExtendedThreadInformation from log4j-api to log4j-core to avoid all
references to java.lang.management in log4j-api
Posted by rp...@apache.org.
LOG4J2-1926 Facilitate Adroid use: Moved ExtendedThreadInformation from log4j-api to log4j-core to avoid all references to java.lang.management in log4j-api
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/98eaaf98
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/98eaaf98
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/98eaaf98
Branch: refs/heads/master
Commit: 98eaaf9861156661f8d053adced0856fb7b54d6b
Parents: 75f519f
Author: rpopma <rp...@apache.org>
Authored: Sat Jun 24 19:55:49 2017 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Jun 24 19:55:49 2017 +0900
----------------------------------------------------------------------
.../message/ExtendedThreadInformation.java | 166 ------------------
.../core/message/ExtendedThreadInformation.java | 167 +++++++++++++++++++
2 files changed, 167 insertions(+), 166 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/98eaaf98/log4j-api/src/main/java/org/apache/logging/log4j/message/ExtendedThreadInformation.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ExtendedThreadInformation.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ExtendedThreadInformation.java
deleted file mode 100644
index 208121c..0000000
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ExtendedThreadInformation.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * 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.logging.log4j.message;
-
-import java.lang.management.LockInfo;
-import java.lang.management.MonitorInfo;
-import java.lang.management.ThreadInfo;
-
-import org.apache.logging.log4j.util.StringBuilders;
-
-/**
- * Provides information on locks and monitors in the thread dump. This class requires Java 1.6 to compile and
- * run.
- */
-class ExtendedThreadInformation implements ThreadInformation {
-
- private final ThreadInfo threadInfo;
-
- ExtendedThreadInformation(final ThreadInfo thread) {
- this.threadInfo = thread;
- }
-
- @Override
- public void printThreadInfo(final StringBuilder sb) {
- StringBuilders.appendDqValue(sb, threadInfo.getThreadName());
- sb.append(" Id=").append(threadInfo.getThreadId()).append(' ');
- formatState(sb, threadInfo);
- if (threadInfo.isSuspended()) {
- sb.append(" (suspended)");
- }
- if (threadInfo.isInNative()) {
- sb.append(" (in native)");
- }
- sb.append('\n');
- }
-
- @Override
- public void printStack(final StringBuilder sb, final StackTraceElement[] stack) {
- int i = 0;
- for (final StackTraceElement element : stack) {
- sb.append("\tat ").append(element.toString());
- sb.append('\n');
- if (i == 0 && threadInfo.getLockInfo() != null) {
- final Thread.State ts = threadInfo.getThreadState();
- switch (ts) {
- case BLOCKED:
- sb.append("\t- blocked on ");
- formatLock(sb, threadInfo.getLockInfo());
- sb.append('\n');
- break;
- case WAITING:
- sb.append("\t- waiting on ");
- formatLock(sb, threadInfo.getLockInfo());
- sb.append('\n');
- break;
- case TIMED_WAITING:
- sb.append("\t- waiting on ");
- formatLock(sb, threadInfo.getLockInfo());
- sb.append('\n');
- break;
- default:
- }
- }
-
- for (final MonitorInfo mi : threadInfo.getLockedMonitors()) {
- if (mi.getLockedStackDepth() == i) {
- sb.append("\t- locked ");
- formatLock(sb, mi);
- sb.append('\n');
- }
- }
- ++i;
- }
-
- final LockInfo[] locks = threadInfo.getLockedSynchronizers();
- if (locks.length > 0) {
- sb.append("\n\tNumber of locked synchronizers = ").append(locks.length).append('\n');
- for (final LockInfo li : locks) {
- sb.append("\t- ");
- formatLock(sb, li);
- sb.append('\n');
- }
- }
- }
-
- private void formatLock(final StringBuilder sb, final LockInfo lock) {
- sb.append('<').append(lock.getIdentityHashCode()).append("> (a ");
- sb.append(lock.getClassName()).append(')');
- }
-
- private void formatState(final StringBuilder sb, final ThreadInfo info) {
- final Thread.State state = info.getThreadState();
- sb.append(state);
- switch (state) {
- case BLOCKED: {
- sb.append(" (on object monitor owned by \"");
- sb.append(info.getLockOwnerName()).append("\" Id=").append(info.getLockOwnerId()).append(')');
- break;
- }
- case WAITING: {
- final StackTraceElement element = info.getStackTrace()[0];
- final String className = element.getClassName();
- final String method = element.getMethodName();
- if (className.equals("java.lang.Object") && method.equals("wait")) {
- sb.append(" (on object monitor");
- if (info.getLockOwnerName() != null) {
- sb.append(" owned by \"");
- sb.append(info.getLockOwnerName()).append("\" Id=").append(info.getLockOwnerId());
- }
- sb.append(')');
- } else if (className.equals("java.lang.Thread") && method.equals("join")) {
- sb.append(" (on completion of thread ").append(info.getLockOwnerId()).append(')');
- } else {
- sb.append(" (parking for lock");
- if (info.getLockOwnerName() != null) {
- sb.append(" owned by \"");
- sb.append(info.getLockOwnerName()).append("\" Id=").append(info.getLockOwnerId());
- }
- sb.append(')');
- }
- break;
- }
- case TIMED_WAITING: {
- final StackTraceElement element = info.getStackTrace()[0];
- final String className = element.getClassName();
- final String method = element.getMethodName();
- if (className.equals("java.lang.Object") && method.equals("wait")) {
- sb.append(" (on object monitor");
- if (info.getLockOwnerName() != null) {
- sb.append(" owned by \"");
- sb.append(info.getLockOwnerName()).append("\" Id=").append(info.getLockOwnerId());
- }
- sb.append(')');
- } else if (className.equals("java.lang.Thread") && method.equals("sleep")) {
- sb.append(" (sleeping)");
- } else if (className.equals("java.lang.Thread") && method.equals("join")) {
- sb.append(" (on completion of thread ").append(info.getLockOwnerId()).append(')');
- } else {
- sb.append(" (parking for lock");
- if (info.getLockOwnerName() != null) {
- sb.append(" owned by \"");
- sb.append(info.getLockOwnerName()).append("\" Id=").append(info.getLockOwnerId());
- }
- sb.append(')');
- }
- break;
- }
- default:
- break;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/98eaaf98/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInformation.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInformation.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInformation.java
new file mode 100644
index 0000000..af7bf8b
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInformation.java
@@ -0,0 +1,167 @@
+/*
+ * 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.logging.log4j.core.message;
+
+import java.lang.management.LockInfo;
+import java.lang.management.MonitorInfo;
+import java.lang.management.ThreadInfo;
+
+import org.apache.logging.log4j.message.ThreadInformation;
+import org.apache.logging.log4j.util.StringBuilders;
+
+/**
+ * Provides information on locks and monitors in the thread dump. This class requires Java 1.6 to compile and
+ * run.
+ */
+class ExtendedThreadInformation implements ThreadInformation {
+
+ private final ThreadInfo threadInfo;
+
+ ExtendedThreadInformation(final ThreadInfo thread) {
+ this.threadInfo = thread;
+ }
+
+ @Override
+ public void printThreadInfo(final StringBuilder sb) {
+ StringBuilders.appendDqValue(sb, threadInfo.getThreadName());
+ sb.append(" Id=").append(threadInfo.getThreadId()).append(' ');
+ formatState(sb, threadInfo);
+ if (threadInfo.isSuspended()) {
+ sb.append(" (suspended)");
+ }
+ if (threadInfo.isInNative()) {
+ sb.append(" (in native)");
+ }
+ sb.append('\n');
+ }
+
+ @Override
+ public void printStack(final StringBuilder sb, final StackTraceElement[] stack) {
+ int i = 0;
+ for (final StackTraceElement element : stack) {
+ sb.append("\tat ").append(element.toString());
+ sb.append('\n');
+ if (i == 0 && threadInfo.getLockInfo() != null) {
+ final Thread.State ts = threadInfo.getThreadState();
+ switch (ts) {
+ case BLOCKED:
+ sb.append("\t- blocked on ");
+ formatLock(sb, threadInfo.getLockInfo());
+ sb.append('\n');
+ break;
+ case WAITING:
+ sb.append("\t- waiting on ");
+ formatLock(sb, threadInfo.getLockInfo());
+ sb.append('\n');
+ break;
+ case TIMED_WAITING:
+ sb.append("\t- waiting on ");
+ formatLock(sb, threadInfo.getLockInfo());
+ sb.append('\n');
+ break;
+ default:
+ }
+ }
+
+ for (final MonitorInfo mi : threadInfo.getLockedMonitors()) {
+ if (mi.getLockedStackDepth() == i) {
+ sb.append("\t- locked ");
+ formatLock(sb, mi);
+ sb.append('\n');
+ }
+ }
+ ++i;
+ }
+
+ final LockInfo[] locks = threadInfo.getLockedSynchronizers();
+ if (locks.length > 0) {
+ sb.append("\n\tNumber of locked synchronizers = ").append(locks.length).append('\n');
+ for (final LockInfo li : locks) {
+ sb.append("\t- ");
+ formatLock(sb, li);
+ sb.append('\n');
+ }
+ }
+ }
+
+ private void formatLock(final StringBuilder sb, final LockInfo lock) {
+ sb.append('<').append(lock.getIdentityHashCode()).append("> (a ");
+ sb.append(lock.getClassName()).append(')');
+ }
+
+ private void formatState(final StringBuilder sb, final ThreadInfo info) {
+ final Thread.State state = info.getThreadState();
+ sb.append(state);
+ switch (state) {
+ case BLOCKED: {
+ sb.append(" (on object monitor owned by \"");
+ sb.append(info.getLockOwnerName()).append("\" Id=").append(info.getLockOwnerId()).append(')');
+ break;
+ }
+ case WAITING: {
+ final StackTraceElement element = info.getStackTrace()[0];
+ final String className = element.getClassName();
+ final String method = element.getMethodName();
+ if (className.equals("java.lang.Object") && method.equals("wait")) {
+ sb.append(" (on object monitor");
+ if (info.getLockOwnerName() != null) {
+ sb.append(" owned by \"");
+ sb.append(info.getLockOwnerName()).append("\" Id=").append(info.getLockOwnerId());
+ }
+ sb.append(')');
+ } else if (className.equals("java.lang.Thread") && method.equals("join")) {
+ sb.append(" (on completion of thread ").append(info.getLockOwnerId()).append(')');
+ } else {
+ sb.append(" (parking for lock");
+ if (info.getLockOwnerName() != null) {
+ sb.append(" owned by \"");
+ sb.append(info.getLockOwnerName()).append("\" Id=").append(info.getLockOwnerId());
+ }
+ sb.append(')');
+ }
+ break;
+ }
+ case TIMED_WAITING: {
+ final StackTraceElement element = info.getStackTrace()[0];
+ final String className = element.getClassName();
+ final String method = element.getMethodName();
+ if (className.equals("java.lang.Object") && method.equals("wait")) {
+ sb.append(" (on object monitor");
+ if (info.getLockOwnerName() != null) {
+ sb.append(" owned by \"");
+ sb.append(info.getLockOwnerName()).append("\" Id=").append(info.getLockOwnerId());
+ }
+ sb.append(')');
+ } else if (className.equals("java.lang.Thread") && method.equals("sleep")) {
+ sb.append(" (sleeping)");
+ } else if (className.equals("java.lang.Thread") && method.equals("join")) {
+ sb.append(" (on completion of thread ").append(info.getLockOwnerId()).append(')');
+ } else {
+ sb.append(" (parking for lock");
+ if (info.getLockOwnerName() != null) {
+ sb.append(" owned by \"");
+ sb.append(info.getLockOwnerName()).append("\" Id=").append(info.getLockOwnerId());
+ }
+ sb.append(')');
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}