You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2016/08/25 20:29:44 UTC

[1/3] logging-log4j2 git commit: Code clean-up

Repository: logging-log4j2
Updated Branches:
  refs/heads/master e0330275a -> cc0bf0b46


Code clean-up


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/fadd676e
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/fadd676e
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/fadd676e

Branch: refs/heads/master
Commit: fadd676ea2b149fdf725a028646cf1247398bdcf
Parents: 33aaf3d
Author: Mikael St�ldal <mi...@staldal.nu>
Authored: Thu Aug 25 21:30:21 2016 +0200
Committer: Mikael St�ldal <mi...@staldal.nu>
Committed: Thu Aug 25 21:40:09 2016 +0200

----------------------------------------------------------------------
 .../log4j/config/Log4j1ConfigurationParser.java | 172 +++++++++----------
 1 file changed, 80 insertions(+), 92 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fadd676e/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
----------------------------------------------------------------------
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 f98f909..11f7f76 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
@@ -50,9 +50,14 @@ import java.util.Properties;
  * <li>layout</li>
  * </ul>
  * </ul>
+ *
+ * This class is not thread-safe.
  */
 public class Log4j1ConfigurationParser {
 
+    private final Properties properties = new Properties();
+    private final ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
+
     /**
      * Parse a Log4j 1.2 properties configuration file into a ConfigurationBuilder.
      *
@@ -60,48 +65,39 @@ public class Log4j1ConfigurationParser {
      * @return  the populated ConfigurationBuilder
      * @throws IOException  if unable to read the input
      */
-    public ConfigurationBuilder<BuiltConfiguration> buildConfigurationBuilder(InputStream input) throws IOException {
-        final ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
-        builder.setConfigurationName("Log4j1");
-        final Properties properties = new Properties();
+    public ConfigurationBuilder<BuiltConfiguration> buildConfigurationBuilder(final InputStream input) throws IOException {
         properties.load(input);
-        final String rootCategoryValue = getRootCategoryValue(properties);
-        final String rootLoggerValue = getRootLoggerValue(properties);
+        final String rootCategoryValue = getLog4jValue("rootCategory");
+        final String rootLoggerValue = getLog4jValue("rootLogger");
         if (rootCategoryValue == null && rootLoggerValue == null) {
             // This is not a Log4j 1 properties configuration file.
             return null;
         }
+        builder.setConfigurationName("Log4j1");
         // DEBUG
-        final String debugValue = getLog4jValue(properties, "debug");
+        final String debugValue = getLog4jValue("debug");
         if (Boolean.valueOf(debugValue)) {
             builder.setStatusLevel(Level.DEBUG);
         }
         // Root
-        final String[] sortedAppenderNamesC = buildRootLogger(builder, getRootCategoryValue(properties));
-        final String[] sortedAppenderNamesL = buildRootLogger(builder, getRootLoggerValue(properties));
+        final String[] sortedAppenderNamesC = buildRootLogger(getLog4jValue("rootCategory"));
+        final String[] sortedAppenderNamesL = buildRootLogger(getLog4jValue("rootLogger"));
         final String[] sortedAppenderNames = sortedAppenderNamesL.length > 0 ? sortedAppenderNamesL
                 : sortedAppenderNamesC;
         // Appenders
-        final Map<String, String> classNameToProperty = buildClassToPropertyPrefixMap(properties, sortedAppenderNames);
+        final Map<String, String> classNameToProperty = buildClassToPropertyPrefixMap(sortedAppenderNames);
         for (final Map.Entry<String, String> entry : classNameToProperty.entrySet()) {
             final String appenderName = entry.getKey();
-            switch (entry.getValue()) {
-            case "org.apache.log4j.ConsoleAppender":
-                buildConsoleAppender(properties, appenderName, builder);
-                break;
-            default:
-                reportWarning("Ignoring appender " + appenderName
-                        + "; consider porting your configuration file to the current Log4j format.");
-            }
+            String appenderClass = entry.getValue();
+            buildAppender(appenderName, appenderClass);
         }
         // Loggers
-        buildLoggers(properties, "log4j.category.", builder);
-        buildLoggers(properties, "log4j.logger.", builder);
+        buildLoggers("log4j.category.");
+        buildLoggers("log4j.logger.");
         return builder;
     }
 
-    private Map<String, String> buildClassToPropertyPrefixMap(final Properties properties,
-                                                              final String[] sortedAppenderNames) {
+    private Map<String, String> buildClassToPropertyPrefixMap(final String[] sortedAppenderNames) {
         final String prefix = "log4j.appender.";
         final int preLength = prefix.length();
         final Map<String, String> map = new HashMap<>(sortedAppenderNames.length);
@@ -125,23 +121,56 @@ public class Log4j1ConfigurationParser {
         return map;
     }
 
-    private void buildConsoleAppender(final Properties properties, final String name,
-            final ConfigurationBuilder<BuiltConfiguration> builder) {
-        final AppenderComponentBuilder appenderBuilder = builder.newAppender(name, "Console");
-        buildConsoleAppenderTarget(properties, name, builder, appenderBuilder);
-        buildAppenderLayout(properties, name, builder, appenderBuilder);
-        buildConsoleAppenderFollow(properties, name, builder, appenderBuilder);
+    private void buildAppender(final String appenderName, final String appenderClass) {
+        switch (appenderClass) {
+        case "org.apache.log4j.ConsoleAppender":
+            buildConsoleAppender(appenderName);
+            break;
+        default:
+            reportWarning("Unknown appender class: " + appenderClass + "; ignoring appender: " + appenderName);
+        }
+    }
+
+    private void buildConsoleAppender(final String appenderName) {
+        final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "Console");
+        final String targetValue = getLog4jAppenderValue(appenderName, "Target", "System.out");
+        if (targetValue != null) {
+            final ConsoleAppender.Target target;
+            switch (targetValue) {
+            case "System.out":
+                target = ConsoleAppender.Target.SYSTEM_OUT;
+                break;
+            case "System.err":
+                target = ConsoleAppender.Target.SYSTEM_ERR;
+                break;
+            default:
+                reportWarning("Unknown value for console Target: " + targetValue);
+                target = null;
+            }
+            if (target != null) {
+                appenderBuilder.addAttribute("target", target);
+            }
+        }
+        buildAppenderAttribute(appenderName, appenderBuilder, "Follow", "false", "follow");
+        buildAppenderLayout(appenderName, appenderBuilder);
         builder.add(appenderBuilder);
     }
 
-    private void buildAppenderLayout(final Properties properties, final String name,
-            final ConfigurationBuilder<BuiltConfiguration> builder, final AppenderComponentBuilder appenderBuilder) {
-        final String layoutValue = getLog4jAppenderValue(properties, name, "layout", null);
-        if (layoutValue != null) {
-            switch (layoutValue) {
+    private void buildAppenderAttribute(String appenderName, AppenderComponentBuilder appenderBuilder,
+                                        String sourceAttributeName, String defaultValue, String targetAttributeName) {
+        final String attributeValue = getLog4jAppenderValue(appenderName, sourceAttributeName, defaultValue);
+        if (attributeValue != null) {
+            appenderBuilder.addAttribute(targetAttributeName, attributeValue);
+        }
+    }
+
+    private void buildAppenderLayout(final String name, final AppenderComponentBuilder appenderBuilder) {
+        final String layoutClass = getLog4jAppenderValue(name, "layout", null);
+        if (layoutClass != null) {
+            switch (layoutClass) {
             case "org.apache.log4j.PatternLayout":
             case "org.apache.log4j.EnhancedPatternLayout": {
-                final String pattern = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null)
+                final String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null)
 
                     // Log4j 2's %x (NDC) is not compatible with Log4j 1's %x
                     //   Log4j 1: "foo bar baz"
@@ -155,55 +184,54 @@ public class Log4j1ConfigurationParser {
                     // Use %properties to get the Log4j 1 format
                     .replace("%X", "%properties");
 
-                appenderBuilder.add(newPatternLayout(builder, pattern));
+                appenderBuilder.add(newPatternLayout(pattern));
                 break;
             }
             case "org.apache.log4j.SimpleLayout": {
-                appenderBuilder.add(newPatternLayout(builder, "%level - %m%n"));
+                appenderBuilder.add(newPatternLayout("%level - %m%n"));
                 break;
             }
             case "org.apache.log4j.TTCCLayout": {
                 String pattern = "%r ";
-                if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ThreadPrinting", "true"))) {
+                if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", "true"))) {
                     pattern += "[%t] ";
                 }
                 pattern += "%p ";
-                if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.CategoryPrefixing", "true"))) {
+                if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.CategoryPrefixing", "true"))) {
                     pattern += "%c ";
                 }
-                if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ContextPrinting", "true"))) {
+                if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ContextPrinting", "true"))) {
                     pattern += "%notEmpty{%ndc }";
                 }
                 pattern += "- %m%n";
-                appenderBuilder.add(newPatternLayout(builder, pattern));
+                appenderBuilder.add(newPatternLayout(pattern));
                 break;
             }
             case "org.apache.log4j.HTMLLayout": {
                 LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
                 htmlLayout.addAttribute("title",
-                        getLog4jAppenderValue(properties, name, "layout.Title", "Log4J Log Messages"));
+                        getLog4jAppenderValue(name, "layout.Title", "Log4J Log Messages"));
                 htmlLayout.addAttribute("locationInfo",
-                        Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.LocationInfo", "false")));
+                        Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", "false")));
                 appenderBuilder.add(htmlLayout);
                 break;
             }
             case "org.apache.log4j.xml.XMLLayout": {
                 LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
                 xmlLayout.addAttribute("locationInfo",
-                        Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.LocationInfo", "false")));
+                        Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", "false")));
                 xmlLayout.addAttribute("properties",
-                        Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.Properties", "false")));
+                        Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.Properties", "false")));
                 appenderBuilder.add(xmlLayout);
                 break;
             }
             default:
-                reportWarning("Unsupported layout: " + layoutValue);
+                reportWarning("Unknown layout class: " + layoutClass);
             }
         }
     }
 
-    private LayoutComponentBuilder newPatternLayout(final ConfigurationBuilder<BuiltConfiguration> builder,
-            final String pattern) {
+    private LayoutComponentBuilder newPatternLayout(final String pattern) {
         final LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout");
         if (pattern != null) {
             layoutBuilder.addAttribute("pattern", pattern);
@@ -211,38 +239,7 @@ public class Log4j1ConfigurationParser {
         return layoutBuilder;
     }
 
-    private void buildConsoleAppenderTarget(final Properties properties, final String name,
-            final ConfigurationBuilder<BuiltConfiguration> builder, final AppenderComponentBuilder appenderBuilder) {
-        final String value = getLog4jAppenderValue(properties, name, "Target", "System.out");
-        if (value != null) {
-            final ConsoleAppender.Target target;
-            switch (value) {
-            case "System.out":
-                target = ConsoleAppender.Target.SYSTEM_OUT;
-                break;
-            case "System.err":
-                target = ConsoleAppender.Target.SYSTEM_ERR;
-                break;
-            default:
-                reportWarning("Unknow value for console Target: " + value);
-                target = null;
-            }
-            if (target != null) {
-                appenderBuilder.addAttribute("target", target);
-            }
-        }
-    }
-
-    private void buildConsoleAppenderFollow(final Properties properties, final String name,
-            final ConfigurationBuilder<BuiltConfiguration> builder, final AppenderComponentBuilder appenderBuilder) {
-        final String value = getLog4jAppenderValue(properties, name, "Follow", "false");
-        if (value != null) {
-            appenderBuilder.addAttribute("follow", Boolean.valueOf(value).booleanValue());
-        }
-    }
-
-    private String[] buildRootLogger(final ConfigurationBuilder<BuiltConfiguration> builder,
-            final String rootLoggerValue) {
+    private String[] buildRootLogger(final String rootLoggerValue) {
         if (rootLoggerValue == null) {
             return new String[0];
         }
@@ -258,8 +255,7 @@ public class Log4j1ConfigurationParser {
         return sortedAppenderNames;
     }
 
-    private void buildLoggers(final Properties properties, final String prefix,
-            final ConfigurationBuilder<BuiltConfiguration> builder) {
+    private void buildLoggers(final String prefix) {
         final int preLength = prefix.length();
         for (final Map.Entry<Object, Object> entry : properties.entrySet()) {
             final Object keyObj = entry.getKey();
@@ -277,23 +273,15 @@ public class Log4j1ConfigurationParser {
 
     }
 
-    private String getLog4jAppenderValue(final Properties properties, final String appenderName,
-            final String attributeName, final String defaultValue) {
+    private String getLog4jAppenderValue(final String appenderName, final String attributeName,
+                                         final String defaultValue) {
         return properties.getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
     }
 
-    private String getLog4jValue(final Properties properties, final String key) {
+    private String getLog4jValue(final String key) {
         return properties.getProperty("log4j." + key);
     }
 
-    private String getRootCategoryValue(final Properties properties) {
-        return getLog4jValue(properties, "rootCategory");
-    }
-
-    private String getRootLoggerValue(final Properties properties) {
-        return getLog4jValue(properties, "rootLogger");
-    }
-
     private void reportWarning(final String msg) {
         StatusLogger.getLogger().warn("Log4j 1 configuration parser: " + msg);
     }


[3/3] logging-log4j2 git commit: Merge remote-tracking branch 'origin/master'

Posted by mi...@apache.org.
Merge remote-tracking branch 'origin/master'


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/cc0bf0b4
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/cc0bf0b4
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/cc0bf0b4

Branch: refs/heads/master
Commit: cc0bf0b46232a88dc7b83a68183f6987b2809422
Parents: 3aceb2a e033027
Author: Mikael St�ldal <mi...@staldal.nu>
Authored: Thu Aug 25 22:29:13 2016 +0200
Committer: Mikael St�ldal <mi...@staldal.nu>
Committed: Thu Aug 25 22:29:13 2016 +0200

----------------------------------------------------------------------
 .../core/config/plugins/util/ResolverUtil.java  |  11 +-
 .../plugins/util/PluginManagerPackagesTest.java |   2 +-
 .../util/ResolverUtilCustomProtocolTest.java    | 208 +++++++++++++++++++
 .../config/plugins/util/ResolverUtilTest.java   | 146 +++++++------
 .../junit/URLStreamHandlerFactoryRule.java      |  96 +++++++++
 src/changes/changes.xml                         |   2 +-
 6 files changed, 400 insertions(+), 65 deletions(-)
----------------------------------------------------------------------



[2/3] logging-log4j2 git commit: Support FileAppender

Posted by mi...@apache.org.
Support FileAppender


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/3aceb2a3
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/3aceb2a3
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/3aceb2a3

Branch: refs/heads/master
Commit: 3aceb2a327bdade228ec15662bce4cf541f82239
Parents: fadd676
Author: Mikael St�ldal <mi...@staldal.nu>
Authored: Thu Aug 25 22:29:08 2016 +0200
Committer: Mikael St�ldal <mi...@staldal.nu>
Committed: Thu Aug 25 22:29:08 2016 +0200

----------------------------------------------------------------------
 .../log4j/config/Log4j1ConfigurationParser.java | 48 ++++++++++++++++++--
 .../config/Log4j1ConfigurationFactoryTest.java  | 25 +++++++++-
 ...g4j-console-EnhancedPatternLayout.properties |  1 -
 .../log4j-console-HtmlLayout.properties         |  1 -
 .../log4j-console-PatternLayout.properties      |  1 -
 .../log4j-console-SimpleLayout.properties       |  1 -
 .../log4j-console-TTCCLayout.properties         |  1 -
 .../log4j-console-XmlLayout.properties          |  1 -
 .../log4j-file-SimpleLayout.properties          | 17 +++++++
 9 files changed, 83 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
----------------------------------------------------------------------
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 11f7f76..84b8533 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
@@ -19,6 +19,7 @@ package org.apache.log4j.config;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.appender.ConsoleAppender;
 import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder;
 import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
 import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
 import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
@@ -126,6 +127,9 @@ public class Log4j1ConfigurationParser {
         case "org.apache.log4j.ConsoleAppender":
             buildConsoleAppender(appenderName);
             break;
+        case "org.apache.log4j.FileAppender":
+            buildFileAppender(appenderName);
+            break;
         default:
             reportWarning("Unknown appender class: " + appenderClass + "; ignoring appender: " + appenderName);
         }
@@ -151,16 +155,46 @@ public class Log4j1ConfigurationParser {
                 appenderBuilder.addAttribute("target", target);
             }
         }
-        buildAppenderAttribute(appenderName, appenderBuilder, "Follow", "false", "follow");
+        buildAttribute(appenderName, appenderBuilder, "Follow", "follow");
+        if ("false".equalsIgnoreCase(getLog4jAppenderValue(appenderName, "ImmediateFlush"))) {
+            reportWarning("ImmediateFlush=false is not supported on Console appender");
+        }
         buildAppenderLayout(appenderName, appenderBuilder);
         builder.add(appenderBuilder);
     }
 
-    private void buildAppenderAttribute(String appenderName, AppenderComponentBuilder appenderBuilder,
-                                        String sourceAttributeName, String defaultValue, String targetAttributeName) {
-        final String attributeValue = getLog4jAppenderValue(appenderName, sourceAttributeName, defaultValue);
+    private void buildFileAppender(final String appenderName) {
+        final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "File");
+        buildMandatoryAttribute(appenderName, appenderBuilder, "File", "fileName");
+        buildAttribute(appenderName, appenderBuilder, "Append", "append");
+        buildAttribute(appenderName, appenderBuilder, "BufferedIO", "bufferedIo");
+        buildAttribute(appenderName, appenderBuilder, "BufferSize", "bufferSize");
+        buildAttribute(appenderName, appenderBuilder, "ImmediateFlush", "immediateFlush");
+        buildAppenderLayout(appenderName, appenderBuilder);
+        builder.add(appenderBuilder);
+    }
+
+    private void buildAttribute(String componentName, ComponentBuilder componentBuilder,
+                                String sourceAttributeName, String targetAttributeName) {
+        final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
+        if (attributeValue != null) {
+            componentBuilder.addAttribute(targetAttributeName, attributeValue);
+        }
+    }
+
+    private void buildAttributeWithDefault(String componentName, ComponentBuilder componentBuilder,
+                                           String sourceAttributeName, String targetAttributeName, String defaultValue) {
+        final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
+        componentBuilder.addAttribute(targetAttributeName, attributeValue);
+    }
+
+    private void buildMandatoryAttribute(String componentName, ComponentBuilder componentBuilder,
+                                         String sourceAttributeName, String targetAttributeName) {
+        final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
         if (attributeValue != null) {
-            appenderBuilder.addAttribute(targetAttributeName, attributeValue);
+            componentBuilder.addAttribute(targetAttributeName, attributeValue);
+        } else {
+            reportWarning("Missing " + sourceAttributeName + " for " + componentName);
         }
     }
 
@@ -273,6 +307,10 @@ public class Log4j1ConfigurationParser {
 
     }
 
+    private String getLog4jAppenderValue(final String appenderName, final String attributeName) {
+        return properties.getProperty("log4j.appender." + appenderName + "." + attributeName);
+    }
+
     private String getLog4jAppenderValue(final String appenderName, final String attributeName,
                                          final String defaultValue) {
         return properties.getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java
----------------------------------------------------------------------
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 9f34563..43d7b14 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
@@ -23,6 +23,7 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.appender.ConsoleAppender;
 import org.apache.logging.log4j.core.appender.ConsoleAppender.Target;
+import org.apache.logging.log4j.core.appender.FileAppender;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.layout.HtmlLayout;
@@ -41,8 +42,6 @@ public class Log4j1ConfigurationFactoryTest {
         assertNotNull(configuration);
         final ConsoleAppender appender = configuration.getAppender("Console");
         assertNotNull(appender);
-        // Can't set ImmediateFlush for a Console Appender in Log4j 2 like you can in 1.2
-        assertTrue(appender.getImmediateFlush());
         assertEquals(Target.SYSTEM_ERR, appender.getTarget());
         //
         final LoggerConfig loggerConfig = configuration.getLoggerConfig("com.example.foo");
@@ -51,6 +50,22 @@ public class Log4j1ConfigurationFactoryTest {
         return appender.getLayout();
     }
 
+    private Layout<?> testFile(final String configResource) throws Exception {
+        final URL configLocation = ClassLoader.getSystemResource(configResource);
+        assertNotNull(configLocation);
+        final Configuration configuration = new Log4j1ConfigurationFactory().getConfiguration("test",
+                configLocation.toURI());
+        assertNotNull(configuration);
+        final FileAppender appender = configuration.getAppender("File");
+        assertNotNull(appender);
+        assertEquals("target/mylog.txt", appender.getFileName());
+        //
+        final LoggerConfig loggerConfig = configuration.getLoggerConfig("com.example.foo");
+        assertNotNull(loggerConfig);
+        assertEquals(Level.DEBUG, loggerConfig.getLevel());
+        return appender.getLayout();
+    }
+
     @Test
     public void testConsoleEnhancedPatternLayout() throws Exception {
         final PatternLayout layout = (PatternLayout) testConsole("config-1.2/log4j-console-EnhancedPatternLayout.properties");
@@ -88,4 +103,10 @@ public class Log4j1ConfigurationFactoryTest {
         assertTrue(layout.isLocationInfo());
         assertFalse(layout.isProperties());
     }
+
+    @Test
+    public void testFileSimpleLayout() throws Exception {
+        final PatternLayout layout = (PatternLayout) testFile("config-1.2/log4j-file-SimpleLayout.properties");
+        assertEquals("%level - %m%n", layout.getConversionPattern());
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.properties
----------------------------------------------------------------------
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 01a4463..6793eb2 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
@@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
-log4j.appender.Console.ImmediateFlush=false
 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

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.properties
----------------------------------------------------------------------
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 304180c..216a12e 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
@@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
-log4j.appender.Console.ImmediateFlush=false
 log4j.appender.Console.Target=System.err
 log4j.appender.Console.layout=org.apache.log4j.HTMLLayout
 log4j.appender.Console.layout.Title=Headline

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.properties
----------------------------------------------------------------------
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 fab7070..810a494 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
@@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
-log4j.appender.Console.ImmediateFlush=false
 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

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.properties
----------------------------------------------------------------------
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 5e915f8..5a8ac4e 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
@@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
-log4j.appender.Console.ImmediateFlush=false
 log4j.appender.Console.Target=System.err
 log4j.appender.Console.layout=org.apache.log4j.SimpleLayout
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.properties
----------------------------------------------------------------------
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 9f91789..80d38c2 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
@@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
-log4j.appender.Console.ImmediateFlush=false
 log4j.appender.Console.Target=System.err
 log4j.appender.Console.layout=org.apache.log4j.TTCCLayout
 log4j.appender.Console.layout.ThreadPrinting=true

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties
----------------------------------------------------------------------
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 96302a2..c8190ec 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
@@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console
 #
 
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
-log4j.appender.Console.ImmediateFlush=false
 log4j.appender.Console.Target=System.err
 log4j.appender.Console.layout=org.apache.log4j.xml.XMLLayout
 log4j.appender.Console.layout.LocationInfo=true

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.properties
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..4d3ec0d
--- /dev/null
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.properties
@@ -0,0 +1,17 @@
+###############################################################################
+#
+# Log4J 1.2 Configuration.
+#
+
+log4j.rootLogger=TRACE, File
+
+##############################################################################
+#
+# The Console log
+#
+
+log4j.appender.File=org.apache.log4j.FileAppender
+log4j.appender.File.File=target/mylog.txt
+log4j.appender.File.layout=org.apache.log4j.SimpleLayout
+
+log4j.logger.com.example.foo = DEBUG