Repository: logging-log4j2
Updated Branches:
  refs/heads/master a2af6ed49 -> 906abebb3


[LOG4J2-1523] Log4j 1 appenders. Classic RollingFileAppender.

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

Branch: refs/heads/master
Commit: 906abebb3814cc82b02d12daa7836656a9d6c71e
Parents: a2af6ed
Author: Gary Gregory <ggreg...@apache.org>
Authored: Wed Sep 21 20:38:29 2016 -0700
Committer: Gary Gregory <ggreg...@apache.org>
Committed: Wed Sep 21 20:38:29 2016 -0700

----------------------------------------------------------------------
 .../log4j/config/Log4j1ConfigurationParser.java | 531 ++++++++++---------
 .../config/Log4j1ConfigurationFactoryTest.java  |  34 +-
 ...4j-RollingFileAppender-with-props.properties |  27 +
 .../log4j-RollingFileAppender.properties        |  22 +
 4 files changed, 360 insertions(+), 254 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/906abebb/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 adc512c..0d5be53 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
@@ -42,281 +42,306 @@ import org.apache.logging.log4j.status.StatusLogger;
  */
 public class Log4j1ConfigurationParser {
 
-    private final Properties properties = new Properties();
-    private final ConfigurationBuilder<BuiltConfiguration> builder = 
ConfigurationBuilderFactory.newConfigurationBuilder();
+       private final Properties properties = new Properties();
+       private final ConfigurationBuilder<BuiltConfiguration> builder = 
ConfigurationBuilderFactory
+                       .newConfigurationBuilder();
 
-    /**
-     * Parse a Log4j 1.2 properties configuration file into a 
ConfigurationBuilder.
-     *
-     * @param input  InputStream to read from, will not be closed.
-     * @return  the populated ConfigurationBuilder, never {@literal null}
-     * @throws IOException  if unable to read the input
-     * @throws ConfigurationException  if the input does not contain a valid 
configuration
-     */
-    public ConfigurationBuilder<BuiltConfiguration> 
buildConfigurationBuilder(final InputStream input) throws IOException {
-        properties.load(input);
-        final String rootCategoryValue = getLog4jValue("rootCategory");
-        final String rootLoggerValue = getLog4jValue("rootLogger");
-        if (rootCategoryValue == null && rootLoggerValue == null) {
-            // This is not a Log4j 1 properties configuration file.
-            throw new ConfigurationException("Input does not contain a valid 
Log4j 1.x properties configuration");
-        }
-        builder.setConfigurationName("Log4j1");
-        // DEBUG
-        final String debugValue = getLog4jValue("debug");
-        if (Boolean.valueOf(debugValue)) {
-            builder.setStatusLevel(Level.DEBUG);
-        }
-        // Root
-        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(sortedAppenderNames);
-        for (final Map.Entry<String, String> entry : 
classNameToProperty.entrySet()) {
-            final String appenderName = entry.getKey();
-            final String appenderClass = entry.getValue();
-            buildAppender(appenderName, appenderClass);
-        }
-        // Loggers
-        buildLoggers("log4j.category.");
-        buildLoggers("log4j.logger.");
-        return builder;
-    }
+       /**
+        * Parse a Log4j 1.2 properties configuration file into a
+        * ConfigurationBuilder.
+        *
+        * @param input
+        *            InputStream to read from, will not be closed.
+        * @return the populated ConfigurationBuilder, never {@literal null}
+        * @throws IOException
+        *             if unable to read the input
+        * @throws ConfigurationException
+        *             if the input does not contain a valid configuration
+        */
+       public ConfigurationBuilder<BuiltConfiguration> 
buildConfigurationBuilder(final InputStream input)
+                       throws IOException {
+               properties.load(input);
+               final String rootCategoryValue = getLog4jValue("rootCategory");
+               final String rootLoggerValue = getLog4jValue("rootLogger");
+               if (rootCategoryValue == null && rootLoggerValue == null) {
+                       // This is not a Log4j 1 properties configuration file.
+                       throw new ConfigurationException("Input does not 
contain a valid Log4j 1.x properties configuration");
+               }
+               builder.setConfigurationName("Log4j1");
+               // DEBUG
+               final String debugValue = getLog4jValue("debug");
+               if (Boolean.valueOf(debugValue)) {
+                       builder.setStatusLevel(Level.DEBUG);
+               }
+               // Root
+               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(sortedAppenderNames);
+               for (final Map.Entry<String, String> entry : 
classNameToProperty.entrySet()) {
+                       final String appenderName = entry.getKey();
+                       final String appenderClass = entry.getValue();
+                       buildAppender(appenderName, appenderClass);
+               }
+               // Loggers
+               buildLoggers("log4j.category.");
+               buildLoggers("log4j.logger.");
+               return builder;
+       }
 
-    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);
-        for (final Map.Entry<Object, Object> entry : properties.entrySet()) {
-            final Object keyObj = entry.getKey();
-            if (keyObj != null) {
-                final String key = keyObj.toString();
-                if (key.startsWith(prefix)) {
-                    if (key.indexOf('.', preLength) < 0) {
-                        final String name = key.substring(preLength);
-                        if (Arrays.binarySearch(sortedAppenderNames, name) >= 
0) {
-                            final Object value = entry.getValue();
-                            if (value != null) {
-                                map.put(name, value.toString());
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return map;
-    }
+       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);
+               for (final Map.Entry<Object, Object> entry : 
properties.entrySet()) {
+                       final Object keyObj = entry.getKey();
+                       if (keyObj != null) {
+                               final String key = keyObj.toString();
+                               if (key.startsWith(prefix)) {
+                                       if (key.indexOf('.', preLength) < 0) {
+                                               final String name = 
key.substring(preLength);
+                                               if 
(Arrays.binarySearch(sortedAppenderNames, name) >= 0) {
+                                                       final Object value = 
entry.getValue();
+                                                       if (value != null) {
+                                                               map.put(name, 
value.toString());
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+               return map;
+       }
 
-    private void buildAppender(final String appenderName, final String 
appenderClass) {
-        switch (appenderClass) {
-        case "org.apache.log4j.ConsoleAppender":
-            buildConsoleAppender(appenderName);
-            break;
-        case "org.apache.log4j.FileAppender":
-            buildFileAppender(appenderName);
-            break;
-        case "org.apache.log4j.varia.NullAppender":
-            buildNullAppender(appenderName);
-            break;
-        default:
-            reportWarning("Unknown appender class: " + appenderClass + "; 
ignoring appender: " + appenderName);
-        }
-    }
+       private void buildAppender(final String appenderName, final String 
appenderClass) {
+               switch (appenderClass) {
+               case "org.apache.log4j.ConsoleAppender":
+                       buildConsoleAppender(appenderName);
+                       break;
+               case "org.apache.log4j.FileAppender":
+                       buildFileAppender(appenderName);
+                       break;
+               case "org.apache.log4j.RollingFileAppender":
+                       buildRollingFileAppender(appenderName);
+                       break;
+               case "org.apache.log4j.varia.NullAppender":
+                       buildNullAppender(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);
-            }
-        }
-        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);
-    }
+               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);
+                       }
+               }
+               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 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 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(final String componentName, final 
ComponentBuilder componentBuilder,
-                                final String sourceAttributeName, final String 
targetAttributeName) {
-        final String attributeValue = getLog4jAppenderValue(componentName, 
sourceAttributeName);
-        if (attributeValue != null) {
-            componentBuilder.addAttribute(targetAttributeName, attributeValue);
-        }
-    }
+       private void buildRollingFileAppender(final String appenderName) {
+               final AppenderComponentBuilder appenderBuilder = 
builder.newAppender(appenderName, "RollingFile");
+               buildMandatoryAttribute(appenderName, appenderBuilder, "File", 
"fileName");
+               final String fileName = getLog4jAppenderValue(appenderName, 
"File");
+               appenderBuilder.addAttribute("filePattern", fileName + ".%i");
+               final String maxFileSizeString = 
getLog4jAppenderValue(appenderName, "MaxFileSize", "10485760");
+               final String maxBackupIndexString = 
getLog4jAppenderValue(appenderName, "MaxBackupIndex", "1");
+               final ComponentBuilder<?> triggeringPolicy = 
builder.newComponent("Policies").addComponent(
+                               
builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", 
maxFileSizeString));
+               appenderBuilder.addComponent(triggeringPolicy);
+               appenderBuilder.addComponent(
+                               
builder.newComponent("DefaultRolloverStrategy").addAttribute("max", 
maxBackupIndexString));
+               builder.add(appenderBuilder);
+       }
+
+       private void buildAttribute(final String componentName, final 
ComponentBuilder componentBuilder,
+                       final String sourceAttributeName, final String 
targetAttributeName) {
+               final String attributeValue = 
getLog4jAppenderValue(componentName, sourceAttributeName);
+               if (attributeValue != null) {
+                       componentBuilder.addAttribute(targetAttributeName, 
attributeValue);
+               }
+       }
 
-    private void buildAttributeWithDefault(final String componentName, final 
ComponentBuilder componentBuilder,
-                                           final String sourceAttributeName, 
final String targetAttributeName, final String defaultValue) {
-        final String attributeValue = getLog4jAppenderValue(componentName, 
sourceAttributeName, defaultValue);
-        componentBuilder.addAttribute(targetAttributeName, attributeValue);
-    }
+       private void buildAttributeWithDefault(final String componentName, 
final ComponentBuilder componentBuilder,
+                       final String sourceAttributeName, final String 
targetAttributeName, final String defaultValue) {
+               final String attributeValue = 
getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
+               componentBuilder.addAttribute(targetAttributeName, 
attributeValue);
+       }
 
-    private void buildMandatoryAttribute(final String componentName, final 
ComponentBuilder componentBuilder,
-                                         final String sourceAttributeName, 
final String targetAttributeName) {
-        final String attributeValue = getLog4jAppenderValue(componentName, 
sourceAttributeName);
-        if (attributeValue != null) {
-            componentBuilder.addAttribute(targetAttributeName, attributeValue);
-        } else {
-            reportWarning("Missing " + sourceAttributeName + " for " + 
componentName);
-        }
-    }
+       private void buildMandatoryAttribute(final String componentName, final 
ComponentBuilder componentBuilder,
+                       final String sourceAttributeName, final String 
targetAttributeName) {
+               final String attributeValue = 
getLog4jAppenderValue(componentName, sourceAttributeName);
+               if (attributeValue != null) {
+                       componentBuilder.addAttribute(targetAttributeName, 
attributeValue);
+               } else {
+                       reportWarning("Missing " + sourceAttributeName + " for 
" + componentName);
+               }
+       }
 
-    private void buildNullAppender(String appenderName) {
-        final AppenderComponentBuilder appenderBuilder = 
builder.newAppender(appenderName, "Null");
-        builder.add(appenderBuilder);
+       private void buildNullAppender(String appenderName) {
+               final AppenderComponentBuilder appenderBuilder = 
builder.newAppender(appenderName, "Null");
+               builder.add(appenderBuilder);
        }
 
-    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(name, 
"layout.ConversionPattern", null)
+       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(name, "layout.ConversionPattern", null)
 
-                    // Log4j 2's %x (NDC) is not compatible with Log4j 1's %x
-                    //   Log4j 1: "foo bar baz"
-                    //   Log4j 2: "[foo, bar, baz]"
-                    // Use %ndc to get the Log4j 1 format
-                    .replace("%x", "%ndc")
+                                               // Log4j 2's %x (NDC) is not 
compatible with Log4j 1's
+                                               // %x
+                                               // Log4j 1: "foo bar baz"
+                                               // Log4j 2: "[foo, bar, baz]"
+                                               // Use %ndc to get the Log4j 1 
format
+                                               .replace("%x", "%ndc")
 
-                    // Log4j 2's %X (MDC) is not compatible with Log4j 1's %X
-                    //   Log4j 1: "{{foo,bar}{hoo,boo}}"
-                    //   Log4j 2: "{foo=bar,hoo=boo}"
-                    // Use %properties to get the Log4j 1 format
-                    .replace("%X", "%properties");
+                                               // Log4j 2's %X (MDC) is not 
compatible with Log4j 1's
+                                               // %X
+                                               // Log4j 1: 
"{{foo,bar}{hoo,boo}}"
+                                               // Log4j 2: "{foo=bar,hoo=boo}"
+                                               // Use %properties to get the 
Log4j 1 format
+                                               .replace("%X", "%properties");
 
-                appenderBuilder.add(newPatternLayout(pattern));
-                break;
-            }
-            case "org.apache.log4j.SimpleLayout": {
-                appenderBuilder.add(newPatternLayout("%level - %m%n"));
-                break;
-            }
-            case "org.apache.log4j.TTCCLayout": {
-                String pattern = "%r ";
-                if (Boolean.parseBoolean(getLog4jAppenderValue(name, 
"layout.ThreadPrinting", "true"))) {
-                    pattern += "[%t] ";
-                }
-                pattern += "%p ";
-                if (Boolean.parseBoolean(getLog4jAppenderValue(name, 
"layout.CategoryPrefixing", "true"))) {
-                    pattern += "%c ";
-                }
-                if (Boolean.parseBoolean(getLog4jAppenderValue(name, 
"layout.ContextPrinting", "true"))) {
-                    pattern += "%notEmpty{%ndc }";
-                }
-                pattern += "- %m%n";
-                appenderBuilder.add(newPatternLayout(pattern));
-                break;
-            }
-            case "org.apache.log4j.HTMLLayout": {
-                final LayoutComponentBuilder htmlLayout = 
builder.newLayout("HtmlLayout");
-                htmlLayout.addAttribute("title",
-                        getLog4jAppenderValue(name, "layout.Title", "Log4J Log 
Messages"));
-                htmlLayout.addAttribute("locationInfo",
-                        Boolean.parseBoolean(getLog4jAppenderValue(name, 
"layout.LocationInfo", "false")));
-                appenderBuilder.add(htmlLayout);
-                break;
-            }
-            case "org.apache.log4j.xml.XMLLayout": {
-                final LayoutComponentBuilder xmlLayout = 
builder.newLayout("Log4j1XmlLayout");
-                xmlLayout.addAttribute("locationInfo",
-                        Boolean.parseBoolean(getLog4jAppenderValue(name, 
"layout.LocationInfo", "false")));
-                xmlLayout.addAttribute("properties",
-                        Boolean.parseBoolean(getLog4jAppenderValue(name, 
"layout.Properties", "false")));
-                appenderBuilder.add(xmlLayout);
-                break;
-            }
-            default:
-                reportWarning("Unknown layout class: " + layoutClass);
-            }
-        }
-    }
+                               appenderBuilder.add(newPatternLayout(pattern));
+                               break;
+                       }
+                       case "org.apache.log4j.SimpleLayout": {
+                               appenderBuilder.add(newPatternLayout("%level - 
%m%n"));
+                               break;
+                       }
+                       case "org.apache.log4j.TTCCLayout": {
+                               String pattern = "%r ";
+                               if 
(Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", 
"true"))) {
+                                       pattern += "[%t] ";
+                               }
+                               pattern += "%p ";
+                               if 
(Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.CategoryPrefixing", 
"true"))) {
+                                       pattern += "%c ";
+                               }
+                               if 
(Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ContextPrinting", 
"true"))) {
+                                       pattern += "%notEmpty{%ndc }";
+                               }
+                               pattern += "- %m%n";
+                               appenderBuilder.add(newPatternLayout(pattern));
+                               break;
+                       }
+                       case "org.apache.log4j.HTMLLayout": {
+                               final LayoutComponentBuilder htmlLayout = 
builder.newLayout("HtmlLayout");
+                               htmlLayout.addAttribute("title", 
getLog4jAppenderValue(name, "layout.Title", "Log4J Log Messages"));
+                               htmlLayout.addAttribute("locationInfo",
+                                               
Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", 
"false")));
+                               appenderBuilder.add(htmlLayout);
+                               break;
+                       }
+                       case "org.apache.log4j.xml.XMLLayout": {
+                               final LayoutComponentBuilder xmlLayout = 
builder.newLayout("Log4j1XmlLayout");
+                               xmlLayout.addAttribute("locationInfo",
+                                               
Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", 
"false")));
+                               xmlLayout.addAttribute("properties",
+                                               
Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.Properties", 
"false")));
+                               appenderBuilder.add(xmlLayout);
+                               break;
+                       }
+                       default:
+                               reportWarning("Unknown layout class: " + 
layoutClass);
+                       }
+               }
+       }
 
