You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2022/08/16 01:07:09 UTC

[tomcat] branch 8.5.x updated: [Bug 66184] Ensure that all root loggers have a level or parent

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 8.5.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/8.5.x by this push:
     new 55067d1ff1 [Bug 66184] Ensure that all root loggers have a level or parent
55067d1ff1 is described below

commit 55067d1ff1f37cbac297f1391c7b861ff0162c97
Author: Piotr P. Karwasz <pi...@karwasz.org>
AuthorDate: Thu Jul 28 21:04:22 2022 +0200

    [Bug 66184] Ensure that all root loggers have a level or parent
    
    Since Java 8 the default level of a root logger is no longer set in the
    constructor. This PR sets the level to INFO (LogManager's default) if it
    is absent.
---
 java/org/apache/juli/ClassLoaderLogManager.java    |  4 ++
 .../org/apache/juli/TestClassLoaderLogManager.java | 57 ++++++++++++++++++++++
 webapps/docs/changelog.xml                         |  9 ++++
 3 files changed, 70 insertions(+)

diff --git a/java/org/apache/juli/ClassLoaderLogManager.java b/java/org/apache/juli/ClassLoaderLogManager.java
index 2243e5703e..53f99f50f1 100644
--- a/java/org/apache/juli/ClassLoaderLogManager.java
+++ b/java/org/apache/juli/ClassLoaderLogManager.java
@@ -536,6 +536,10 @@ public class ClassLoaderLogManager extends LogManager {
         if (is != null) {
             readConfiguration(is, classLoader);
         }
+
+        if (localRootLogger.getParent() == null && localRootLogger.getLevel() == null) {
+            localRootLogger.setLevel(Level.INFO);
+        }
         try {
             // Use a ThreadLocal to work around
             // https://bugs.openjdk.java.net/browse/JDK-8195096
diff --git a/test/org/apache/juli/TestClassLoaderLogManager.java b/test/org/apache/juli/TestClassLoaderLogManager.java
index 641a52b936..8628deac16 100644
--- a/test/org/apache/juli/TestClassLoaderLogManager.java
+++ b/test/org/apache/juli/TestClassLoaderLogManager.java
@@ -16,9 +16,13 @@
  */
 package org.apache.juli;
 
+import java.io.ByteArrayInputStream;
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Collections;
 import java.util.Random;
+import java.util.logging.Level;
 import java.util.logging.LogManager;
 import java.util.logging.Logger;
 
@@ -30,6 +34,8 @@ import org.junit.Test;
  */
 public class TestClassLoaderLogManager {
 
+    private static final byte[] EMPTY_BYTES = {};
+
     @Test
     public void testReplace() {
         ClassLoaderLogManager logManager = new ClassLoaderLogManager();
@@ -81,6 +87,26 @@ public class TestClassLoaderLogManager {
         listThread.setRunning(false);
     }
 
+    /**
+     * Tests if a per-app root logger has a not {@code null} level.
+     */
+    @Test
+    public void testBug66184() throws IOException {
+        final ClassLoader cl = new TestClassLoader();
+        final ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(cl);
+            final ClassLoaderLogManager logManager = new ClassLoaderLogManager();
+            logManager.readConfiguration();
+            final Logger rootLogger = logManager.getLogger("");
+            Assert.assertNotNull("root logger is null", rootLogger);
+            Assert.assertNull("root logger has a parent", rootLogger.getParent());
+            Assert.assertEquals(Level.INFO, rootLogger.getLevel());
+        } finally {
+            Thread.currentThread().setContextClassLoader(oldCL);
+        }
+    }
+
     private static class LoggerCreateThread extends Thread {
 
         private final LogManager logManager;
@@ -133,4 +159,35 @@ public class TestClassLoaderLogManager {
             this.running = running;
         }
     }
+
+    private static class TestClassLoader extends ClassLoader implements WebappProperties {
+
+        @Override
+        public String getWebappName() {
+            return "webapp";
+        }
+
+        @Override
+        public String getHostName() {
+            return "localhost";
+        }
+
+        @Override
+        public String getServiceName() {
+            return "Catalina";
+        }
+
+        @Override
+        public boolean hasLoggingConfig() {
+            return true;
+        }
+
+        @Override
+        public InputStream getResourceAsStream(final String resource) {
+            if ("logging.properties".equals(resource)) {
+                return new ByteArrayInputStream(EMPTY_BYTES);
+            }
+            return null;
+        }
+    }
 }
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 03ac1895c5..80de61c8e3 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -105,6 +105,15 @@
   issues do not "pop up" wrt. others).
 -->
 <section name="Tomcat 8.5.83 (schultz)" rtext="in development">
+  <subsection name="Catalina">
+    <changelog>
+      <fix>
+        <bug>66184</bug>: Ensure that JULI root loggers have a default level of
+        <code>INFO</code>. Pull request <pr>533</pr> provided by Piotr P.
+        Karwasz. (markt)
+      </fix>
+    </changelog>
+  </subsection>
   <subsection name="Other">
     <changelog>
       <fix>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org