You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2018/04/09 15:58:18 UTC

[1/3] logging-log4j2 git commit: adding log4j2.forceTCLOnly option

Repository: logging-log4j2
Updated Branches:
  refs/heads/master ffd4ab638 -> 1ee85dcb6


adding log4j2.forceTCLOnly option


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/fbde9cd0
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/fbde9cd0
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/fbde9cd0

Branch: refs/heads/master
Commit: fbde9cd0efb8b50098724e668b0474116761cd81
Parents: ffd4ab6
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Tue Jan 9 11:59:52 2018 +0100
Committer: Romain Manni-Bucau <rm...@gmail.com>
Committed: Mon Apr 9 12:01:39 2018 +0200

----------------------------------------------------------------------
 .../apache/logging/log4j/util/LoaderUtil.java   | 50 ++++++++++++-----
 .../logging/log4j/util/LoaderUtilTest.java      | 58 ++++++++++++++++++++
 2 files changed, 93 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fbde9cd0/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
index 2a153b1..84ce69f 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
@@ -44,6 +44,7 @@ public final class LoaderUtil {
      * @since 2.1
      */
     public static final String IGNORE_TCCL_PROPERTY = "log4j.ignoreTCL";
+    public static final String FORCE_TCL_ONLY_PROPERTY = "log4j.forceTCLOnly";
 
     private static final SecurityManager SECURITY_MANAGER = System.getSecurityManager();
 
@@ -53,6 +54,8 @@ public final class LoaderUtil {
 
     private static final boolean GET_CLASS_LOADER_DISABLED;
 
+    protected static Boolean forceTcclOnly;
+
     private static final PrivilegedAction<ClassLoader> TCCL_GETTER = new ThreadContextClassLoaderGetter();
 
     static {
@@ -109,21 +112,23 @@ public final class LoaderUtil {
         List<ClassLoader> classLoaders = new ArrayList<>();
         ClassLoader tcl = getThreadContextClassLoader();
         classLoaders.add(tcl);
-        ClassLoader current = LoaderUtil.class.getClassLoader();
-        if (current != tcl) {
-            classLoaders.add(current);
-            ClassLoader parent = current.getParent();
+        if (!isForceTccl()) {
+            ClassLoader current = LoaderUtil.class.getClassLoader();
+            if (current != tcl) {
+                classLoaders.add(current);
+                ClassLoader parent = current.getParent();
+                while (parent != null && !classLoaders.contains(parent)) {
+                    classLoaders.add(parent);
+                }
+            }
+            ClassLoader parent = tcl.getParent();
             while (parent != null && !classLoaders.contains(parent)) {
                 classLoaders.add(parent);
+                parent = parent.getParent();
+            }
+            if (!classLoaders.contains(ClassLoader.getSystemClassLoader())) {
+                classLoaders.add(ClassLoader.getSystemClassLoader());
             }
-        }
-        ClassLoader parent = tcl.getParent();
-        while (parent != null && !classLoaders.contains(parent)) {
-            classLoaders.add(parent);
-            parent = parent.getParent();
-        }
-        if (!classLoaders.contains(ClassLoader.getSystemClassLoader())) {
-            classLoaders.add(ClassLoader.getSystemClassLoader());
         }
         return classLoaders.toArray(new ClassLoader[classLoaders.size()]);
     }
@@ -260,6 +265,21 @@ public final class LoaderUtil {
         return ignoreTCCL;
     }
 
+    private static boolean isForceTccl() {
+        if (forceTcclOnly == null) {
+            // PropertiesUtil.getProperties() uses that code path so don't use that!
+            forceTcclOnly = System.getSecurityManager() == null ?
+                    Boolean.getBoolean(FORCE_TCL_ONLY_PROPERTY) :
+                    AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
+                        @Override
+                        public Boolean run() {
+                            return Boolean.getBoolean(FORCE_TCL_ONLY_PROPERTY);
+                        }
+                    });
+        }
+        return forceTcclOnly;
+    }
+
     /**
      * Finds classpath {@linkplain URL resources}.
      *
@@ -279,9 +299,9 @@ public final class LoaderUtil {
     static Collection<UrlResource> findUrlResources(final String resource) {
         // @formatter:off
         final ClassLoader[] candidates = {
-                getThreadContextClassLoader(), 
-                LoaderUtil.class.getClassLoader(),
-                GET_CLASS_LOADER_DISABLED ? null : ClassLoader.getSystemClassLoader()};
+                getThreadContextClassLoader(),
+                isForceTccl() ? null : LoaderUtil.class.getClassLoader(),
+                isForceTccl() || GET_CLASS_LOADER_DISABLED ? null : ClassLoader.getSystemClassLoader()};
         // @formatter:on
         final Collection<UrlResource> resources = new LinkedHashSet<>();
         for (final ClassLoader cl : candidates) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fbde9cd0/log4j-api/src/test/java/org/apache/logging/log4j/util/LoaderUtilTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/LoaderUtilTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/LoaderUtilTest.java
new file mode 100644
index 0000000..c30041e
--- /dev/null
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/LoaderUtilTest.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.util;
+
+import static org.junit.Assert.assertEquals;
+
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class LoaderUtilTest {
+    @Before
+    @After
+    public void reset() {
+        LoaderUtil.forceTcclOnly = null;
+    }
+
+    @Test
+    public void systemClassLoader() {
+        final Thread thread = Thread.currentThread();
+        final ClassLoader tccl = thread.getContextClassLoader();
+
+        LoaderUtil.forceTcclOnly = true;
+        final ClassLoader loader = new ClassLoader(tccl) {
+            @Override
+            public Enumeration<URL> getResources(final String name) {
+                return Collections.emptyEnumeration();
+            }
+        };
+        thread.setContextClassLoader(loader);
+        try {
+            assertEquals(0, LoaderUtil.findUrlResources("Log4j-charsets.properties").size());
+
+            LoaderUtil.forceTcclOnly = false;
+            assertEquals(1, LoaderUtil.findUrlResources("Log4j-charsets.properties").size());
+        } finally {
+            thread.setContextClassLoader(tccl);
+        }
+    }
+}


[3/3] logging-log4j2 git commit: adding back the doc

Posted by ma...@apache.org.
adding back the doc


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/1ee85dcb
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/1ee85dcb
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/1ee85dcb

Branch: refs/heads/master
Commit: 1ee85dcb6e0ea0e07d840adbe6eb67639aa2283e
Parents: 28c6ec2
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Mon Apr 9 17:05:32 2018 +0200
Committer: Romain Manni-Bucau <rm...@gmail.com>
Committed: Mon Apr 9 17:05:32 2018 +0200

----------------------------------------------------------------------
 src/site/asciidoc/manual/configuration.adoc | 8 ++++++++
 1 file changed, 8 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ee85dcb/src/site/asciidoc/manual/configuration.adoc
----------------------------------------------------------------------
diff --git a/src/site/asciidoc/manual/configuration.adoc b/src/site/asciidoc/manual/configuration.adoc
index 138e3f0..aef2a6b 100644
--- a/src/site/asciidoc/manual/configuration.adoc
+++ b/src/site/asciidoc/manual/configuration.adoc
@@ -1841,6 +1841,14 @@ Windows.
 Otherwise, an attempt is made to load classes with the current thread's
 context class loader before falling back to the default class loader.
 
+
+|[[forceTCLOnly]]log4j2.forceTCLOnly +
+([[log4j.forceTCLOnly]]log4j.forceTCLOnly)
+|LOG4J_FORCE_TCL_ONLY
+|false
+|If `true`, classes and configuration are only loaded with the default context class loader.
+Otherwise, log4j also uses the log4j classloader, parent classloaders and the system classloader.
+
 |[[uuidSequence]]log4j2.uuidSequence +
 ([[org.apache.logging.log4j.uuidSequence]]org.apache.logging.log4j.uuidSequence)
 |LOG4J_UUID_SEQUENCE


[2/3] logging-log4j2 git commit: fixing tests after rebase + adding jira in changes.xml

Posted by ma...@apache.org.
fixing tests after rebase + adding jira in changes.xml


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/28c6ec24
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/28c6ec24
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/28c6ec24

Branch: refs/heads/master
Commit: 28c6ec246f084cea9d58e918c888ef82fc57eb57
Parents: fbde9cd
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Mon Apr 9 13:53:44 2018 +0200
Committer: Romain Manni-Bucau <rm...@gmail.com>
Committed: Mon Apr 9 13:53:44 2018 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/logging/log4j/util/LoaderUtil.java    | 6 +++++-
 src/changes/changes.xml                                        | 3 +++
 2 files changed, 8 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/28c6ec24/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
index 84ce69f..3923c7c 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
@@ -268,7 +268,8 @@ public final class LoaderUtil {
     private static boolean isForceTccl() {
         if (forceTcclOnly == null) {
             // PropertiesUtil.getProperties() uses that code path so don't use that!
-            forceTcclOnly = System.getSecurityManager() == null ?
+            try {
+                forceTcclOnly = System.getSecurityManager() == null ?
                     Boolean.getBoolean(FORCE_TCL_ONLY_PROPERTY) :
                     AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
                         @Override
@@ -276,6 +277,9 @@ public final class LoaderUtil {
                             return Boolean.getBoolean(FORCE_TCL_ONLY_PROPERTY);
                         }
                     });
+            } catch (final SecurityException se) {
+                forceTcclOnly = false;
+            }
         }
         return forceTcclOnly;
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/28c6ec24/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ad7e632..9ebfc4a 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -31,6 +31,9 @@
          - "remove" - Removed
     -->
     <release version="3.0.0" date="2018-xx-xx" description="GA Release 3.0.0">
+      <action issue="LOG4J2-2171" dev="rmannibucau" type="add">
+        Allow to force LOG4J2 to use TCCL only.
+      </action>
       <action issue="LOG4J2-1802" dev="mattsicker" type="add">
         Convert documentation into AsciiDoc format.
       </action>