-    private LayoutComponentBuilder newPatternLayout(final String pattern) {
-        final LayoutComponentBuilder layoutBuilder = 
builder.newLayout("PatternLayout");
-        if (pattern != null) {
-            layoutBuilder.addAttribute("pattern", pattern);
-        }
-        return layoutBuilder;
-    }
+       private LayoutComponentBuilder newPatternLayout(final String pattern) {
+               final LayoutComponentBuilder layoutBuilder = 
builder.newLayout("PatternLayout");
+               if (pattern != null) {
+                       layoutBuilder.addAttribute("pattern", pattern);
+               }
+               return layoutBuilder;
+       }
 
-    private String[] buildRootLogger(final String rootLoggerValue) {
-        if (rootLoggerValue == null) {
-            return new String[0];
-        }
-        final String[] rootLoggerParts = rootLoggerValue.split("\\s*,\\s*");
-        final Level rootLoggerLevel = rootLoggerParts.length > 0 ? 
Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
-        final String[] sortedAppenderNames = 
Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
-        Arrays.sort(sortedAppenderNames);
-        final RootLoggerComponentBuilder loggerBuilder = 
builder.newRootLogger(rootLoggerLevel);
-        for (final String appender : sortedAppenderNames) {
-            loggerBuilder.add(builder.newAppenderRef(appender));
-        }
-        builder.add(loggerBuilder);
-        return sortedAppenderNames;
-    }
+       private String[] buildRootLogger(final String rootLoggerValue) {
+               if (rootLoggerValue == null) {
+                       return new String[0];
+               }
+               final String[] rootLoggerParts = 
rootLoggerValue.split("\\s*,\\s*");
+               final Level rootLoggerLevel = rootLoggerParts.length > 0 ? 
Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
+               final String[] sortedAppenderNames = 
Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
+               Arrays.sort(sortedAppenderNames);
+               final RootLoggerComponentBuilder loggerBuilder = 
builder.newRootLogger(rootLoggerLevel);
+               for (final String appender : sortedAppenderNames) {
+                       loggerBuilder.add(builder.newAppenderRef(appender));
+               }
+               builder.add(loggerBuilder);
+               return sortedAppenderNames;
+       }
 
