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>