You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2022/01/20 21:41:32 UTC

[logging-log4j2] branch master updated: Log4j 1.2 bridge uses the wrong default values for a TTCCLayout #709.

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

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/master by this push:
     new d5ed187  Log4j 1.2 bridge uses the wrong default values for a TTCCLayout #709.
d5ed187 is described below

commit d5ed187ca420bba5df0ad5feb1107256e157f562
Author: ppkarwasz <pi...@karwasz.org>
AuthorDate: Thu Jan 20 22:33:06 2022 +0100

    Log4j 1.2 bridge uses the wrong default values for a TTCCLayout #709.
---
 .../org/apache/log4j/builders/AbstractBuilder.java |  7 ++--
 .../log4j/builders/layout/TTCCLayoutBuilder.java   | 37 +++++++++++-----------
 .../config/AbstractLog4j1ConfigurationTest.java    | 26 +++++++++++++++
 .../config/Log4j1ConfigurationFactoryTest.java     | 26 +++++++--------
 .../log4j/config/PropertiesConfigurationTest.java  |  6 ++++
 .../apache/log4j/config/XmlConfigurationTest.java  |  6 ++++
 .../config-1.2/log4j-console-TTCCLayout.xml        | 20 ++++++++++++
 src/changes/changes.xml                            |  3 ++
 8 files changed, 97 insertions(+), 34 deletions(-)

diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/AbstractBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/AbstractBuilder.java
index eb21e84..e4037ef 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/AbstractBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/AbstractBuilder.java
@@ -110,8 +110,12 @@ public abstract class AbstractBuilder {
         return new String(chars);
     }
 