-    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();
-            if (keyObj != null) {
-                final String key = keyObj.toString();
-                if (key.startsWith(prefix)) {
-                    final String name = key.substring(preLength);
-                    final Object value = entry.getValue();
-                    if (value != null) {
-                        builder.add(builder.newLogger(name, 
Level.valueOf(value.toString())));
-                    }
-                }
-            }
-        }
+       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();
+                       if (keyObj != null) {
+                               final String key = keyObj.toString();
+                               if (key.startsWith(prefix)) {
+                                       final String name = 
key.substring(preLength);
+                                       final Object value = entry.getValue();
+                                       if (value != null) {
+                                               
builder.add(builder.newLogger(name, Level.valueOf(value.toString())));
+                                       }
+                               }
+                       }
+               }
 
-    }
+       }
 
-    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) {
+               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);
-    }
+       private String getLog4jAppenderValue(final String appenderName, final 
String attributeName,
+                       final String defaultValue) {
+               return properties.getProperty("log4j.appender." + appenderName 
+ "." + attributeName, defaultValue);
+       }
 
-    private String getLog4jValue(final String key) {
-        return properties.getProperty("log4j." + key);
-    }
+       private String getLog4jValue(final String key) {
+               return properties.getProperty("log4j." + key);
+       }
 
-    private void reportWarning(final String msg) {
-        StatusLogger.getLogger().warn("Log4j 1 configuration parser: " + msg);
-    }
+       private void reportWarning(final String msg) {
+               StatusLogger.getLogger().warn("Log4j 1 configuration parser: " 
+ msg);
+       }
 
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/906abebb/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 842bf6b..81be695 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
@@ -32,6 +32,12 @@ 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.RollingFileAppender;
+import 
org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy;
+import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy;
+import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy;
+import 
org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy;
+import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.layout.HtmlLayout;
@@ -121,7 +127,6 @@ public class Log4j1ConfigurationFactoryTest {
 
        @Test
        public void testNullAppender() throws Exception {
-               StatusLogger.getLogger().setLevel(Level.TRACE);
                final Configuration configuration = 
configure("config-1.2/log4j-NullAppender.properties");
                final Appender appender = 
configuration.getAppender("NullAppender");
                assertNotNull(appender);
@@ -129,4 +134,31 @@ public class Log4j1ConfigurationFactoryTest {
                assertTrue(appender.getClass().getName(), appender instanceof 
NullAppender);
        }
 
+       @Test
+       public void testRollingFileAppender() throws Exception {
+               StatusLogger.getLogger().setLevel(Level.TRACE);
+               final Configuration configuration = 
configure("config-1.2/log4j-RollingFileAppender.properties");
+               final Appender appender = configuration.getAppender("RFA");
+               assertNotNull(appender);
+               assertEquals("RFA", appender.getName());
+               assertTrue(appender.getClass().getName(), appender instanceof 
RollingFileAppender);
+               final RollingFileAppender rfa = (RollingFileAppender) appender;
+               assertEquals("./hadoop.log", rfa.getFileName());
+               assertEquals("./hadoop.log.%i", 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 
SizeBasedTriggeringPolicy);
+               final SizeBasedTriggeringPolicy sbtp = 
(SizeBasedTriggeringPolicy) tp;
+               assertEquals(256 * 1024 * 1024, sbtp.getMaxFileSize());
+               final RolloverStrategy rolloverStrategy = 
rfa.getManager().getRolloverStrategy();
+               assertTrue(rolloverStrategy.getClass().getName(), 
rolloverStrategy instanceof DefaultRolloverStrategy);
+               final DefaultRolloverStrategy drs = (DefaultRolloverStrategy) 
rolloverStrategy;
+               assertEquals(20, drs.getMaxIndex());
+       }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/906abebb/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender-with-props.properties
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..26fd391
--- /dev/null
+++ 
b/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender-with-props.properties
@@ -0,0 +1,27 @@
+###############################################################################
+#
+# Log4J 1.2 Configuration.
+#
+
+hadoop.log.dir=.
+hadoop.log.file=hadoop.log
+
+log4j.rootLogger=TRACE, RFA
+
+#
+# Rolling File Appender - cap space usage at 5gb.
+#
+hadoop.log.maxfilesize=256MB
+hadoop.log.maxbackupindex=20
+log4j.appender.RFA=org.apache.log4j.RollingFileAppender
+log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file}
+
+log4j.appender.RFA.MaxFileSize=${hadoop.log.maxfilesize}
+log4j.appender.RFA.MaxBackupIndex=${hadoop.log.maxbackupindex}
+
+log4j.appender.RFA.layout=org.apache.log4j.PatternLayout
+
+# Pattern format: Date LogLevel LoggerName LogMessage
+log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
+# Debugging Pattern format
+#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} 
(%F:%M(%L)) - %m%n

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/906abebb/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender.properties
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..d18c39a
--- /dev/null
+++ 
b/log4j-1.2-api/src/test/resources/config-1.2/log4j-RollingFileAppender.properties
@@ -0,0 +1,22 @@
+###############################################################################
+#
+# Log4J 1.2 Configuration.
+#
+
+log4j.rootLogger=TRACE, RFA
+
+#
+# Rolling File Appender - cap space usage at 5gb.
+#
+log4j.appender.RFA=org.apache.log4j.RollingFileAppender
+log4j.appender.RFA.File=./hadoop.log
+
+log4j.appender.RFA.MaxFileSize=256MB
+log4j.appender.RFA.MaxBackupIndex=20
+
+log4j.appender.RFA.layout=org.apache.log4j.PatternLayout
+
+# Pattern format: Date LogLevel LoggerName LogMessage
+log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
+# Debugging Pattern format
+#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} 
(%F:%M(%L)) - %m%n

Reply via email to