You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2022/03/28 22:10:52 UTC

[logging-log4j2] branch master updated (9c44138 -> fdd2cab)

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

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


    from 9c44138  Use exponential backoff for file cleaner
     new afdfec9  Not a useless Javadoc comment.
     new b39bb0f  Fix Javsdocs.
     new a035a73  Log4j 1.2 bridge creates a SocketAppender instead of a SyslogAppender.
     new 675dbd9  Avoid NPEs in edge cases for bridge clients.
     new fdd2cab  Adds support for missing Log4j 1.x properties and fixes default values (#737)

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/log4j/PropertyConfigurator.java     |  30 ++--
 .../org/apache/log4j/builders/AbstractBuilder.java |   8 +-
 .../org/apache/log4j/builders/BooleanHolder.java   |   6 +-
 .../builders/appender/ConsoleAppenderBuilder.java  |  54 ++++--
 .../appender/DailyRollingFileAppenderBuilder.java  |  58 +++++--
 .../builders/appender/FileAppenderBuilder.java     |  23 ++-
 .../appender/RollingFileAppenderBuilder.java       |  51 ++++--
 .../builders/appender/SyslogAppenderBuilder.java   |   8 +-
 .../log4j/builders/layout/HtmlLayoutBuilder.java   |   9 +-
 .../log4j/builders/layout/TTCCLayoutBuilder.java   |   2 +-
 .../log4j/config/Log4j1ConfigurationParser.java    |  28 +++-
 .../log4j/config/PropertiesConfiguration.java      |  51 +++---
 .../config/AbstractLog4j1ConfigurationTest.java    | 182 ++++++++++++++++++---
 .../config/Log4j1ConfigurationFactoryTest.java     |   5 +
 .../log4j/config/PropertiesConfigurationTest.java  |   6 +
 .../config/SyslogAppenderConfigurationTest.java    |  26 ++-
 .../apache/log4j/config/XmlConfigurationTest.java  |   6 +
 .../log4j-DailyRollingFileAppender.properties      |   6 +-
 .../config-1.2/log4j-DailyRollingFileAppender.xml  |   6 +-
 .../log4j-FileAppender-with-props.properties       |   6 +-
 ...log4j-RollingFileAppender-with-props.properties |   5 +-
 .../log4j-RollingFileAppender.properties           |   5 +-
 .../config-1.2/log4j-RollingFileAppender.xml       |   4 +
 .../log4j-console-EnhancedPatternLayout.properties |   1 +
 .../log4j-console-EnhancedPatternLayout.xml        |   1 +
 .../config-1.2/log4j-console-HtmlLayout.properties |   1 +
 .../config-1.2/log4j-console-HtmlLayout.xml        |   1 +
 .../log4j-console-PatternLayout.properties         |   1 +
 .../config-1.2/log4j-console-PatternLayout.xml     |   1 +
 .../log4j-console-SimpleLayout.properties          |   1 +
 .../config-1.2/log4j-console-SimpleLayout.xml      |   1 +
 .../config-1.2/log4j-console-TTCCLayout.properties |   6 +-
 .../config-1.2/log4j-console-TTCCLayout.xml        |   6 +-
 .../config-1.2/log4j-console-XmlLayout.properties  |   1 +
 .../config-1.2/log4j-defaultValues.properties      |  82 ++++++++++
 .../resources/config-1.2/log4j-defaultValues.xml   |  66 ++++++++
 .../config-1.2/log4j-file-SimpleLayout.properties  |   4 +
 .../config-1.2/log4j-file-SimpleLayout.xml         |   4 +
 .../log4j-system-properties-1.properties           |   6 +
 .../config-1.2/log4j-system-properties-1.xml       |   8 +-
 .../log4j-system-properties-2.properties           |   6 +
 .../log4j1-syslog-protocol-default.properties      |   3 +-
 .../log4j1-syslog-protocol-tcp.properties          |   3 +-
 .../log4j1-syslog-protocol-udp.properties          |   3 +-
 .../log4j/core/appender/SyslogAppender.java        |   2 +-
 .../log4j/core/net/AbstractSocketManager.java      |  21 ++-
 src/changes/changes.xml                            |  10 +-
 47 files changed, 658 insertions(+), 166 deletions(-)
 create mode 100644 log4j-1.2-api/src/test/resources/config-1.2/log4j-defaultValues.properties
 create mode 100644 log4j-1.2-api/src/test/resources/config-1.2/log4j-defaultValues.xml

[logging-log4j2] 04/05: Avoid NPEs in edge cases for bridge clients.

Posted by pk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 675dbd9a37d76256f8ce43c80a0e50dbf90e6c8f
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Mon Jan 24 13:42:24 2022 -0500

    Avoid NPEs in edge cases for bridge clients.
---
 .../org/apache/log4j/PropertyConfigurator.java     | 30 ++++++++++++----------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/PropertyConfigurator.java b/log4j-1.2-api/src/main/java/org/apache/log4j/PropertyConfigurator.java
index 45a96d4..d522d57 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/PropertyConfigurator.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/PropertyConfigurator.java
@@ -644,20 +644,22 @@ public class PropertyConfigurator implements Configurator {
 
     private void parseErrorHandler(final ErrorHandler errorHandler, final String errorHandlerPrefix, final Properties props,
         final LoggerRepository loggerRepository) {
-        final boolean rootRef = OptionConverter.toBoolean(OptionConverter.findAndSubst(errorHandlerPrefix + ROOT_REF, props), false);
-        if (rootRef) {
-            errorHandler.setLogger(loggerRepository.getRootLogger());
-        }
-        final String loggerName = OptionConverter.findAndSubst(errorHandlerPrefix + LOGGER_REF, props);
-        if (loggerName != null) {
-            final Logger logger = (loggerFactory == null) ? loggerRepository.getLogger(loggerName) : loggerRepository.getLogger(loggerName, loggerFactory);
-            errorHandler.setLogger(logger);
-        }
-        final String appenderName = OptionConverter.findAndSubst(errorHandlerPrefix + APPENDER_REF_TAG, props);
-        if (appenderName != null) {
-            final Appender backup = parseAppender(props, appenderName);
-            if (backup != null) {
-                errorHandler.setBackupAppender(backup);
+        if (errorHandler != null && loggerRepository != null) {
+            final boolean rootRef = OptionConverter.toBoolean(OptionConverter.findAndSubst(errorHandlerPrefix + ROOT_REF, props), false);
+            if (rootRef) {
+                errorHandler.setLogger(loggerRepository.getRootLogger());
+            }
+            final String loggerName = OptionConverter.findAndSubst(errorHandlerPrefix + LOGGER_REF, props);
+            if (loggerName != null) {
+                final Logger logger = loggerFactory == null ? loggerRepository.getLogger(loggerName) : loggerRepository.getLogger(loggerName, loggerFactory);
+                errorHandler.setLogger(logger);
+            }
+            final String appenderName = OptionConverter.findAndSubst(errorHandlerPrefix + APPENDER_REF_TAG, props);
+            if (appenderName != null) {
+                final Appender backup = parseAppender(props, appenderName);
+                if (backup != null) {
+                    errorHandler.setBackupAppender(backup);
+                }
             }
         }
     }

[logging-log4j2] 02/05: Fix Javsdocs.

Posted by pk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit b39bb0fca42258141a244ce9440893048f6fab6d
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sat Jan 22 11:41:12 2022 -0500

    Fix Javsdocs.
---
 .../log4j/config/PropertiesConfiguration.java      | 51 ++++++++++------------
 1 file changed, 22 insertions(+), 29 deletions(-)

diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
index dd49c65..d0ba733 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
@@ -156,23 +156,20 @@ public class PropertiesConfiguration extends Log4j1Configuration {
      * Reads a configuration from a file. <b>The existing configuration is not cleared nor reset.</b> If you require a
      * different behavior, then call {@link LogManager#resetConfiguration resetConfiguration} method before calling
      * <code>doConfigure</code>.
-     *
      * <p>
      * The configuration file consists of statements in the format <code>key=value</code>. The syntax of different
      * configuration elements are discussed below.
-     *
+     * </p>
      * <p>
      * The level value can consist of the string values OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL or a <em>custom level</em>
      * value. A custom level value can be specified in the form level#classname. By default the repository-wide threshold is
      * set to the lowest possible value, namely the level <code>ALL</code>.
      * </p>
      *
-     *
      * <h3>Appender configuration</h3>
-     *
      * <p>
      * Appender configuration syntax is:
-     * 
+     * </p>
      * <pre>
      * # For appender named <i>appenderName</i>, set its class.
      * # Note: The appender name can contain dots.
@@ -185,7 +182,7 @@ public class PropertiesConfiguration extends Log4j1Configuration {
      * </pre>
      * <p>
      * For each named appender you can configure its {@link Layout}. The syntax for configuring an appender's layout is:
-     * 
+     * </p>
      * <pre>
      * log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
      * log4j.appender.appenderName.layout.option1=value1
@@ -194,19 +191,20 @@ public class PropertiesConfiguration extends Log4j1Configuration {
      * </pre>
      * <p>
      * The syntax for adding {@link Filter}s to an appender is:
-     * 
+     * </p>
      * <pre>
      * log4j.appender.appenderName.filter.ID=fully.qualified.name.of.filter.class
      * log4j.appender.appenderName.filter.ID.option1=value1
      * ...
      * log4j.appender.appenderName.filter.ID.optionN=valueN
      * </pre>
-     * 
+     * <p>
      * The first line defines the class name of the filter identified by ID; subsequent lines with the same ID specify
      * filter option - value pairs. Multiple filters are added to the appender in the lexicographic order of IDs.
+     * </p>
      * <p>
      * The syntax for adding an {@link ErrorHandler} to an appender is:
-     * 
+     * </p>
      * <pre>
      * log4j.appender.appenderName.errorhandler=fully.qualified.name.of.errorhandler.class
      * log4j.appender.appenderName.errorhandler.appender-ref=appenderName
@@ -216,60 +214,57 @@ public class PropertiesConfiguration extends Log4j1Configuration {
      * </pre>
      *
      * <h3>Configuring loggers</h3>
-     *
      * <p>
      * The syntax for configuring the root logger is:
-     * 
+     * </p>
      * <pre>
      * log4j.rootLogger=[level], appenderName, appenderName, ...
      * </pre>
-     *
      * <p>
      * This syntax means that an optional <em>level</em> can be supplied followed by appender names separated by commas.
-     *
+     * </p>
      * <p>
      * The level value can consist of the string values OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL or a <em>custom level</em>
      * value. A custom level value can be specified in the form <code>level#classname</code>.
-     *
+     * </p>
      * <p>
      * If a level value is specified, then the root level is set to the corresponding level. If no level value is specified,
      * then the root level remains untouched.
-     *
+     * </p>
      * <p>
      * The root logger can be assigned multiple appenders.
-     *
+     * </p>
      * <p>
      * Each <i>appenderName</i> (separated by commas) will be added to the root logger. The named appender is defined using
      * the appender syntax defined above.
-     *
+     * </p>
      * <p>
      * For non-root categories the syntax is almost the same:
-     * 
+     * </p>
      * <pre>
      * log4j.logger.logger_name=[level|INHERITED|NULL], appenderName, appenderName, ...
      * </pre>
-     *
      * <p>
      * The meaning of the optional level value is discussed above in relation to the root logger. In addition however, the
      * value INHERITED can be specified meaning that the named logger should inherit its level from the logger hierarchy.
-     *
+     * </p>
      * <p>
      * If no level value is supplied, then the level of the named logger remains untouched.
-     *
+     * </p>
      * <p>
      * By default categories inherit their level from the hierarchy. However, if you set the level of a logger and later
      * decide that that logger should inherit its level, then you should specify INHERITED as the value for the level value.
      * NULL is a synonym for INHERITED.
-     *
+     * </p>
      * <p>
      * Similar to the root logger syntax, each <i>appenderName</i> (separated by commas) will be attached to the named
      * logger.
-     *
+     * </p>
      * <p>
      * See the <a href="../../../../manual.html#additivity">appender additivity rule</a> in the user manual for the meaning
      * of the <code>additivity</code> flag.
-     *
-     *
+     * </p>
+     * <pre>
      * # Set options for appender named "A1". # Appender "A1" will be a SyslogAppender
      * log4j.appender.A1=org.apache.log4j.net.SyslogAppender
      *
@@ -302,14 +297,12 @@ public class PropertiesConfiguration extends Log4j1Configuration {
      * # The logger "class.of.the.day" inherits its level from the # logger hierarchy. Output will go to the appender's of
      * the root # logger, A2 in this case. log4j.logger.class.of.the.day=INHERIT
      * </pre>
-     *
      * <p>
      * Refer to the <b>setOption</b> method in each Appender and Layout for class specific options.
-     *
+     * </p>
      * <p>
      * Use the <code>#</code> or <code>!</code> characters at the beginning of a line for comments.
-     *
-     * <p>
+     * </p>
      */
     private void doConfigure(final Properties properties) {
         String status = "error";

[logging-log4j2] 01/05: Not a useless Javadoc comment.

Posted by pk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit afdfec9b42d1d8c80c975e3ef617b4c67535aed6
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sat Jan 22 10:57:46 2022 -0500

    Not a useless Javadoc comment.
---
 .../java/org/apache/log4j/config/SyslogAppenderConfigurationTest.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/config/SyslogAppenderConfigurationTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/config/SyslogAppenderConfigurationTest.java
index fd5e077..93eee35 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/config/SyslogAppenderConfigurationTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/config/SyslogAppenderConfigurationTest.java
@@ -30,7 +30,7 @@ import org.apache.logging.log4j.core.net.Protocol;
 import org.junit.Test;
 
 /**
- * Class Description goes here.
+ * Tests configuring a Syslog appender.
  */
 public class SyslogAppenderConfigurationTest {
 

[logging-log4j2] 05/05: Adds support for missing Log4j 1.x properties and fixes default values (#737)

Posted by pk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit fdd2caba9792b35df06748d1beaf7304763deb87
Author: ppkarwasz <pi...@karwasz.org>
AuthorDate: Fri Feb 4 22:06:55 2022 +0100

    Adds support for missing Log4j 1.x properties and fixes default values (#737)
    
    * Fixes default Log4j 1.x values
    
    The properties of the generated appenders are not always the same as it
    was in Log4j 1.x.
    
    * Fixes NoSuchFieldError
    
    Adapts `getAppendProperty` to different Java versions.
    
    * Fixes whitespace problems
    
    Conflicts:
    	log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/ConsoleAppenderBuilder.java
    	log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/DailyRollingFileAppenderBuilder.java
    	log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/FileAppenderBuilder.java
    	log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RollingFileAppenderBuilder.java
    	log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/HtmlLayoutBuilder.java
    	log4j-1.2-api/src/test/java/org/apache/log4j/config/PropertiesConfigurationTest.java
---
 .../org/apache/log4j/builders/AbstractBuilder.java |   2 +
 .../org/apache/log4j/builders/BooleanHolder.java   |   6 +-
 .../builders/appender/ConsoleAppenderBuilder.java  |  54 ++++--
 .../appender/DailyRollingFileAppenderBuilder.java  |  58 +++++--
 .../builders/appender/FileAppenderBuilder.java     |  23 ++-
 .../appender/RollingFileAppenderBuilder.java       |  51 ++++--
 .../log4j/builders/layout/HtmlLayoutBuilder.java   |   9 +-
 .../log4j/builders/layout/TTCCLayoutBuilder.java   |   2 +-
 .../log4j/config/Log4j1ConfigurationParser.java    |  28 +++-
 .../config/AbstractLog4j1ConfigurationTest.java    | 182 ++++++++++++++++++---
 .../config/Log4j1ConfigurationFactoryTest.java     |   5 +
 .../log4j/config/PropertiesConfigurationTest.java  |   6 +
 .../apache/log4j/config/XmlConfigurationTest.java  |   6 +
 .../log4j-DailyRollingFileAppender.properties      |   6 +-
 .../config-1.2/log4j-DailyRollingFileAppender.xml  |   6 +-
 .../log4j-FileAppender-with-props.properties       |   6 +-
 ...log4j-RollingFileAppender-with-props.properties |   5 +-
 .../log4j-RollingFileAppender.properties           |   5 +-
 .../config-1.2/log4j-RollingFileAppender.xml       |   4 +
 .../log4j-console-EnhancedPatternLayout.properties |   1 +
 .../log4j-console-EnhancedPatternLayout.xml        |   1 +
 .../config-1.2/log4j-console-HtmlLayout.properties |   1 +
 .../config-1.2/log4j-console-HtmlLayout.xml        |   1 +
 .../log4j-console-PatternLayout.properties         |   1 +
 .../config-1.2/log4j-console-PatternLayout.xml     |   1 +
 .../log4j-console-SimpleLayout.properties          |   1 +
 .../config-1.2/log4j-console-SimpleLayout.xml      |   1 +
 .../config-1.2/log4j-console-TTCCLayout.properties |   6 +-
 .../config-1.2/log4j-console-TTCCLayout.xml        |   6 +-
 .../config-1.2/log4j-console-XmlLayout.properties  |   1 +
 .../config-1.2/log4j-defaultValues.properties      |  82 ++++++++++
 .../resources/config-1.2/log4j-defaultValues.xml   |  66 ++++++++
 .../config-1.2/log4j-file-SimpleLayout.properties  |   4 +
 .../config-1.2/log4j-file-SimpleLayout.xml         |   4 +
 .../log4j-system-properties-1.properties           |   6 +
 .../config-1.2/log4j-system-properties-1.xml       |   8 +-
 .../log4j-system-properties-2.properties           |   6 +
 37 files changed, 559 insertions(+), 102 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 f7a482b..50b3ec1 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
@@ -47,9 +47,11 @@ public abstract class AbstractBuilder implements Builder {
     protected static final String APPEND_PARAM = "Append";
     protected static final String BUFFERED_IO_PARAM = "BufferedIO";
     protected static final String BUFFER_SIZE_PARAM = "BufferSize";
+    protected static final String IMMEDIATE_FLUSH_PARAM = "ImmediateFlush";
     protected static final String MAX_SIZE_PARAM = "MaxFileSize";
     protected static final String MAX_BACKUP_INDEX = "MaxBackupIndex";
     protected static final String RELATIVE = "RELATIVE";
+    protected static final String NULL = "NULL";
 
     private final String prefix;
     private final Properties properties;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BooleanHolder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BooleanHolder.java
index 16e46d3..d5319b0 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BooleanHolder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BooleanHolder.java
@@ -21,7 +21,11 @@ package org.apache.log4j.builders;
  */
 public class BooleanHolder extends Holder<Boolean> {
     public BooleanHolder() {
-        super(Boolean.FALSE);
+        this(false);
+    }
+
+    public BooleanHolder(boolean value) {
+        super(value);
     }
 
     @Override
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/ConsoleAppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/ConsoleAppenderBuilder.java
index 5f5af5d..889a4c8 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/ConsoleAppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/ConsoleAppenderBuilder.java
@@ -16,12 +16,25 @@
  */
 package org.apache.log4j.builders.appender;
 
+
+import static org.apache.log4j.builders.BuilderManager.CATEGORY;
+import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
+import static org.apache.log4j.xml.XmlConfiguration.FILTER_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.LAYOUT_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
 import org.apache.log4j.Appender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.LayoutAdapter;
 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;
@@ -33,19 +46,6 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.w3c.dom.Element;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
-import static org.apache.log4j.xml.XmlConfiguration.FILTER_TAG;
-import static org.apache.log4j.xml.XmlConfiguration.LAYOUT_TAG;
-import static org.apache.log4j.xml.XmlConfiguration.NAME_ATTR;
-import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
-import static org.apache.log4j.xml.XmlConfiguration.VALUE_ATTR;
-import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
-
 /**
  * Build a Console Appender
  */
@@ -55,6 +55,7 @@ public class ConsoleAppenderBuilder extends AbstractBuilder implements AppenderB
     private static final String SYSTEM_OUT = "System.out";
     private static final String SYSTEM_ERR = "System.err";
     private static final String TARGET_PARAM = "Target";
+    private static final String FOLLOW_PARAM = "Follow";
 
     private static final Logger LOGGER = StatusLogger.getLogger();
 
@@ -72,6 +73,7 @@ public class ConsoleAppenderBuilder extends AbstractBuilder implements AppenderB
         Holder<Layout> layout = new Holder<>();
         Holder<List<Filter>> filters = new Holder<>(new ArrayList<>());
         Holder<String> level = new Holder<>();
+        Holder<Boolean> follow = new BooleanHolder();
         forEachElement(appenderElement.getChildNodes(), (currentElement) -> {
             switch (currentElement.getTagName()) {
                 case LAYOUT_TAG:
@@ -109,6 +111,24 @@ public class ConsoleAppenderBuilder extends AbstractBuilder implements AppenderB
                             }
                             break;
                         }
+                        case FOLLOW_PARAM: {
+                            String value = getValueAttribute(currentElement);
+                            if (value == null) {
+                                LOGGER.warn("No value supplied for Follow parameter. Using default of {}", false);
+                            } else {
+                                follow.set(Boolean.valueOf(value));
+                            }
+                            break;
+                        }
+                        case IMMEDIATE_FLUSH_PARAM: {
+                            String value = getValueAttribute(currentElement);
+                            if (value == null) {
+                                LOGGER.warn("No value supplied for ImmediateFlush parameter. Using default of {}", true);
+                            } else if (!Boolean.getBoolean(name)) {
+                                LOGGER.warn("The value {} for ImmediateFlush parameter is not supported.", false);
+                            }
+                            break;
+                        }
                     }
                     break;
                 }
@@ -125,7 +145,7 @@ public class ConsoleAppenderBuilder extends AbstractBuilder implements AppenderB
                 current = f;
             }
         }
-        return createAppender(name, layout.get(), head, level.get(), target.get(), config);
+        return createAppender(name, layout.get(), head, level.get(), target.get(), follow.get(), config);
     }
 
     @Override
@@ -135,11 +155,12 @@ public class ConsoleAppenderBuilder extends AbstractBuilder implements AppenderB
         Filter filter = configuration.parseAppenderFilters(props, filterPrefix, name);
         String level = getProperty(THRESHOLD_PARAM);
         String target = getProperty(TARGET_PARAM);
-        return createAppender(name, layout, filter, level, target, configuration);
+        boolean follow = getBooleanProperty(FOLLOW_PARAM, false);
+        return createAppender(name, layout, filter, level, target, follow, configuration);
     }
 
     private <T extends Log4j1Configuration> Appender createAppender(String name, Layout layout, Filter filter,
-            String level, String target, T configuration) {
+            String level, String target, boolean follow, T configuration) {
         org.apache.logging.log4j.core.Layout<?> consoleLayout = null;
 
         if (layout instanceof LayoutWrapper) {
@@ -153,6 +174,7 @@ public class ConsoleAppenderBuilder extends AbstractBuilder implements AppenderB
         return new AppenderWrapper(ConsoleAppender.newBuilder()
                 .setName(name)
                 .setTarget(consoleTarget)
+                .setFollow(follow)
                 .setLayout(consoleLayout)
                 .setFilter(consoleFilter)
                 .setConfiguration(configuration)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/DailyRollingFileAppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/DailyRollingFileAppenderBuilder.java
index d098f29..eaf7c00 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/DailyRollingFileAppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/DailyRollingFileAppenderBuilder.java
@@ -52,6 +52,9 @@ import static org.apache.log4j.xml.XmlConfiguration.*;
 @Plugin(name = "org.apache.log4j.DailyRollingFileAppender", category = CATEGORY)
 public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements AppenderBuilder {
 
+    private static final String DEFAULT_DATE_PATTERN = ".yyyy-MM-dd";
+    private static final String DATE_PATTERN_PARAM = "DatePattern";
+
     private static final Logger LOGGER = StatusLogger.getLogger();
 
     public DailyRollingFileAppenderBuilder() {
@@ -68,10 +71,11 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
         Holder<Filter> filter = new Holder<>();
         Holder<String> fileName = new Holder<>();
         Holder<String> level = new Holder<>();
-        Holder<Boolean> immediateFlush = new BooleanHolder();
-        Holder<Boolean> append = new BooleanHolder();
-        Holder<Boolean> bufferedIo = new BooleanHolder();
+        Holder<Boolean> immediateFlush = new BooleanHolder(true);
+        Holder<Boolean> append = new BooleanHolder(true);
+        Holder<Boolean> bufferedIo = new BooleanHolder(false);
         Holder<Integer> bufferSize = new Holder<>(8192);
+        Holder<String> datePattern = new Holder<>(DEFAULT_DATE_PATTERN);
         forEachElement(appenderElement.getChildNodes(), (currentElement) -> {
             switch (currentElement.getTagName()) {
                 case LAYOUT_TAG:
@@ -121,13 +125,32 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
                             }
                             break;
                         }
+                        case DATE_PATTERN_PARAM: {
+                            String value = getValueAttribute(currentElement);
+                            if (value == null) {
+                                LOGGER.warn("No value supplied for DatePattern parameter, ignoring.");
+                            } else {
+                                datePattern.set(value);
+                            }
+                            break;
+                        }
+                        case IMMEDIATE_FLUSH_PARAM: {
+                            String value = getValueAttribute(currentElement);
+                            if (value == null) {
+                                LOGGER.warn("No value supplied for ImmediateFlush parameter. Using default of {}", true);
+                            } else {
+                                immediateFlush.set(Boolean.getBoolean(value));
+                            }
+                            break;
+                        }
                     }
                     break;
                 }
             }
         });
         return createAppender(name, layout.get(), filter.get(), fileName.get(), append.get(), immediateFlush.get(),
-                level.get(), bufferedIo.get(), bufferSize.get(), config, config.getComponent(Clock.KEY));
+                level.get(), bufferedIo.get(), bufferSize.get(), datePattern.get(), config,
+                config.getComponent(Clock.KEY));
     }
 
     @Override
@@ -137,22 +160,23 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
         Filter filter = configuration.parseAppenderFilters(props, filterPrefix, name);
         String fileName = getProperty(FILE_PARAM);
         String level = getProperty(THRESHOLD_PARAM);
-        boolean append = getBooleanProperty(APPEND_PARAM);
-        boolean immediateFlush = false;
-        boolean bufferedIo = getBooleanProperty(BUFFERED_IO_PARAM);
-        int bufferSize = Integer.parseInt(getProperty(BUFFER_SIZE_PARAM, "8192"));
-        return createAppender(name, layout, filter, fileName, append, immediateFlush,
-                level, bufferedIo, bufferSize, configuration, configuration.getComponent(Clock.KEY));
+        boolean append = getBooleanProperty(APPEND_PARAM, true);
+        boolean immediateFlush = getBooleanProperty(IMMEDIATE_FLUSH_PARAM, true);
+        boolean bufferedIo = getBooleanProperty(BUFFERED_IO_PARAM, false);
+        int bufferSize = getIntegerProperty(BUFFER_SIZE_PARAM, 8192);
+        String datePattern = getProperty(DATE_PATTERN_PARAM, DEFAULT_DATE_PATTERN);
+        return createAppender(name, layout, filter, fileName, append, immediateFlush, level, bufferedIo, bufferSize,
+                datePattern, configuration, configuration.getComponent(Clock.KEY));
     }
 
-    private <T extends Log4j1Configuration> Appender createAppender(
-            final String name, final Layout layout, final Filter filter, final String fileName, final boolean append,
-            boolean immediateFlush, final String level, final boolean bufferedIo, final int bufferSize, final T configuration,
-            final Clock clock) {
+    private <T extends Log4j1Configuration> Appender createAppender(final String name, final Layout layout,
+            final Filter filter, final String fileName, final boolean append, boolean immediateFlush,
+            final String level, final boolean bufferedIo, final int bufferSize, String datePattern,
+            final T configuration, final Clock clock) {
 
         org.apache.logging.log4j.core.Layout<?> fileLayout = null;
         if (bufferedIo) {
-            immediateFlush = true;
+            immediateFlush = false;
         }
         if (layout instanceof LayoutWrapper) {
             fileLayout = ((LayoutWrapper) layout).getLayout();
@@ -164,7 +188,7 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
             LOGGER.warn("Unable to create File Appender, no file name provided");
             return null;
         }
-        String filePattern = fileName + "%d{.yyyy-MM-dd}";
+        String filePattern = fileName + "%d{" + datePattern + "}";
         TriggeringPolicy timePolicy = TimeBasedTriggeringPolicy.newBuilder().setClock(clock).setModulate(true).build();
         TriggeringPolicy policy = CompositeTriggeringPolicy.createPolicy(timePolicy);
         RolloverStrategy strategy = DefaultRolloverStrategy.newBuilder()
@@ -173,10 +197,12 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
                 .build();
         return new AppenderWrapper(RollingFileAppender.newBuilder()
                 .setName(name)
+                .setAppend(append)
                 .setConfiguration(configuration)
                 .setLayout(fileLayout)
                 .setFilter(fileFilter)
                 .setFileName(fileName)
+                .setBufferedIo(bufferedIo)
                 .setBufferSize(bufferSize)
                 .setImmediateFlush(immediateFlush)
                 .setFilePattern(filePattern)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/FileAppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/FileAppenderBuilder.java
index 7697232..857e21e 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/FileAppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/FileAppenderBuilder.java
@@ -67,9 +67,9 @@ public class FileAppenderBuilder extends AbstractBuilder implements AppenderBuil
         Holder<Filter> filter = new Holder<>();
         Holder<String> fileName = new Holder<>();
         Holder<String> level = new Holder<>();
-        Holder<Boolean> immediateFlush = new BooleanHolder();
-        Holder<Boolean> append = new BooleanHolder();
-        Holder<Boolean> bufferedIo = new BooleanHolder();
+        Holder<Boolean> immediateFlush = new BooleanHolder(true);
+        Holder<Boolean> append = new BooleanHolder(true);
+        Holder<Boolean> bufferedIo = new BooleanHolder(false);
         Holder<Integer> bufferSize = new Holder<>(8192);
         forEachElement(appenderElement.getChildNodes(), (currentElement) -> {
             switch (currentElement.getTagName()) {
@@ -120,6 +120,15 @@ public class FileAppenderBuilder extends AbstractBuilder implements AppenderBuil
                             }
                             break;
                         }
+                        case IMMEDIATE_FLUSH_PARAM: {
+                            String value = getValueAttribute(currentElement);
+                            if (value == null) {
+                                LOGGER.warn("No value supplied for ImmediateFlush parameter. Using default of {}", true);
+                            } else {
+                                immediateFlush.set(Boolean.getBoolean(value));
+                            }
+                            break;
+                        }
                     }
                     break;
                 }
@@ -137,9 +146,9 @@ public class FileAppenderBuilder extends AbstractBuilder implements AppenderBuil
         Filter filter = configuration.parseAppenderFilters(props, filterPrefix, name);
         String level = getProperty(THRESHOLD_PARAM);
         String fileName = getProperty(FILE_PARAM);
-        boolean append = getBooleanProperty(APPEND_PARAM);
-        boolean immediateFlush = false;
-        boolean bufferedIo = getBooleanProperty(BUFFERED_IO_PARAM);
+        boolean append = getBooleanProperty(APPEND_PARAM, true);
+        boolean immediateFlush = getBooleanProperty(IMMEDIATE_FLUSH_PARAM, true);
+        boolean bufferedIo = getBooleanProperty(BUFFERED_IO_PARAM, false);
         int bufferSize = Integer.parseInt(getProperty(BUFFER_SIZE_PARAM, "8192"));
         return createAppender(name, configuration, layout, filter, fileName, level, immediateFlush,
                 append, bufferedIo, bufferSize);
@@ -150,7 +159,7 @@ public class FileAppenderBuilder extends AbstractBuilder implements AppenderBuil
             final boolean bufferedIo, final int bufferSize) {
         org.apache.logging.log4j.core.Layout<?> fileLayout = null;
         if (bufferedIo) {
-            immediateFlush = true;
+            immediateFlush = false;
         }
         if (layout instanceof LayoutWrapper) {
             fileLayout = ((LayoutWrapper) layout).getLayout();
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RollingFileAppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RollingFileAppenderBuilder.java
index a52b69e..d7abfc7 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RollingFileAppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RollingFileAppenderBuilder.java
@@ -53,6 +53,9 @@ import static org.apache.log4j.xml.XmlConfiguration.*;
 @Plugin(name = "org.apache.log4j.RollingFileAppender", category = CATEGORY)
 public class RollingFileAppenderBuilder extends AbstractBuilder implements AppenderBuilder {
 
+    private static final String DEFAULT_MAX_SIZE = "10 MB";
+    private static final String DEFAULT_MAX_BACKUPS = "1";
+
     private static final Logger LOGGER = StatusLogger.getLogger();
 
     public RollingFileAppenderBuilder() {
@@ -68,12 +71,12 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
         Holder<Layout> layout = new Holder<>();
         Holder<Filter> filter = new Holder<>();
         Holder<String> fileName = new Holder<>();
-        Holder<Boolean> immediateFlush = new BooleanHolder();
-        Holder<Boolean> append = new BooleanHolder();
-        Holder<Boolean> bufferedIo = new BooleanHolder();
+        Holder<Boolean> immediateFlush = new BooleanHolder(true);
+        Holder<Boolean> append = new BooleanHolder(true);
+        Holder<Boolean> bufferedIo = new BooleanHolder(false);
         Holder<Integer> bufferSize = new Holder<>(8192);
-        Holder<String> maxSize = new Holder<>();
-        Holder<String> maxBackups = new Holder<>();
+        Holder<String> maxSize = new Holder<>(DEFAULT_MAX_SIZE);
+        Holder<String> maxBackups = new Holder<>(DEFAULT_MAX_BACKUPS);
         Holder<String> level = new Holder<>();
         forEachElement(appenderElement.getChildNodes(), (currentElement) -> {
             switch (currentElement.getTagName()) {
@@ -142,13 +145,23 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
                             }
                             break;
                         }
+                        case IMMEDIATE_FLUSH_PARAM: {
+                            String value = getValueAttribute(currentElement);
+                            if (value == null) {
+                                LOGGER.warn("No value supplied for ImmediateFlush parameter. Using default of {}", true);
+                            } else {
+                                immediateFlush.set(Boolean.getBoolean(value));
+                            }
+                            break;
+                        }
                     }
                     break;
                 }
             }
         });
-        return createAppender(name, config, layout.get(), filter.get(), bufferedIo.get(), immediateFlush.get(),
-                fileName.get(), level.get(), maxSize.get(), maxBackups.get(), config.getComponent(Clock.KEY));
+        return createAppender(name, config, layout.get(), filter.get(), append.get(), bufferedIo.get(),
+                bufferSize.get(), immediateFlush.get(), fileName.get(), level.get(), maxSize.get(), maxBackups.get(),
+                config.getComponent(Clock.KEY));
     }
 
     @Override
@@ -158,21 +171,23 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
         Filter filter = configuration.parseAppenderFilters(props, filterPrefix, name);
         String fileName = getProperty(FILE_PARAM);
         String level = getProperty(THRESHOLD_PARAM);
-        boolean immediateFlush = false;
+        boolean append = getBooleanProperty(APPEND_PARAM, true);
+        boolean immediateFlush = getBooleanProperty(IMMEDIATE_FLUSH_PARAM, true);
         boolean bufferedIo = getBooleanProperty(BUFFERED_IO_PARAM);
-        String maxSize = getProperty(MAX_SIZE_PARAM);
-        String maxBackups = getProperty(MAX_BACKUP_INDEX);
-        return createAppender(name, configuration, layout, filter, bufferedIo, immediateFlush, fileName, level, maxSize,
-                maxBackups, configuration.getComponent(Clock.KEY));
+        int bufferSize = getIntegerProperty(BUFFER_SIZE_PARAM, 8192);
+        String maxSize = getProperty(MAX_SIZE_PARAM, DEFAULT_MAX_SIZE);
+        String maxBackups = getProperty(MAX_BACKUP_INDEX, DEFAULT_MAX_BACKUPS);
+        return createAppender(name, configuration, layout, filter, append, bufferedIo, bufferSize, immediateFlush,
+                fileName, level, maxSize, maxBackups, configuration.getComponent(Clock.KEY));
     }
 
-    private Appender createAppender(
-            final String name, final Log4j1Configuration config, final Layout layout, final Filter filter,
-            final boolean bufferedIo, boolean immediateFlush, final String fileName, final String level, final String maxSize,
+    private Appender createAppender(final String name, final Log4j1Configuration config, final Layout layout,
+            final Filter filter, final boolean append, final boolean bufferedIo, final int bufferSize,
+            boolean immediateFlush, final String fileName, final String level, final String maxSize,
             final String maxBackups, final Clock clock) {
         org.apache.logging.log4j.core.Layout<?> fileLayout = null;
-        if (bufferedIo) {
-            immediateFlush = true;
+        if (!bufferedIo) {
+            immediateFlush = false;
         }
         if (layout instanceof LayoutWrapper) {
             fileLayout = ((LayoutWrapper) layout).getLayout();
@@ -197,7 +212,9 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
                 .setConfiguration(config)
                 .setLayout(fileLayout)
                 .setFilter(fileFilter)
+                .setAppend(append)
                 .setBufferedIo(bufferedIo)
+                .setBufferSize(bufferSize)
                 .setImmediateFlush(immediateFlush)
                 .setFileName(fileName)
                 .setFilePattern(filePattern)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/HtmlLayoutBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/HtmlLayoutBuilder.java
index 196225d..fc32f32 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/HtmlLayoutBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/HtmlLayoutBuilder.java
@@ -39,6 +39,7 @@ import static org.apache.log4j.xml.XmlConfiguration.*;
 @Plugin(name = "org.apache.log4j.HTMLLayout", category = CATEGORY)
 public class HtmlLayoutBuilder extends AbstractBuilder implements LayoutBuilder {
 
+    private static final String DEFAULT_TITLE = "Log4J Log Messages";
     private static final String TITLE_PARAM = "Title";
     private static final String LOCATION_INFO_PARAM = "LocationInfo";
 
@@ -52,8 +53,8 @@ public class HtmlLayoutBuilder extends AbstractBuilder implements LayoutBuilder
 
     @Override
     public Layout parseLayout(Element layoutElement, XmlConfiguration config) {
-        final Holder<String> title = new Holder<>();
-        final Holder<Boolean> locationInfo = new BooleanHolder();
+        final Holder<String> title = new Holder<>("Log4J Log Messages");
+        final Holder<Boolean> locationInfo = new BooleanHolder(false);
         forEachElement(layoutElement.getElementsByTagName("param"), (currentElement) -> {
             if (currentElement.getTagName().equals(PARAM_TAG)) {
                 if (TITLE_PARAM.equalsIgnoreCase(currentElement.getAttribute("name"))) {
@@ -68,8 +69,8 @@ public class HtmlLayoutBuilder extends AbstractBuilder implements LayoutBuilder
 
     @Override
     public Layout parseLayout(PropertiesConfiguration config) {
-        String title = getProperty(TITLE_PARAM);
-        boolean locationInfo = getBooleanProperty(LOCATION_INFO_PARAM);
+        String title = getProperty(TITLE_PARAM, DEFAULT_TITLE);
+        boolean locationInfo = getBooleanProperty(LOCATION_INFO_PARAM, false);
         return createLayout(title, locationInfo);
     }
 
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 a2a2226..9a57c80 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
@@ -103,7 +103,7 @@ public class TTCCLayoutBuilder extends AbstractBuilder implements LayoutBuilder
         if (dateFormat != null) {
             if (RELATIVE.equalsIgnoreCase(dateFormat)) {
                 sb.append("%r ");
-            } else {
+            } else if (!NULL.equalsIgnoreCase(dateFormat)){
                 sb.append("%d{").append(dateFormat).append("}");
                 if (timezone != null) {
                     sb.append("{").append(timezone).append("}");
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 962bdeb..c16be44 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -66,6 +66,8 @@ public class Log4j1ConfigurationParser {
     private static final String ROOTCATEGORY = "rootCategory";
     private static final String TRUE = "true";
     private static final String FALSE = "false";
+    private static final String RELATIVE = "RELATIVE";
+    private static final String NULL = "NULL";
 
     private final Properties properties = new Properties();
 
@@ -226,7 +228,7 @@ public class Log4j1ConfigurationParser {
                 RollingFileAppender.PLUGIN_NAME);
         buildFileAppender(appenderName, appenderBuilder);
         final String fileName = getLog4jAppenderValue(appenderName, "File");
-        final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", fileName + "'.'yyyy-MM-dd");
+        final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", ".yyyy-MM-dd");
         appenderBuilder.addAttribute("filePattern", fileName + "%d{" + datePattern + "}");
         final ComponentBuilder<?> triggeringPolicy = builder.newComponent("Policies")
                 .addComponent(builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("modulate", true));
@@ -287,8 +289,9 @@ public class Log4j1ConfigurationParser {
             switch (layoutClass) {
             case "org.apache.log4j.PatternLayout":
             case "org.apache.log4j.EnhancedPatternLayout": {
-                final String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null)
-
+                String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null);
+                if (pattern != null) {
+                    pattern = pattern
                         // Log4j 2's %x (NDC) is not compatible with Log4j 1's
                         // %x
                         // Log4j 1: "foo bar baz"
@@ -302,7 +305,9 @@ public class Log4j1ConfigurationParser {
                         // Log4j 2: "{foo=bar,hoo=boo}"
                         // Use %properties to get the Log4j 1 format
                         .replace("%X", "%properties");
-
+                } else {
+                    pattern = "%m%n";
+                }
                 appenderBuilder.add(newPatternLayout(pattern));
                 break;
             }
@@ -311,7 +316,20 @@ public class Log4j1ConfigurationParser {
                 break;
             }
             case "org.apache.log4j.TTCCLayout": {
-                String pattern = "%r ";
+                String pattern = "";
+                final String dateFormat = getLog4jAppenderValue(name, "layout.DateFormat", RELATIVE);
+                final String timezone = getLog4jAppenderValue(name, "layout.TimeZone", null);
+                if (dateFormat != null) {
+                    if (RELATIVE.equalsIgnoreCase(dateFormat)) {
+                        pattern += "%r ";
+                    } else if (!NULL.equalsIgnoreCase(dateFormat)){
+                        pattern += "%d{" + dateFormat + "}";
+                        if (timezone != null) {
+                            pattern += "{" + timezone + "}";
+                        }
+                        pattern += " ";
+                    }
+                }
                 if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", TRUE))) {
                     pattern += "[%t] ";
                 }
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 98e1931..8088708 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
@@ -21,7 +21,12 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.net.URISyntaxException;
 import java.nio.file.FileSystemException;
 import java.nio.file.Files;
@@ -35,6 +40,7 @@ import org.apache.logging.log4j.core.appender.ConsoleAppender;
 import org.apache.logging.log4j.core.appender.ConsoleAppender.Target;
 import org.apache.logging.log4j.core.appender.FileAppender;
 import org.apache.logging.log4j.core.appender.NullAppender;
+import org.apache.logging.log4j.core.appender.OutputStreamManager;
 import org.apache.logging.log4j.core.appender.RollingFileAppender;
 import org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy;
 import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy;
@@ -46,7 +52,7 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.layout.HtmlLayout;
 import org.apache.logging.log4j.core.layout.PatternLayout;
-import org.junit.Test;
+import org.apache.logging.log4j.core.util.CloseShieldOutputStream;
 
 public abstract class AbstractLog4j1ConfigurationTest {
 
@@ -82,11 +88,13 @@ public abstract class AbstractLog4j1ConfigurationTest {
         final String name = "Console";
         final ConsoleAppender appender = configuration.getAppender(name);
         assertNotNull("Missing appender '" + name + "' in configuration " + configResource + " → " + configuration, appender);
+        assertEquals("follow", true, getFollowProperty(appender));
         assertEquals(Target.SYSTEM_ERR, appender.getTarget());
         //
         final LoggerConfig loggerConfig = configuration.getLoggerConfig("com.example.foo");
         assertNotNull(loggerConfig);
         assertEquals(Level.DEBUG, loggerConfig.getLevel());
+        // immediateFlush is always true in Log4j 2.x
         configuration.start();
         configuration.stop();
         return appender.getLayout();
@@ -94,7 +102,7 @@ public abstract class AbstractLog4j1ConfigurationTest {
 
     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());
+        assertEquals("%d{ISO8601}{CET} %p - %m%n", layout.getConversionPattern());
     }
 
     public void testRollingFileAppender() throws Exception {
@@ -102,7 +110,7 @@ public abstract class AbstractLog4j1ConfigurationTest {
     }
 
     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{.dd-MM-yyyy}");
     }
 
     public void testRollingFileAppenderWithProperties() throws Exception {
@@ -113,14 +121,28 @@ public abstract class AbstractLog4j1ConfigurationTest {
         final String tempFileName = System.getProperty("java.io.tmpdir") + "/hadoop.log";
         final Path tempFilePath = new File(tempFileName).toPath();
         Files.deleteIfExists(tempFilePath);
+        final Configuration configuration = getConfiguration("config-1.2/log4j-system-properties-1");
         try {
-            final Configuration configuration = getConfiguration("config-1.2/log4j-system-properties-1");
             final RollingFileAppender appender = configuration.getAppender("RFA");
+            assertEquals("append", false, getAppendProperty(appender));
+            assertEquals("bufferSize", 1000, appender.getManager().getBufferSize());
+            assertEquals("immediateFlush", false, appender.getImmediateFlush());
+            final DefaultRolloverStrategy rolloverStrategy = (DefaultRolloverStrategy) appender.getManager().getRolloverStrategy();
+            assertEquals(16, rolloverStrategy.getMaxIndex());
+            final CompositeTriggeringPolicy ctp = (CompositeTriggeringPolicy) appender.getTriggeringPolicy();
+            final TriggeringPolicy[] triggeringPolicies = ctp.getTriggeringPolicies();
+            assertEquals(1, triggeringPolicies.length);
+            final TriggeringPolicy tp = triggeringPolicies[0];
+            assertTrue(tp.getClass().getName(), tp instanceof SizeBasedTriggeringPolicy);
+            final SizeBasedTriggeringPolicy sbtp = (SizeBasedTriggeringPolicy) tp;
+            assertEquals(20 * 1024 * 1024, sbtp.getMaxFileSize());
             appender.stop(10, TimeUnit.SECONDS);
             // System.out.println("expected: " + tempFileName + " Actual: " +
             // appender.getFileName());
             assertEquals(tempFileName, appender.getFileName());
         } finally {
+            configuration.start();
+            configuration.stop();
             try {
                 Files.deleteIfExists(tempFilePath);
             } catch (final FileSystemException e) {
@@ -154,6 +176,9 @@ public abstract class AbstractLog4j1ConfigurationTest {
         assertEquals(name, appender.getName());
         assertTrue(appender.getClass().getName(), appender instanceof RollingFileAppender);
         final RollingFileAppender rfa = (RollingFileAppender) appender;
+        assertEquals("append", false, getAppendProperty(rfa));
+        assertEquals("bufferSize", 1000, rfa.getManager().getBufferSize());
+        assertEquals("immediateFlush", false, rfa.getImmediateFlush());
         assertEquals("target/hadoop.log", rfa.getFileName());
         assertEquals(filePattern, rfa.getFilePattern());
         final TriggeringPolicy triggeringPolicy = rfa.getTriggeringPolicy();
@@ -177,29 +202,35 @@ public abstract class AbstractLog4j1ConfigurationTest {
     private void testDailyRollingFileAppender(final String configResource, final String name, final String filePattern)
             throws Exception {
         final Configuration configuration = getConfiguration(configResource);
-        final Appender appender = configuration.getAppender(name);
-        assertNotNull(appender);
-        assertEquals(name, appender.getName());
-        assertTrue(appender.getClass().getName(), appender instanceof RollingFileAppender);
-        final RollingFileAppender rfa = (RollingFileAppender) appender;
-        assertEquals("target/hadoop.log", rfa.getFileName());
-        assertEquals(filePattern, rfa.getFilePattern());
-        final TriggeringPolicy triggeringPolicy = rfa.getTriggeringPolicy();
-        assertNotNull(triggeringPolicy);
-        assertTrue(triggeringPolicy.getClass().getName(), triggeringPolicy instanceof CompositeTriggeringPolicy);
-        final CompositeTriggeringPolicy ctp = (CompositeTriggeringPolicy) triggeringPolicy;
-        final TriggeringPolicy[] triggeringPolicies = ctp.getTriggeringPolicies();
-        assertEquals(1, triggeringPolicies.length);
-        final TriggeringPolicy tp = triggeringPolicies[0];
-        assertTrue(tp.getClass().getName(), tp instanceof TimeBasedTriggeringPolicy);
-        final TimeBasedTriggeringPolicy tbtp = (TimeBasedTriggeringPolicy) tp;
-        assertEquals(1, tbtp.getInterval());
-        final RolloverStrategy rolloverStrategy = rfa.getManager().getRolloverStrategy();
-        assertTrue(rolloverStrategy.getClass().getName(), rolloverStrategy instanceof DefaultRolloverStrategy);
-        final DefaultRolloverStrategy drs = (DefaultRolloverStrategy) rolloverStrategy;
-        assertEquals(Integer.MAX_VALUE, drs.getMaxIndex());
-        configuration.start();
-        configuration.stop();
+        try {
+            final Appender appender = configuration.getAppender(name);
+            assertNotNull(appender);
+            assertEquals(name, appender.getName());
+            assertTrue(appender.getClass().getName(), appender instanceof RollingFileAppender);
+            final RollingFileAppender rfa = (RollingFileAppender) appender;
+            assertEquals("append", false, getAppendProperty(rfa));
+            assertEquals("bufferSize", 1000, rfa.getManager().getBufferSize());
+            assertEquals("immediateFlush", false, rfa.getImmediateFlush());
+            assertEquals("target/hadoop.log", rfa.getFileName());
+            assertEquals(filePattern, rfa.getFilePattern());
+            final TriggeringPolicy triggeringPolicy = rfa.getTriggeringPolicy();
+            assertNotNull(triggeringPolicy);
+            assertTrue(triggeringPolicy.getClass().getName(), triggeringPolicy instanceof CompositeTriggeringPolicy);
+            final CompositeTriggeringPolicy ctp = (CompositeTriggeringPolicy) triggeringPolicy;
+            final TriggeringPolicy[] triggeringPolicies = ctp.getTriggeringPolicies();
+            assertEquals(1, triggeringPolicies.length);
+            final TriggeringPolicy tp = triggeringPolicies[0];
+            assertTrue(tp.getClass().getName(), tp instanceof TimeBasedTriggeringPolicy);
+            final TimeBasedTriggeringPolicy tbtp = (TimeBasedTriggeringPolicy) tp;
+            assertEquals(1, tbtp.getInterval());
+            final RolloverStrategy rolloverStrategy = rfa.getManager().getRolloverStrategy();
+            assertTrue(rolloverStrategy.getClass().getName(), rolloverStrategy instanceof DefaultRolloverStrategy);
+            final DefaultRolloverStrategy drs = (DefaultRolloverStrategy) rolloverStrategy;
+            assertEquals(Integer.MAX_VALUE, drs.getMaxIndex());
+        } finally {
+            configuration.start();
+            configuration.stop();
+        }
     }
 
     private Layout<?> testFile(final String configResource) throws Exception {
@@ -211,6 +242,9 @@ public abstract class AbstractLog4j1ConfigurationTest {
         final LoggerConfig loggerConfig = configuration.getLoggerConfig("com.example.foo");
         assertNotNull(loggerConfig);
         assertEquals(Level.DEBUG, loggerConfig.getLevel());
+        assertEquals("append", false, getAppendProperty(appender));
+        assertEquals("bufferSize", 1000, appender.getManager().getBufferSize());
+        assertEquals("immediateFlush", false, appender.getImmediateFlush());
         configuration.start();
         configuration.stop();
         return appender.getLayout();
@@ -250,4 +284,98 @@ public abstract class AbstractLog4j1ConfigurationTest {
         assertTrue(appender.getClass().getName(), appender instanceof NullAppender);
     }
 
+    private boolean getFollowProperty(final ConsoleAppender consoleAppender)
+            throws Exception, NoSuchFieldException, IllegalAccessException {
+        CloseShieldOutputStream wrapperStream = (CloseShieldOutputStream) getOutputStream(consoleAppender.getManager());
+        Field delegateField = CloseShieldOutputStream.class.getDeclaredField("delegate");
+        delegateField.setAccessible(true);
+        boolean follow = !System.out.equals(delegateField.get(wrapperStream));
+        return follow;
+    }
+
+    private boolean getAppendProperty(final RollingFileAppender appender) throws Exception {
+        return getAppendProperty((FileOutputStream) getOutputStream(appender.getManager()));
+    }
+
+    private boolean getAppendProperty(final FileAppender appender) throws Exception {
+        return getAppendProperty((FileOutputStream) getOutputStream(appender.getManager()));
+    }
+
+    private boolean getAppendProperty(final FileOutputStream os) throws Exception {
+            // Java 11
+            final Field appendField = FileDescriptor.class.getDeclaredField("append");
+            appendField.setAccessible(true);
+            return (Boolean) appendField.get(os.getFD());
+    }
+
+    private OutputStream getOutputStream(final OutputStreamManager manager) throws Exception {
+        final Method getOutputStream = OutputStreamManager.class.getDeclaredMethod("getOutputStream");
+        getOutputStream.setAccessible(true);
+        return (OutputStream) getOutputStream.invoke(manager);
+    }
+
+    private Layout<?> testLayout(final Configuration config, final String appenderName) throws Exception {
+        final ConsoleAppender appender = config.getAppender(appenderName);
+        assertNotNull("Missing appender '" + appenderName + "' in configuration " + config.getConfigurationSource(), appender);
+        return appender.getLayout();
+    }
+
+    /**
+     * Test if the default values from Log4j 1.x are respected.
+     */
+    public void testDefaultValues() throws Exception {
+        final Configuration config = getConfiguration("config-1.2/log4j-defaultValues");
+        // HtmlLayout
+        final HtmlLayout htmlLayout = (HtmlLayout) testLayout(config, "HTMLLayout");
+        assertNotNull(htmlLayout);
+        assertEquals("title", "Log4J Log Messages", htmlLayout.getTitle());
+        assertEquals("locationInfo", false, htmlLayout.isLocationInfo());
+        // PatternLayout
+        final PatternLayout patternLayout = (PatternLayout) testLayout(config, "PatternLayout");
+        assertNotNull(patternLayout);
+        assertEquals("conversionPattern", "%m%n", patternLayout.getConversionPattern());
+        // TTCCLayout
+        final PatternLayout ttccLayout = (PatternLayout) testLayout(config, "TTCCLayout");
+        assertNotNull(ttccLayout);
+        assertEquals("equivalent conversion pattern", "%r [%t] %p %c %notEmpty{%ndc }- %m%n", ttccLayout.getConversionPattern());
+        // TODO: XMLLayout
+        // final XmlLayout xmlLayout = (XmlLayout) testLayout(config, "XMLLayout");
+        // assertNotNull(xmlLayout);
+        // ConsoleAppender
+        final ConsoleAppender consoleAppender = config.getAppender("ConsoleAppender");
+        assertNotNull(consoleAppender);
+        assertEquals("target", Target.SYSTEM_OUT, consoleAppender.getTarget());
+        boolean follow = getFollowProperty(consoleAppender);
+        assertEquals("follow", false, follow);
+        // DailyRollingFileAppender
+        final RollingFileAppender dailyRollingFileAppender = config.getAppender("DailyRollingFileAppender");
+        assertNotNull(dailyRollingFileAppender);
+        assertEquals("equivalent file pattern", "target/dailyRollingFileAppender%d{.yyyy-MM-dd}",
+                dailyRollingFileAppender.getFilePattern());
+        assertEquals("append", true, getAppendProperty(dailyRollingFileAppender));
+        assertEquals("bufferSize", 8192, dailyRollingFileAppender.getManager().getBufferSize());
+        assertEquals("immediateFlush", true, dailyRollingFileAppender.getImmediateFlush());
+        // FileAppender
+        final FileAppender fileAppender = config.getAppender("FileAppender");
+        assertNotNull(fileAppender);
+        assertEquals("append", true, getAppendProperty(fileAppender));
+        assertEquals("bufferSize", 8192, fileAppender.getManager().getBufferSize());
+        assertEquals("immediateFlush", true, fileAppender.getImmediateFlush());
+        // RollingFileAppender
+        final RollingFileAppender rollingFileAppender = config.getAppender("RollingFileAppender");
+        assertNotNull(rollingFileAppender);
+        assertEquals("equivalent file pattern", "target/rollingFileAppender.%i", rollingFileAppender.getFilePattern());
+        final CompositeTriggeringPolicy compositePolicy = rollingFileAppender.getManager().getTriggeringPolicy();
+        assertEquals(1, compositePolicy.getTriggeringPolicies().length);
+        final SizeBasedTriggeringPolicy sizePolicy = (SizeBasedTriggeringPolicy) compositePolicy.getTriggeringPolicies()[0];
+        assertEquals("maxFileSize", 10 * 1024 * 1024L, sizePolicy.getMaxFileSize());
+        final DefaultRolloverStrategy strategy = (DefaultRolloverStrategy) rollingFileAppender.getManager()
+                .getRolloverStrategy();
+        assertEquals("maxBackupIndex", 1, strategy.getMaxIndex());
+        assertEquals("append", true, getAppendProperty(rollingFileAppender));
+        assertEquals("bufferSize", 8192, rollingFileAppender.getManager().getBufferSize());
+        assertEquals("immediateFlush", true, rollingFileAppender.getImmediateFlush());
+        config.start();
+        config.stop();
+    }
 }
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 5917156..95f6226 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
@@ -142,4 +142,9 @@ public class Log4j1ConfigurationFactoryTest extends AbstractLog4j1ConfigurationT
         super.testConsoleCapitalization();
     }
 
+    @Override
+    @Test
+    public void testDefaultValues() throws Exception {
+        super.testDefaultValues();
+    }
 }
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 8cc1183..85d2859 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
@@ -257,4 +257,10 @@ public class PropertiesConfigurationTest extends AbstractLog4j1ConfigurationTest
     public void testSystemProperties2() throws Exception {
         super.testSystemProperties2();
     }
+
+    @Override
+    @Test
+    public void testDefaultValues() throws Exception {
+        super.testDefaultValues();
+    }
 }
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 d8918bc..6cacbf8 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
@@ -180,4 +180,10 @@ public class XmlConfigurationTest extends AbstractLog4j1ConfigurationTest {
         super.testSystemProperties1();
     }
 
+    @Override
+    @Test
+    public void testDefaultValues() throws Exception {
+        super.testDefaultValues();
+    }
+
 }
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.properties
index 1ee8ca2..0af97ae 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.properties
@@ -30,10 +30,14 @@ log4j.rootLogger=TRACE, DRFA
 #
 
 log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.DRFA.Append=false
+log4j.appender.DRFA.BufferedIO=true
+log4j.appender.DRFA.BufferSize=1000
 log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file}
+log4j.appender.DRFA.ImmediateFlush=false
 
 # Rollover at midnight
-log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
+log4j.appender.DRFA.DatePattern=.dd-MM-yyyy
 
 log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout
 
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.xml b/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.xml
index fbec94f..9076d32 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.xml
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.xml
@@ -18,8 +18,12 @@
 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="DRFA" class="org.apache.log4j.DailyRollingFileAppender">
+    <param name="Append" value="false" />
+    <param name="BufferedIO" value="true" />
+    <param name="BufferSize" value="1000" />
+    <param name="DatePattern" value=".dd-MM-yyyy" />
     <param name="File" value="target/hadoop.log" />
-    <param name="DatePattern" value=".yyyy-MM-dd" />
+    <param name="ImmediateFlush" value="false" />
     <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="%d{ISO8601} %p %c: %m%n" />
     </layout>
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-FileAppender-with-props.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-FileAppender-with-props.properties
index 2712efc..e503ae1 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-FileAppender-with-props.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-FileAppender-with-props.properties
@@ -30,7 +30,11 @@ log4j.rootLogger=TRACE, FILE_APPENDER
 hadoop.log.maxfilesize=256MB
 hadoop.log.maxbackupindex=20
 log4j.appender.FILE_APPENDER=org.apache.log4j.FileAppender
-log4j.appender.FILE_APPENDER.file=${log4j.test.tmpdir}/${hadoop.log.file}
+log4j.appender.FILE_APPENDER.Append=false
+log4j.appender.FILE_APPENDER.BufferedIO=true
+log4j.appender.FILE_APPENDER.BufferSize=1000
+log4j.appender.FILE_APPENDER.File=${log4j.test.tmpdir}/${hadoop.log.file}
+log4j.appender.FILE_APPENDER.ImmediateFlush=false
 log4j.appender.FILE_APPENDER.layout=org.apache.log4j.PatternLayout
 
 # Pattern format: Date LogLevel LoggerName LogMessage
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender-with-props.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender-with-props.properties
index 9cb6ea9..fd6c645 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender-with-props.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender-with-props.properties
@@ -31,8 +31,11 @@ log4j.rootLogger=TRACE, RFA
 hadoop.log.maxfilesize=256MB
 hadoop.log.maxbackupindex=20
 log4j.appender.RFA=org.apache.log4j.RollingFileAppender
+log4j.appender.RFA.Append=false
+log4j.appender.RFA.BufferedIO=true
+log4j.appender.RFA.BufferSize=1000
 log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file}
-
+log4j.appender.RFA.ImmediateFlush=false
 log4j.appender.RFA.MaxFileSize=${hadoop.log.maxfilesize}
 log4j.appender.RFA.MaxBackupIndex=${hadoop.log.maxbackupindex}
 
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender.properties
index cb848cf..310471a 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender.properties
@@ -26,8 +26,11 @@ log4j.rootLogger=TRACE, RFA
 # Rolling File Appender - cap space usage at 5gb.
 #
 log4j.appender.RFA=org.apache.log4j.RollingFileAppender
+log4j.appender.RFA.Append=false
+log4j.appender.RFA.BufferedIO=true
+log4j.appender.RFA.BufferSize=1000
 log4j.appender.RFA.File=target/hadoop.log
-
+log4j.appender.RFA.ImmediateFlush=false
 log4j.appender.RFA.MaxFileSize=256MB
 log4j.appender.RFA.MaxBackupIndex=20
 
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender.xml b/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender.xml
index 5a20064..1ad1d4b 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender.xml
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender.xml
@@ -18,7 +18,11 @@
 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="RFA" class="org.apache.log4j.RollingFileAppender">
+    <param name="Append" value="false" />
+    <param name="BufferedIO" value="true" />
+    <param name="BufferSize" value="1000" />
     <param name="File" value="target/hadoop.log" />
+    <param name="ImmediateFlush" value="false" />
     <param name="MaxFileSize" value="256MB" />
     <param name="MaxBackupIndex" value="20" />
     <layout class="org.apache.log4j.PatternLayout">
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.properties
index b40bbd3..ba1197c 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.properties
@@ -28,6 +28,7 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.Follow=true
 log4j.appender.Console.Target=System.err
 log4j.appender.Console.layout=org.apache.log4j.EnhancedPatternLayout
 log4j.appender.Console.layout.ConversionPattern=%d{ISO8601} [%t][%c] %-5p %X %x: %m%n
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.xml b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.xml
index aab4074..3e1b2a0 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.xml
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.xml
@@ -18,6 +18,7 @@
 <!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="Follow" value="true" />
     <param name="Target" value="System.err" />
     <layout class="org.apache.log4j.EnhancedPatternLayout">
       <param name="ConversionPattern" value="%d{ISO8601} [%t][%c] %-5p %X %x: %m%n" />
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.properties
index a3b618d..ac94b1d 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.properties
@@ -28,6 +28,7 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.Follow=true
 log4j.appender.Console.Target=System.err
 log4j.appender.Console.layout=org.apache.log4j.HTMLLayout
 log4j.appender.Console.layout.Title=Headline
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.xml b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.xml
index 6c2ae53..f03131d 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.xml
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.xml
@@ -18,6 +18,7 @@
 <!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="Follow" value="true" />
     <param name="Target" value="System.err" />
     <layout class="org.apache.log4j.HTMLLayout">
       <param name="Title" value="Headline" />
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.properties
index d651cd7..679afd3 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.properties
@@ -28,6 +28,7 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.Follow=true
 log4j.appender.Console.Target=System.err
 log4j.appender.Console.layout=org.apache.log4j.PatternLayout
 log4j.appender.Console.layout.ConversionPattern=%d{ISO8601} [%t][%c] %-5p: %m%n
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.xml b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.xml
index cbe264a..65ae57f 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.xml
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.xml
@@ -18,6 +18,7 @@
 <!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="Follow" value="true" />
     <param name="Target" value="System.err" />
     <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="%d{ISO8601} [%t][%c] %-5p: %m%n" />
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.properties
index 4133b5a..42f29d3 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.properties
@@ -28,6 +28,7 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.Follow=true
 log4j.appender.Console.Target=System.err
 log4j.appender.Console.layout=org.apache.log4j.SimpleLayout
 
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.xml b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.xml
index b38d8f5..30263bf 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.xml
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.xml
@@ -18,6 +18,7 @@
 <!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="Follow" value="true" />
     <param name="Target" value="System.err" />
     <layout class="org.apache.log4j.SimpleLayout" />
   </appender>
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.properties
index f3810f2..01cc0b0 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.properties
@@ -28,9 +28,13 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.Follow=true
 log4j.appender.Console.Target=System.err
 log4j.appender.Console.layout=org.apache.log4j.TTCCLayout
-log4j.appender.Console.layout.ThreadPrinting=true
+log4j.appender.Console.layout.ThreadPrinting=false
 log4j.appender.Console.layout.CategoryPrefixing=false
+log4j.appender.Console.layout.ContextPrinting=false
+log4j.appender.Console.layout.DateFormat=ISO8601
+log4j.appender.Console.layout.TimeZone=CET
 
 log4j.logger.com.example.foo = DEBUG
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
index 0de8052..b0900da 100644
--- 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
@@ -18,10 +18,14 @@
 <!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="Follow" value="true" />
     <param name="Target" value="System.err" />
     <layout class="org.apache.log4j.TTCCLayout">
-      <param name="ThreadPrinting" value="true" />
+      <param name="ThreadPrinting" value="false" />
       <param name="CategoryPrefixing" value="false" />
+      <param name="ContextPrinting" value="false" />
+      <param name="DateFormat" value="ISO8601" />
+      <param name="TimeZone" value="CET" />
     </layout>
   </appender>
 
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties
index a4c2bf5..f8a22af 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties
@@ -28,6 +28,7 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.Follow=true
 log4j.appender.Console.Target=System.err
 log4j.appender.Console.layout=org.apache.log4j.xml.XMLLayout
 log4j.appender.Console.layout.LocationInfo=true
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-defaultValues.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-defaultValues.properties
new file mode 100644
index 0000000..15627a4
--- /dev/null
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-defaultValues.properties
@@ -0,0 +1,82 @@
+#
+# 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.
+#
+
+##############################################################################
+#
+# Configuration file with minimal number of non-default values
+#
+log4j.rootLogger = TRACE, HTMLLayout, PatternLayout, TTCCLayout, XMLLayout,\
+ConsoleAppender, DailyRollingFileAppender, FileAppender, RollingFileAppender
+
+##############################################################################
+#
+# HTMLLayout
+#
+log4j.appender.HTMLLayout=org.apache.log4j.ConsoleAppender
+log4j.appender.HTMLLayout.layout=org.apache.log4j.HTMLLayout
+
+##############################################################################
+#
+# PatternLayout
+#
+log4j.appender.PatternLayout=org.apache.log4j.ConsoleAppender
+log4j.appender.PatternLayout.layout=org.apache.log4j.PatternLayout
+
+##############################################################################
+#
+# TTCCLayout
+#
+log4j.appender.TTCCLayout=org.apache.log4j.ConsoleAppender
+log4j.appender.TTCCLayout.layout=org.apache.log4j.TTCCLayout
+
+##############################################################################
+#
+# XMLLayout
+#
+log4j.appender.XMLLayout=org.apache.log4j.ConsoleAppender
+log4j.appender.XMLLayout.layout=org.apache.log4j.xml.XMLLayout
+
+##############################################################################
+#
+# ConsoleAppender
+#
+log4j.appender.ConsoleAppender=org.apache.log4j.ConsoleAppender
+log4j.appender.ConsoleAppender.layout=org.apache.log4j.SimpleLayout
+
+##############################################################################
+#
+# DailyRollingFileAppender
+#
+log4j.appender.DailyRollingFileAppender=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.DailyRollingFileAppender.File=target/dailyRollingFileAppender
+log4j.appender.DailyRollingFileAppender.layout=org.apache.log4j.SimpleLayout
+
+##############################################################################
+#
+# FileAppender
+#
+log4j.appender.FileAppender=org.apache.log4j.FileAppender
+log4j.appender.FileAppender.File=target/fileAppender
+log4j.appender.FileAppender.layout=org.apache.log4j.SimpleLayout
+
+##############################################################################
+#
+# RollingFileAppender
+#
+log4j.appender.RollingFileAppender=org.apache.log4j.RollingFileAppender
+log4j.appender.RollingFileAppender.File=target/rollingFileAppender
+log4j.appender.RollingFileAppender.layout=org.apache.log4j.SimpleLayout
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-defaultValues.xml b/log4j-1.2-api/src/test/resources/config-1.2/log4j-defaultValues.xml
new file mode 100644
index 0000000..7d5d357
--- /dev/null
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-defaultValues.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+  <appender name="HTMLLayout" class="org.apache.log4j.ConsoleAppender">
+    <layout class="org.apache.log4j.HTMLLayout"/>
+  </appender>
+
+  <appender name="PatternLayout" class="org.apache.log4j.ConsoleAppender">
+    <layout class="org.apache.log4j.PatternLayout"/>
+  </appender>
+
+  <appender name="TTCCLayout" class="org.apache.log4j.ConsoleAppender">
+    <layout class="org.apache.log4j.TTCCLayout"/>
+  </appender>
+
+  <appender name="XMLLayout" class="org.apache.log4j.ConsoleAppender">
+    <layout class="org.apache.log4j.xml.XMLLayout"/>
+  </appender>
+
+  <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
+    <layout class="org.apache.log4j.SimpleLayout"/>
+  </appender>
+
+  <appender name="DailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
+    <param name="file" value="target/dailyRollingFileAppender"/>
+    <layout class="org.apache.log4j.SimpleLayout"/>
+  </appender>
+
+  <appender name="FileAppender" class="org.apache.log4j.FileAppender">
+    <param name="file" value="target/fileAppender"/>
+    <layout class="org.apache.log4j.SimpleLayout"/>
+  </appender>
+
+  <appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender">
+    <param name="file" value="target/rollingFileAppender"/>
+    <layout class="org.apache.log4j.SimpleLayout"/>
+  </appender>
+
+  <root>
+    <priority value="TRACE" />
+    <appender-ref ref="HTMLLayout" />
+    <appender-ref ref="PatternLayout" />
+    <appender-ref ref="TTCCLayout" />
+    <appender-ref ref="XMLLayout" />
+    <appender-ref ref="ConsoleAppender" />
+    <appender-ref ref="DailyRollingFileAppender" />
+    <appender-ref ref="FileAppender" />
+    <appender-ref ref="RollingFileAppender" />
+  </root>
+</log4j:configuration>
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.properties
index 188f1f9..d42e654 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.properties
@@ -28,7 +28,11 @@ log4j.rootLogger=TRACE, File
 #
 
 log4j.appender.File=org.apache.log4j.FileAppender
+log4j.appender.File.Append=false
+log4j.appender.File.BufferedIO=true
+log4j.appender.File.BufferSize=1000
 log4j.appender.File.File=target/mylog.txt
+log4j.appender.File.ImmediateFlush=false
 log4j.appender.File.layout=org.apache.log4j.SimpleLayout
 
 log4j.logger.com.example.foo = DEBUG
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.xml b/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.xml
index 37016f1..fdccce7 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.xml
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.xml
@@ -18,7 +18,11 @@
 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="File" class="org.apache.log4j.FileAppender">
+    <param name="Append" value="false" />
+    <param name="BufferedIO" value="true" />
+    <param name="BufferSize" value="1000" />
     <param name="File" value="target/mylog.txt" />
+    <param name="ImmediateFlush" value="false" />
     <layout class="org.apache.log4j.SimpleLayout" />
   </appender>
 
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.properties
index febf2b8..167cd86 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.properties
@@ -28,4 +28,10 @@ log4j.rootLogger=TRACE, RFA
 # Rolling File Appender
 #
 log4j.appender.RFA=org.apache.log4j.RollingFileAppender
+log4j.appender.RFA.Append=false
+log4j.appender.RFA.BufferedIO=true
+log4j.appender.RFA.BufferSize=1000
 log4j.appender.RFA.File=${java.io.tmpdir}/${hadoop.log.file}
+log4j.appender.RFA.ImmediateFlush=false
+log4j.appender.RFA.MaxBackupIndex=16
+log4j.appender.RFA.MaxFileSize=20 MB
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.xml b/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.xml
index 8ced3f5..ccfd9e7 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.xml
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.xml
@@ -17,8 +17,14 @@
 -->
 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-  <appender name="RFA" class="org.apache.log4j.DailyRollingFileAppender">
+  <appender name="RFA" class="org.apache.log4j.RollingFileAppender">
+    <param name="Append" value="false" />
+    <param name="BufferedIO" value="true" />
+    <param name="BufferSize" value="1000" />
     <param name="File" value="${java.io.tmpdir}/hadoop.log" />
+    <param name="ImmediateFlush" value="false" />
+    <param name="MaxBackupIndex" value="16" />
+    <param name="MaxFileSize" value="20 MB" />
   </appender>
 
   <root>
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-2.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-2.properties
index 5933fbf..686bc77 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-2.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-2.properties
@@ -29,4 +29,10 @@ log4j.rootLogger=TRACE, RFA
 # Rolling File Appender
 #
 log4j.appender.RFA=org.apache.log4j.RollingFileAppender
+log4j.appender.RFA.Append=false
+log4j.appender.RFA.BufferedIO=true
+log4j.appender.RFA.BufferSize=1000
 log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file}
+log4j.appender.RFA.ImmediateFlush=false
+log4j.appender.RFA.MaxBackupIndex=16
+log4j.appender.RFA.MaxBackupSize=20 MB

[logging-log4j2] 03/05: Log4j 1.2 bridge creates a SocketAppender instead of a SyslogAppender.

Posted by pk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a035a73a7cfd2b96db97465f248d2dd091c04401
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sat Jan 22 11:51:36 2022 -0500

    Log4j 1.2 bridge creates a SocketAppender instead of a SyslogAppender.
    
    - Test fixtures incorrectly used an extra property for port instead of
    the host:port pair supported by Log4j 1.
    - Remove unused @SuppressWarnings value.
    - Make sure we use TCP as the default protocol in XML.
    
    Conflicts:
    	log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java
    	src/changes/changes.xml
---
 .../org/apache/log4j/builders/AbstractBuilder.java |  6 +++++-
 .../builders/appender/SyslogAppenderBuilder.java   |  8 ++++----
 .../config/SyslogAppenderConfigurationTest.java    | 24 ++++++++++++++++------
 .../log4j1-syslog-protocol-default.properties      |  3 +--
 .../log4j1-syslog-protocol-tcp.properties          |  3 +--
 .../log4j1-syslog-protocol-udp.properties          |  3 +--
 .../log4j/core/appender/SyslogAppender.java        |  2 +-
 .../log4j/core/net/AbstractSocketManager.java      | 21 ++++++++++++++++++-
 src/changes/changes.xml                            | 10 ++++++++-
 9 files changed, 60 insertions(+), 20 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 c6118cf..f7a482b 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
@@ -155,9 +155,13 @@ public abstract class AbstractBuilder implements Builder {
     }
 
     protected String getValueAttribute(final Element element) {
-        return substVars(element.getAttribute(VALUE_ATTR));
+        return getValueAttribute(element, null);
     }
 
+    protected String getValueAttribute(final Element element, final String defaultValue) {
+        final String attribute = element.getAttribute(VALUE_ATTR);
+        return substVars(attribute != null ? attribute : defaultValue);
+    }
 
     protected String substVars(final String value) {
         return OptionConverter.substVars(value, properties);
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java
index 31618a4..93faf26 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java
@@ -39,7 +39,7 @@ import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.spi.Filter;
 import org.apache.log4j.xml.XmlConfiguration;
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.appender.SocketAppender;
+import org.apache.logging.log4j.core.appender.SyslogAppender;
 import org.apache.logging.log4j.core.layout.SyslogLayout;
 import org.apache.logging.log4j.core.net.Facility;
 import org.apache.logging.log4j.core.net.Protocol;
@@ -77,7 +77,7 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
         AtomicReference<String> facility = new AtomicReference<>();
         AtomicReference<String> level = new AtomicReference<>();
         AtomicReference<String> host = new AtomicReference<>();
-        AtomicReference<Protocol> protocol = new AtomicReference<>();
+        AtomicReference<Protocol> protocol = new AtomicReference<>(Protocol.TCP);
         forEachElement(appenderElement.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
                 case LAYOUT_TAG:
@@ -105,7 +105,7 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
                             break;
                         }
                         case PROTOCOL_PARAM:
-                            protocol.set(Protocol.valueOf(getValueAttribute(currentElement)));
+                            protocol.set(Protocol.valueOf(getValueAttribute(currentElement, Protocol.TCP.name())));
                             break;
                     }
                     break;
@@ -148,7 +148,7 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
         }
 
         org.apache.logging.log4j.core.Filter fileFilter = buildFilters(level, filter);
-        return new AppenderWrapper(SocketAppender.newBuilder()
+        return new AppenderWrapper(SyslogAppender.newSyslogAppenderBuilder()
                 .setName(name)
                 .setConfiguration(configuration)
                 .setLayout(appenderLayout)
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/config/SyslogAppenderConfigurationTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/config/SyslogAppenderConfigurationTest.java
index 93eee35..a63d808 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/config/SyslogAppenderConfigurationTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/config/SyslogAppenderConfigurationTest.java
@@ -16,16 +16,21 @@
  */
 package org.apache.log4j.config;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Appender;
-import org.apache.logging.log4j.core.appender.SocketAppender;
+import org.apache.logging.log4j.core.appender.SyslogAppender;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.filter.ThresholdFilter;
+import org.apache.logging.log4j.core.layout.Rfc5424Layout;
 import org.apache.logging.log4j.core.net.AbstractSocketManager;
+import org.apache.logging.log4j.core.net.Facility;
 import org.apache.logging.log4j.core.net.Protocol;
 import org.junit.Test;
 
@@ -34,25 +39,32 @@ import org.junit.Test;
  */
 public class SyslogAppenderConfigurationTest {
 
-    private void checkProtocol(final Protocol expected, final Configuration configuration) {
+    private void check(final Protocol expected, final Configuration configuration) {
         final Map<String, Appender> appenders = configuration.getAppenders();
         assertNotNull(appenders);
         final String appenderName = "syslog";
         final Appender appender = appenders.get(appenderName);
         assertNotNull(appender, "Missing appender " + appenderName);
-        final SocketAppender socketAppender = (SocketAppender) appender;
+        final SyslogAppender syslogAppender = (SyslogAppender) appender;
         @SuppressWarnings("resource")
-        final AbstractSocketManager manager = socketAppender.getManager();
+        final AbstractSocketManager manager = syslogAppender.getManager();
         final String prefix = expected + ":";
         assertTrue(manager.getName().startsWith(prefix), () -> String.format("'%s' does not start with '%s'", manager.getName(), prefix));
+        // Threshold
+        final ThresholdFilter filter = (ThresholdFilter) syslogAppender.getFilter();
+        assertEquals(Level.DEBUG, filter.getLevel());
+        // Host
+        assertEquals("localhost", manager.getHost());
+        // Port
+        assertEquals(9999, manager.getPort());
     }
 
     private void checkProtocolPropertiesConfig(final Protocol expected, final String xmlPath) throws IOException {
-        checkProtocol(expected, TestConfigurator.configure(xmlPath).getConfiguration());
+        check(expected, TestConfigurator.configure(xmlPath).getConfiguration());
     }
 
     private void checkProtocolXmlConfig(final Protocol expected, final String xmlPath) throws IOException {
-        checkProtocol(expected, TestConfigurator.configure(xmlPath).getConfiguration());
+        check(expected, TestConfigurator.configure(xmlPath).getConfiguration());
     }
 
     @Test
diff --git a/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-default.properties b/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-default.properties
index 5a140e5..2bfda78 100644
--- a/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-default.properties
+++ b/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-default.properties
@@ -18,8 +18,7 @@
 log4j.rootLogger=DEBUG,syslog
 log4j.appender.syslog=org.apache.log4j.net.SyslogAppender
 log4j.appender.syslog.Threshold=DEBUG
-log4j.appender.syslog.syslogHost=localhost
-log4j.appender.syslog.port=9999
+log4j.appender.syslog.syslogHost=localhost:9999
 log4j.appender.syslog.header=true
 log4j.appender.syslog.Facility=LOCAL3
 log4j.appender.syslog.layout=org.apache.log4j.PatternLayout
diff --git a/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-tcp.properties b/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-tcp.properties
index 57ece1b..9a95669 100644
--- a/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-tcp.properties
+++ b/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-tcp.properties
@@ -18,8 +18,7 @@
 log4j.rootLogger=DEBUG,syslog
 log4j.appender.syslog=org.apache.log4j.net.SyslogAppender
 log4j.appender.syslog.Threshold=DEBUG
-log4j.appender.syslog.syslogHost=localhost
-log4j.appender.syslog.port=9999
+log4j.appender.syslog.syslogHost=localhost:9999
 log4j.appender.syslog.protocol=TCP
 log4j.appender.syslog.header=true
 log4j.appender.syslog.Facility=LOCAL3
diff --git a/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-udp.properties b/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-udp.properties
index 07ce88c..b7ab6a7 100644
--- a/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-udp.properties
+++ b/log4j-1.2-api/src/test/resources/log4j1-syslog-protocol-udp.properties
@@ -18,8 +18,7 @@
 log4j.rootLogger=DEBUG,syslog
 log4j.appender.syslog=org.apache.log4j.net.SyslogAppender
 log4j.appender.syslog.Threshold=DEBUG
-log4j.appender.syslog.syslogHost=localhost
-log4j.appender.syslog.port=9999
+log4j.appender.syslog.syslogHost=localhost:9999
 log4j.appender.syslog.protocol=UDP
 log4j.appender.syslog.header=true
 log4j.appender.syslog.Facility=LOCAL3
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
index 777cf1c..9f151d1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
@@ -102,7 +102,7 @@ public class SyslogAppender extends SocketAppender {
         @PluginElement("LoggerFields")
         private LoggerFields[] loggerFields;
 
-        @SuppressWarnings({"resource", "unchecked"})
+        @SuppressWarnings({"resource"})
         @Override
         public SyslogAppender build() {
             final Protocol protocol = getProtocol();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/AbstractSocketManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/AbstractSocketManager.java
index 76d3e46..253143e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/AbstractSocketManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/AbstractSocketManager.java
@@ -46,7 +46,8 @@ public abstract class AbstractSocketManager extends OutputStreamManager {
     protected final int port;
 
     /**
-     * The Constructor.
+     * Constructs a new instance.
+     *
      * @param name The unique name of this connection.
      * @param os The OutputStream to manage.
      * @param inetAddress The Internet address.
@@ -79,4 +80,22 @@ public abstract class AbstractSocketManager extends OutputStreamManager {
         result.put("address", inetAddress.getHostAddress());
         return result;
     }
+
+    /**
+     * Gets the host.
+     *
+     * @return the host.
+     */
+    public String getHost() {
+        return host;
+    }
+
+    /**
+     * Gets the port.
+     *
+     * @return the port.
+     */
+    public int getPort() {
+        return port;
+    }
 }
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index be44ffe..03d4f36 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -315,7 +315,15 @@
       </action>
       <action dev="ggregory" type="fix" due-to="Gary Gregory, Piotr P. Karwasz">
         Log4j 1.2 bridge throws ClassCastException when using SimpleLayout and others #708.
-      </action>      
+      </action>
+      <action dev="ggregory" type="fix" due-to="Gary Gregory">
+        Log4j 1.2 bridge creates a SocketAppender instead of a SyslogAppender.
+      </action>
+      <action dev="ggregory" type="fix" due-to="Gary Gregory, Piotr P. Karwasz">
+      </action>
+      <action dev="ggregory" type="fix">
+        JndiManager reverts to 2.17.0 behavior: Read the system property for each call.
+      </action>
       <action dev="ggregory" type="fix" issue="LOG4J2-3330" due-to="Mircea Lemnaru, Gary Gregory">
         Configurator.setLevel not fetching the correct LoggerContext.
       </action>