+    public boolean getBooleanProperty(final String key, final boolean defaultValue) {
+        return Boolean.parseBoolean(getProperty(key, Boolean.toString(defaultValue)));
+    }
+
     public boolean getBooleanProperty(final String key) {
-        return Boolean.parseBoolean(getProperty(key, Boolean.FALSE.toString()));
+        return getBooleanProperty(key, false);
     }
 
     public int getIntegerProperty(final String key, final int defaultValue) {
@@ -175,5 +179,4 @@ public abstract class AbstractBuilder {
         chars[0] = Character.toLowerCase(chars[0]);
         return new String(chars);
     }
-
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java
index ce54fd8..a2a2226 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java
@@ -16,25 +16,24 @@
  */
 package org.apache.log4j.builders.layout;
 
+import static org.apache.log4j.builders.BuilderManager.CATEGORY;
+import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
+
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.log4j.Layout;
 import org.apache.log4j.bridge.LayoutWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.BooleanHolder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.xml.XmlConfiguration;
-import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.status.StatusLogger;
 import org.w3c.dom.Element;
 
-import java.util.Properties;
-
-import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.xml.XmlConfiguration.*;
-
 /**
  * Build a Pattern Layout
  */
@@ -56,12 +55,12 @@ public class TTCCLayoutBuilder extends AbstractBuilder implements LayoutBuilder
 
     @Override
     public Layout parseLayout(Element layoutElement, XmlConfiguration config) {
-        final Holder<Boolean> threadPrinting = new BooleanHolder();
-        final Holder<Boolean> categoryPrefixing = new BooleanHolder();
-        final Holder<Boolean> contextPrinting = new BooleanHolder();
-        final Holder<String> dateFormat = new Holder<>();
-        final Holder<String> timezone = new Holder<>();
-        forEachElement(layoutElement.getElementsByTagName("param"), (currentElement) -> {
+        final AtomicBoolean threadPrinting = new AtomicBoolean(Boolean.TRUE);
+        final AtomicBoolean categoryPrefixing = new AtomicBoolean(Boolean.TRUE);
+        final AtomicBoolean contextPrinting = new AtomicBoolean(Boolean.TRUE);
+        final AtomicReference<String> dateFormat = new AtomicReference<>(RELATIVE);
+        final AtomicReference<String> timezone = new AtomicReference<>();
+        forEachElement(layoutElement.getElementsByTagName("param"), currentElement -> {
             if (currentElement.getTagName().equals(PARAM_TAG)) {
                 switch (getNameAttributeKey(currentElement)) {
                     case THREAD_PRINTING_PARAM:
@@ -88,10 +87,10 @@ public class TTCCLayoutBuilder extends AbstractBuilder implements LayoutBuilder
 
     @Override
     public Layout parseLayout(PropertiesConfiguration config) {
-        boolean threadPrinting = getBooleanProperty(THREAD_PRINTING_PARAM);
-        boolean categoryPrefixing = getBooleanProperty(CATEGORY_PREFIXING_PARAM);
-        boolean contextPrinting = getBooleanProperty(CONTEXT_PRINTING_PARAM);
-        String dateFormat = getProperty(DATE_FORMAT_PARAM);
+        boolean threadPrinting = getBooleanProperty(THREAD_PRINTING_PARAM, true);
+        boolean categoryPrefixing = getBooleanProperty(CATEGORY_PREFIXING_PARAM, true);
+        boolean contextPrinting = getBooleanProperty(CONTEXT_PRINTING_PARAM, true);
+        String dateFormat = getProperty(DATE_FORMAT_PARAM, RELATIVE);
         String timezone = getProperty(TIMEZONE_FORMAT);
 
         return createLayout(threadPrinting, categoryPrefixing, contextPrinting,
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/config/AbstractLog4j1ConfigurationTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/config/AbstractLog4j1ConfigurationTest.java
index 69d2c09..83fc2df 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/config/AbstractLog4j1ConfigurationTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/config/AbstractLog4j1ConfigurationTest.java
@@ -22,9 +22,13 @@ import static org.junit.Assert.assertNotNull;
 import java.io.IOException;
 import java.net.URISyntaxException;
 
+import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.appender.ConsoleAppender;
+import org.apache.logging.log4j.core.appender.ConsoleAppender.Target;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 
 public abstract class AbstractLog4j1ConfigurationTest {
@@ -55,4 +59,26 @@ public abstract class AbstractLog4j1ConfigurationTest {
         assertEquals(expected.getCharset(), actual.getCharset());
         assertEquals(expected.getConversionPattern(), actual.getConversionPattern());
     }
+
+    private Layout<?> testConsole(final String configResource) throws Exception {
+        final Configuration configuration = getConfiguration(configResource);
+        final String name = "Console";
+        final ConsoleAppender appender = configuration.getAppender(name);
+        assertNotNull("Missing appender '" + name + "' in configuration " + configResource + " → " + configuration,
+                appender);
+        assertEquals(Target.SYSTEM_ERR, appender.getTarget());
+        //
+        final LoggerConfig loggerConfig = configuration.getLoggerConfig("com.example.foo");
+        assertNotNull(loggerConfig);
+        assertEquals(Level.DEBUG, loggerConfig.getLevel());
+        configuration.start();
+        configuration.stop();
+        return appender.getLayout();
+    }
+
+    public void testConsoleTtccLayout() throws Exception {
+        final PatternLayout layout = (PatternLayout) testConsole("config-1.2/log4j-console-TTCCLayout");
+        assertEquals("%r [%t] %p %notEmpty{%ndc }- %m%n", layout.getConversionPattern());
+    }
+
 }
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java
index f206790..a066789 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java
@@ -92,51 +92,51 @@ public class Log4j1ConfigurationFactoryTest extends AbstractLog4j1ConfigurationT
 
     @Test
     public void testConsoleEnhancedPatternLayout() throws Exception {
-       final PatternLayout layout = (PatternLayout) testConsole("config-1.2/log4j-console-EnhancedPatternLayout");
+        final PatternLayout layout = (PatternLayout) testConsole("config-1.2/log4j-console-EnhancedPatternLayout");
         assertEquals("%d{ISO8601} [%t][%c] %-5p %properties %ndc: %m%n", layout.getConversionPattern());
     }
 
     @Test
     public void testConsoleHtmlLayout() throws Exception {
-       final HtmlLayout layout = (HtmlLayout) testConsole("config-1.2/log4j-console-HtmlLayout");
+        final HtmlLayout layout = (HtmlLayout) testConsole("config-1.2/log4j-console-HtmlLayout");
         assertEquals("Headline", layout.getTitle());
         assertTrue(layout.isLocationInfo());
     }
 
     @Test
     public void testConsolePatternLayout() throws Exception {
-       final PatternLayout layout = (PatternLayout) testConsole("config-1.2/log4j-console-PatternLayout");
+        final PatternLayout layout = (PatternLayout) testConsole("config-1.2/log4j-console-PatternLayout");
         assertEquals("%d{ISO8601} [%t][%c] %-5p: %m%n", layout.getConversionPattern());
     }
 
     @Test
     public void testConsoleSimpleLayout() throws Exception {
-       final PatternLayout layout = (PatternLayout) testConsole("config-1.2/log4j-console-SimpleLayout");
+        final PatternLayout layout = (PatternLayout) testConsole("config-1.2/log4j-console-SimpleLayout");
         assertEquals("%level - %m%n", layout.getConversionPattern());
     }
 
+    @Override
     @Test
     public void testConsoleTtccLayout() throws Exception {
-       final PatternLayout layout = (PatternLayout) testConsole("config-1.2/log4j-console-TTCCLayout");
-        assertEquals("%r [%t] %p %notEmpty{%ndc }- %m%n", layout.getConversionPattern());
+        super.testConsoleTtccLayout();
     }
 
     @Test
     public void testConsoleXmlLayout() throws Exception {
-       final Log4j1XmlLayout layout = (Log4j1XmlLayout) testConsole("config-1.2/log4j-console-XmlLayout");
+        final Log4j1XmlLayout layout = (Log4j1XmlLayout) testConsole("config-1.2/log4j-console-XmlLayout");
         assertTrue(layout.isLocationInfo());
         assertFalse(layout.isProperties());
     }
 
     @Test
     public void testFileSimpleLayout() throws Exception {
-       final PatternLayout layout = (PatternLayout) testFile("config-1.2/log4j-file-SimpleLayout");
+        final PatternLayout layout = (PatternLayout) testFile("config-1.2/log4j-file-SimpleLayout");
         assertEquals("%level - %m%n", layout.getConversionPattern());
     }
 
     @Test
     public void testNullAppender() throws Exception {
-       final Configuration configuration = getConfiguration("config-1.2/log4j-NullAppender");
+        final Configuration configuration = getConfiguration("config-1.2/log4j-NullAppender");
         final Appender appender = configuration.getAppender("NullAppender");
         assertNotNull(appender);
         assertEquals("NullAppender", appender.getName());
@@ -145,17 +145,17 @@ public class Log4j1ConfigurationFactoryTest extends AbstractLog4j1ConfigurationT
 
     @Test
     public void testRollingFileAppender() throws Exception {
-       testRollingFileAppender("config-1.2/log4j-RollingFileAppender", "RFA", "target/hadoop.log.%i");
+        testRollingFileAppender("config-1.2/log4j-RollingFileAppender", "RFA", "target/hadoop.log.%i");
     }
 
     @Test
     public void testDailyRollingFileAppender() throws Exception {
-       testDailyRollingFileAppender("config-1.2/log4j-DailyRollingFileAppender", "DRFA", "target/hadoop.log%d{.yyyy-MM-dd}");
+        testDailyRollingFileAppender("config-1.2/log4j-DailyRollingFileAppender", "DRFA", "target/hadoop.log%d{.yyyy-MM-dd}");
     }
 
     @Test
     public void testRollingFileAppenderWithProperties() throws Exception {
-       testRollingFileAppender("config-1.2/log4j-RollingFileAppender-with-props", "RFA", "target/hadoop.log.%i");
+        testRollingFileAppender("config-1.2/log4j-RollingFileAppender-with-props", "RFA", "target/hadoop.log.%i");
     }
 
     @Test
@@ -180,7 +180,7 @@ public class Log4j1ConfigurationFactoryTest extends AbstractLog4j1ConfigurationT
 
     @Test
     public void testSystemProperties2() throws Exception {
-       final Configuration configuration = getConfiguration("config-1.2/log4j-system-properties-2");
+        final Configuration configuration = getConfiguration("config-1.2/log4j-system-properties-2");
         final RollingFileAppender appender = configuration.getAppender("RFA");
         assertEquals("${java.io.tmpdir}/hadoop.log", appender.getFileName());
         appender.stop(10, TimeUnit.SECONDS);
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/config/PropertiesConfigurationTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/config/PropertiesConfigurationTest.java
index bd3a291..f3ee8f6 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/config/PropertiesConfigurationTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/config/PropertiesConfigurationTest.java
@@ -188,4 +188,10 @@ public class PropertiesConfigurationTest extends AbstractLog4j1ConfigurationTest
         super.testConsoleCapitalization();
     }
 
+    @Override
+    @Test
+    public void testConsoleTtccLayout() throws Exception {
+        super.testConsoleTtccLayout();
+    }
+
 }
\ No newline at end of file
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/config/XmlConfigurationTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/config/XmlConfigurationTest.java
index 8c912fa..1e5d9b7 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/config/XmlConfigurationTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/config/XmlConfigurationTest.java
@@ -115,4 +115,10 @@ public class XmlConfigurationTest extends AbstractLog4j1ConfigurationTest {
         super.testConsoleCapitalization();
     }
 
+    @Override
+    @Test
+    public void testConsoleTtccLayout() throws Exception {
+        super.testConsoleTtccLayout();
+    }
+
 }
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.xml b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.xml
new file mode 100644
index 0000000..c900c7b
--- /dev/null
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+  <appender name="Console" class="org.apache.log4j.ConsoleAppender">
+    <param name="Target" value="System.err" />
+    <layout class="org.apache.log4j.TTCCLayout">
+      <param name="ThreadPrinting" value="true" />
+      <param name="CategoryPrefixing" value="false" />
+    </layout>
+  </appender>
+
+  <logger name="com.example.foo">
+    <level value="DEBUG" />
+  </logger>
+
+  <root>
+    <priority value="trace" />
+    <appender-ref ref="Console" />
+  </root>
+</log4j:configuration>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 22740ae..c5e3ab2 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -278,6 +278,9 @@
       <action dev="ggregory" type="fix" due-to="Gary Gregory, Piotr P. Karwasz">
         Log4j 1.2 bridge should allow property and XML attributes to start with either an upper-case or lower-case letter.
       </action>
+      <action dev="ggregory" type="fix" due-to="Gary Gregory, Piotr P. Karwasz">
+        Log4j 1.2 bridge uses the wrong default values for a TTCCLayout #709.
+      </action>
       <action dev="ggregory" type="fix" issue="LOG4J2-3330" due-to="Mircea Lemnaru, Gary Gregory">
         Configurator.setLevel not fetching the correct LoggerContext.
       </action>