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:57 UTC

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

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