You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2022/01/16 16:15:39 UTC

[logging-log4j2] branch release-2.x updated: Refactor duplication.

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

ggregory pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new 8493b93  Refactor duplication.
8493b93 is described below

commit 8493b93979f20f36e93cf72bba52547acfa541aa
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Jan 16 11:15:35 2022 -0500

    Refactor duplication.
---
 .../org/apache/log4j/builders/AbstractBuilder.java | 18 +++++++++++++++-
 .../builders/appender/AsyncAppenderBuilder.java    | 14 ++++++------
 .../builders/appender/ConsoleAppenderBuilder.java  | 10 ++++-----
 .../appender/DailyRollingFileAppenderBuilder.java  | 16 ++++++--------
 .../builders/appender/FileAppenderBuilder.java     | 16 ++++++--------
 .../builders/appender/RewriteAppenderBuilder.java  |  8 +++----
 .../appender/RollingFileAppenderBuilder.java       | 25 ++++++++++------------
 .../builders/appender/SyslogAppenderBuilder.java   | 14 ++++++------
 .../builders/filter/LevelMatchFilterBuilder.java   |  8 +++----
 .../builders/filter/LevelRangeFilterBuilder.java   | 10 ++++-----
 .../builders/filter/StringMatchFilterBuilder.java  |  8 +++----
 .../log4j/builders/layout/TTCCLayoutBuilder.java   | 14 ++++++------
 .../org/apache/log4j/helpers/OptionConverter.java  |  4 +++-
 .../org/apache/log4j/xml/XmlConfiguration.java     |  6 +++---
 .../test/resources/log4j1-rolling-properties.xml   |  2 +-
 15 files changed, 84 insertions(+), 89 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 e144128..72fb985 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
@@ -16,6 +16,9 @@
  */
 package org.apache.log4j.builders;
 
+import static org.apache.log4j.xml.XmlConfiguration.NAME_ATTR;
+import static org.apache.log4j.xml.XmlConfiguration.VALUE_ATTR;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -32,6 +35,7 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.filter.CompositeFilter;
 import org.apache.logging.log4j.core.filter.ThresholdFilter;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.w3c.dom.Element;
 
 /**
  * Base class for Log4j 1 component builders.
@@ -74,10 +78,18 @@ public abstract class AbstractBuilder {
         String fullKey = prefix + key;
         String value = properties.getProperty(fullKey);
         value = value != null ? value : properties.getProperty(toLowerCase(fullKey), defaultValue);
-        value = value == null ? defaultValue : OptionConverter.substVars(value, properties);
+        value = value == null ? defaultValue : substVars(value);
         return value == null ? defaultValue : value;
     }
 
+    protected String getNameAttribute(Element element) {
+        return element.getAttribute(NAME_ATTR);
+    }
+
+    protected String getValueAttribute(Element element) {
+        return element.getAttribute(VALUE_ATTR);
+    }
+
     public boolean getBooleanProperty(String key) {
         return Boolean.parseBoolean(getProperty(key, Boolean.FALSE.toString()));
     }
@@ -131,6 +143,10 @@ public abstract class AbstractBuilder {
         return null;
     }
 
+    protected String substVars(String value) {
+        return OptionConverter.substVars(value, properties);
+    }
+
     String toLowerCase(final String value) {
         return value == null ? null : value.toLowerCase(Locale.ROOT);
     }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java
index 3236557..15162db 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java
@@ -19,9 +19,7 @@ package org.apache.log4j.builders.appender;
 import static org.apache.log4j.builders.BuilderManager.CATEGORY;
 import static org.apache.log4j.config.Log4j1Configuration.APPENDER_REF_TAG;
 import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
-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;
 
 import java.util.ArrayList;
@@ -65,7 +63,7 @@ public class AsyncAppenderBuilder extends AbstractBuilder implements AppenderBui
 
     @Override
     public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
-        String name = appenderElement.getAttribute(NAME_ATTR);
+        String name = getNameAttribute(appenderElement);
         AtomicReference<List<String>> appenderRefs = new AtomicReference<>(new ArrayList<>());
         AtomicBoolean blocking = new AtomicBoolean();
         AtomicBoolean includeLocation = new AtomicBoolean();
@@ -80,9 +78,9 @@ public class AsyncAppenderBuilder extends AbstractBuilder implements AppenderBui
                     }
                     break;
                 case PARAM_TAG: {
-                    switch (currentElement.getAttribute(NAME_ATTR)) {
+                    switch (getNameAttribute(currentElement)) {
                         case BUFFER_SIZE_PARAM: {
-                            String value = currentElement.getAttribute(VALUE_ATTR);
+                            String value = getValueAttribute(currentElement);
                             if (value == null) {
                                 LOGGER.warn("No value supplied for BufferSize parameter. Defaulting to 1024.");
                             } else {
@@ -91,7 +89,7 @@ public class AsyncAppenderBuilder extends AbstractBuilder implements AppenderBui
                             break;
                         }
                         case BLOCKING_PARAM: {
-                            String value = currentElement.getAttribute(VALUE_ATTR);
+                            String value = getValueAttribute(currentElement);
                             if (value == null) {
                                 LOGGER.warn("No value supplied for Blocking parameter. Defaulting to false.");
                             } else {
@@ -100,7 +98,7 @@ public class AsyncAppenderBuilder extends AbstractBuilder implements AppenderBui
                             break;
                         }
                         case INCLUDE_LOCATION_PARAM: {
-                            String value = currentElement.getAttribute(VALUE_ATTR);
+                            String value = getValueAttribute(currentElement);
                             if (value == null) {
                                 LOGGER.warn("No value supplied for IncludeLocation parameter. Defaulting to false.");
                             } else {
@@ -109,7 +107,7 @@ public class AsyncAppenderBuilder extends AbstractBuilder implements AppenderBui
                             break;
                         }
                         case THRESHOLD_PARAM: {
-                            String value = currentElement.getAttribute(VALUE_ATTR);
+                            String value = getValueAttribute(currentElement);
                             if (value == null) {
                                 LOGGER.warn("No value supplied for Threshold parameter, ignoring.");
                             } else {
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 108d177..9fbd526 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
@@ -20,9 +20,7 @@ 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;
 
 import java.util.ArrayList;
@@ -66,7 +64,7 @@ public class ConsoleAppenderBuilder extends AbstractBuilder implements AppenderB
 
     @Override
     public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
-        String name = appenderElement.getAttribute(NAME_ATTR);
+        String name = getNameAttribute(appenderElement);
         AtomicReference<String> target = new AtomicReference<>(SYSTEM_OUT);
         AtomicReference<Layout> layout = new AtomicReference<>();
         AtomicReference<List<Filter>> filters = new AtomicReference<>(new ArrayList<>());
@@ -80,9 +78,9 @@ public class ConsoleAppenderBuilder extends AbstractBuilder implements AppenderB
                     filters.get().add(config.parseFilters(currentElement));
                     break;
                 case PARAM_TAG: {
-                    switch (currentElement.getAttribute(NAME_ATTR)) {
+                    switch (getNameAttribute(currentElement)) {
                         case TARGET: {
-                            String value = currentElement.getAttribute(VALUE_ATTR);
+                            String value = getValueAttribute(currentElement);
                             if (value == null) {
                                 LOGGER.warn("No value supplied for target parameter. Defaulting to System.out.");
                             } else {
@@ -101,7 +99,7 @@ public class ConsoleAppenderBuilder extends AbstractBuilder implements AppenderB
                             break;
                         }
                         case THRESHOLD_PARAM: {
-                            String value = currentElement.getAttribute(VALUE_ATTR);
+                            String value = getValueAttribute(currentElement);
                             if (value == null) {
                                 LOGGER.warn("No value supplied for Threshold parameter, ignoring.");
                             } else {
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 701bc74..9bca33a 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
@@ -20,9 +20,7 @@ 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;
 
 import java.util.Properties;
@@ -69,7 +67,7 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
 
     @Override
     public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
-        String name = appenderElement.getAttribute(NAME_ATTR);
+        String name = getNameAttribute(appenderElement);
         AtomicReference<Layout> layout = new AtomicReference<>();
         AtomicReference<Filter> filter = new AtomicReference<>();
         AtomicReference<String> fileName = new AtomicReference<>();
@@ -87,12 +85,12 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
                     filter.set(config.parseFilters(currentElement));
                     break;
                 case PARAM_TAG: {
-                    switch (currentElement.getAttribute(NAME_ATTR)) {
+                    switch (getNameAttribute(currentElement)) {
                         case FILE_PARAM:
-                            fileName.set(currentElement.getAttribute(VALUE_ATTR));
+                            fileName.set(getValueAttribute(currentElement));
                             break;
                         case APPEND_PARAM: {
-                            String bool = currentElement.getAttribute(VALUE_ATTR);
+                            String bool = getValueAttribute(currentElement);
                             if (bool != null) {
                                 append.set(Boolean.parseBoolean(bool));
                             } else {
@@ -101,7 +99,7 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
                             break;
                         }
                         case BUFFERED_IO_PARAM: {
-                            String bool = currentElement.getAttribute(VALUE_ATTR);
+                            String bool = getValueAttribute(currentElement);
                             if (bool != null) {
                                 bufferedIo.set(Boolean.parseBoolean(bool));
                             } else {
@@ -110,7 +108,7 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
                             break;
                         }
                         case BUFFER_SIZE_PARAM: {
-                            String size = currentElement.getAttribute(VALUE_ATTR);
+                            String size = getValueAttribute(currentElement);
                             if (size != null) {
                                 bufferSize.set(Integer.parseInt(size));
                             } else {
@@ -119,7 +117,7 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
                             break;
                         }
                         case THRESHOLD_PARAM: {
-                            String value = currentElement.getAttribute(VALUE_ATTR);
+                            String value = getValueAttribute(currentElement);
                             if (value == null) {
                                 LOGGER.warn("No value supplied for Threshold parameter, ignoring.");
                             } else {
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 3390762..f110daa 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
@@ -20,9 +20,7 @@ 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;
 
 import java.util.Properties;
@@ -63,7 +61,7 @@ public class FileAppenderBuilder extends AbstractBuilder implements AppenderBuil
 
     @Override
     public Appender parseAppender(Element appenderElement, XmlConfiguration config) {
-        String name = appenderElement.getAttribute(NAME_ATTR);
+        String name = getNameAttribute(appenderElement);
         AtomicReference<Layout> layout = new AtomicReference<>();
         AtomicReference<Filter> filter = new AtomicReference<>();
         AtomicReference<String> fileName = new AtomicReference<>();
@@ -81,12 +79,12 @@ public class FileAppenderBuilder extends AbstractBuilder implements AppenderBuil
                     filter.set(config.parseFilters(currentElement));
                     break;
                 case PARAM_TAG: {
-                    switch (currentElement.getAttribute(NAME_ATTR)) {
+                    switch (getNameAttribute(currentElement)) {
                         case FILE_PARAM:
-                            fileName.set(currentElement.getAttribute(VALUE_ATTR));
+                            fileName.set(getValueAttribute(currentElement));
                             break;
                         case APPEND_PARAM: {
-                            String bool = currentElement.getAttribute(VALUE_ATTR);
+                            String bool = getValueAttribute(currentElement);
                             if (bool != null) {
                                 append.set(Boolean.parseBoolean(bool));
                             } else {
@@ -95,7 +93,7 @@ public class FileAppenderBuilder extends AbstractBuilder implements AppenderBuil
                             break;
                         }
                         case BUFFERED_IO_PARAM: {
-                            String bool = currentElement.getAttribute(VALUE_ATTR);
+                            String bool = getValueAttribute(currentElement);
                             if (bool != null) {
                                 bufferedIo.set(Boolean.parseBoolean(bool));
                             } else {
@@ -104,7 +102,7 @@ public class FileAppenderBuilder extends AbstractBuilder implements AppenderBuil
                             break;
                         }
                         case BUFFER_SIZE_PARAM: {
-                            String size = currentElement.getAttribute(VALUE_ATTR);
+                            String size = getValueAttribute(currentElement);
                             if (size != null) {
                                 bufferSize.set(Integer.parseInt(size));
                             } else {
@@ -113,7 +111,7 @@ public class FileAppenderBuilder extends AbstractBuilder implements AppenderBuil
                             break;
                         }
                         case THRESHOLD_PARAM: {
-                            String value = currentElement.getAttribute(VALUE_ATTR);
+                            String value = getValueAttribute(currentElement);
                             if (value == null) {
                                 LOGGER.warn("No value supplied for Threshold parameter, ignoring.");
                             } else {
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java
index 6e25557..ce54a8f 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java
@@ -20,9 +20,7 @@ import static org.apache.log4j.builders.BuilderManager.CATEGORY;
 import static org.apache.log4j.config.Log4j1Configuration.APPENDER_REF_TAG;
 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.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;
 
 import java.util.ArrayList;
@@ -68,7 +66,7 @@ public class RewriteAppenderBuilder extends AbstractBuilder implements AppenderB
 
     @Override
     public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
-        String name = appenderElement.getAttribute(NAME_ATTR);
+        String name = getNameAttribute(appenderElement);
         AtomicReference<List<String>> appenderRefs = new AtomicReference<>(new ArrayList<>());
         AtomicReference<RewritePolicy> rewritePolicyHolder = new AtomicReference<>();
         AtomicReference<String> level = new AtomicReference<>();
@@ -93,8 +91,8 @@ public class RewriteAppenderBuilder extends AbstractBuilder implements AppenderB
                     break;
                 }
                 case PARAM_TAG: {
-                    if (currentElement.getAttribute(NAME_ATTR).equalsIgnoreCase(THRESHOLD_PARAM)) {
-                        String value = currentElement.getAttribute(VALUE_ATTR);
+                    if (getNameAttribute(currentElement).equalsIgnoreCase(THRESHOLD_PARAM)) {
+                        String value = getValueAttribute(currentElement);
                         if (value == null) {
                             LOGGER.warn("No value supplied for Threshold parameter, ignoring.");
                         } else {
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 37ce8a6..a2e0b2b 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
@@ -20,9 +20,7 @@ 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;
 
 import java.util.Properties;
@@ -64,13 +62,13 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
     public RollingFileAppenderBuilder() {
     }
 
-    public RollingFileAppenderBuilder(String prefix, Properties props) {
-        super(prefix, props);
+    public RollingFileAppenderBuilder(String prefix, Properties properties) {
+        super(prefix, properties);
     }
 
     @Override
     public Appender parseAppender(Element appenderElement, XmlConfiguration config) {
-        String name = appenderElement.getAttribute(NAME_ATTR);
+        String name = getNameAttribute(appenderElement);
         AtomicReference<Layout> layout = new AtomicReference<>();
         AtomicReference<Filter> filter = new AtomicReference<>();
         AtomicReference<String> fileName = new AtomicReference<>();
@@ -90,12 +88,12 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
                     filter.set(config.parseFilters(currentElement));
                     break;
                 case PARAM_TAG: {
-                    switch (currentElement.getAttribute(NAME_ATTR)) {
+                    switch (getNameAttribute(currentElement)) {
                         case FILE_PARAM:
-                            fileName.set(currentElement.getAttribute(VALUE_ATTR));
+                            fileName.set(getValueAttribute(currentElement));
                             break;
                         case APPEND_PARAM: {
-                            String bool = currentElement.getAttribute(VALUE_ATTR);
+                            String bool = getValueAttribute(currentElement);
                             if (bool != null) {
                                 append.set(Boolean.parseBoolean(bool));
                             } else {
@@ -104,7 +102,7 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
                             break;
                         }
                         case BUFFERED_IO_PARAM: {
-                            String bool = currentElement.getAttribute(VALUE_ATTR);
+                            String bool = getValueAttribute(currentElement);
                             if (bool != null) {
                                 bufferedIo.set(Boolean.parseBoolean(bool));
                             } else {
@@ -113,7 +111,7 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
                             break;
                         }
                         case BUFFER_SIZE_PARAM: {
-                            String size = currentElement.getAttribute(VALUE_ATTR);
+                            String size = getValueAttribute(currentElement);
                             if (size != null) {
                                 bufferSize.set(Integer.parseInt(size));
                             } else {
@@ -122,7 +120,7 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
                             break;
                         }
                         case MAX_BACKUP_INDEX: {
-                            String size = currentElement.getAttribute(VALUE_ATTR);
+                            String size = getValueAttribute(currentElement);
                             if (size != null) {
                                 maxBackups.set(size);
                             } else {
@@ -131,7 +129,7 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
                             break;
                         }
                         case MAX_SIZE_PARAM: {
-                            String size = currentElement.getAttribute(VALUE_ATTR);
+                            String size = getValueAttribute(currentElement);
                             if (size != null) {
                                 maxSize.set(size);
                             } else {
@@ -140,7 +138,7 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
                             break;
                         }
                         case THRESHOLD_PARAM: {
-                            String value = currentElement.getAttribute(VALUE_ATTR);
+                            String value = getValueAttribute(currentElement);
                             if (value == null) {
                                 LOGGER.warn("No value supplied for Threshold parameter, ignoring.");
                             } else {
@@ -157,7 +155,6 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
                 fileName.get(), level.get(), maxSize.get(), maxBackups.get());
     }
 
-
     @Override
     public Appender parseAppender(final String name, final String appenderPrefix, final String layoutPrefix,
             final String filterPrefix, final Properties props, final PropertiesConfiguration configuration) {
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java
index f63a622..21b9f96 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java
@@ -20,9 +20,7 @@ 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;
 
 import java.io.Serializable;
@@ -74,7 +72,7 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
 
     @Override
     public Appender parseAppender(Element appenderElement, XmlConfiguration config) {
-        String name = appenderElement.getAttribute(NAME_ATTR);
+        String name = getNameAttribute(appenderElement);
         AtomicReference<Layout> layout = new AtomicReference<>();
         AtomicReference<Filter> filter = new AtomicReference<>();
         AtomicReference<String> facility = new AtomicReference<>();
@@ -90,16 +88,16 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
                     filter.set(config.parseFilters(currentElement));
                     break;
                 case PARAM_TAG: {
-                    switch (currentElement.getAttribute(NAME_ATTR)) {
+                    switch (getNameAttribute(currentElement)) {
                         case SYSLOG_HOST_PARAM: {
-                            host.set(currentElement.getAttribute(VALUE_ATTR));
+                            host.set(getValueAttribute(currentElement));
                             break;
                         }
                         case FACILITY_PARAM:
-                            facility.set(currentElement.getAttribute(VALUE_ATTR));
+                            facility.set(getValueAttribute(currentElement));
                             break;
                         case THRESHOLD_PARAM: {
-                            String value = currentElement.getAttribute(VALUE_ATTR);
+                            String value = getValueAttribute(currentElement);
                             if (value == null) {
                                 LOGGER.warn("No value supplied for Threshold parameter, ignoring.");
                             } else {
@@ -108,7 +106,7 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
                             break;
                         }
                         case PROTOCOL_PARAM:
-                            protocol.set(Protocol.valueOf(currentElement.getAttribute(VALUE_ATTR)));
+                            protocol.set(Protocol.valueOf(getValueAttribute(currentElement)));
                             break;
                     }
                     break;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelMatchFilterBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelMatchFilterBuilder.java
index 0f7fbf9..194a8a5 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelMatchFilterBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelMatchFilterBuilder.java
@@ -17,8 +17,6 @@
 package org.apache.log4j.builders.filter;
 
 import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.xml.XmlConfiguration.NAME_ATTR;
-import static org.apache.log4j.xml.XmlConfiguration.VALUE_ATTR;
 import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
 
 import java.util.Properties;
@@ -60,12 +58,12 @@ public class LevelMatchFilterBuilder extends AbstractBuilder implements FilterBu
         final AtomicBoolean acceptOnMatch = new AtomicBoolean();
         forEachElement(filterElement.getElementsByTagName("param"), currentElement -> {
             if (currentElement.getTagName().equals("param")) {
-                switch (currentElement.getAttribute(NAME_ATTR)) {
+                switch (getNameAttribute(currentElement)) {
                     case LEVEL:
-                        level.set(currentElement.getAttribute(VALUE_ATTR));
+                        level.set(getValueAttribute(currentElement));
                         break;
                     case ACCEPT_ON_MATCH:
-                        acceptOnMatch.set(Boolean.parseBoolean(currentElement.getAttribute(VALUE_ATTR)));
+                        acceptOnMatch.set(Boolean.parseBoolean(getValueAttribute(currentElement)));
                         break;
                 }
             }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelRangeFilterBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelRangeFilterBuilder.java
index d4792c3..6a5dd78 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelRangeFilterBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelRangeFilterBuilder.java
@@ -17,8 +17,6 @@
 package org.apache.log4j.builders.filter;
 
 import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.xml.XmlConfiguration.NAME_ATTR;
-import static org.apache.log4j.xml.XmlConfiguration.VALUE_ATTR;
 import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
 
 import java.util.Properties;
@@ -62,15 +60,15 @@ public class LevelRangeFilterBuilder extends AbstractBuilder implements FilterBu
         final AtomicBoolean acceptOnMatch = new AtomicBoolean();
         forEachElement(filterElement.getElementsByTagName("param"), currentElement -> {
             if (currentElement.getTagName().equals("param")) {
-                switch (currentElement.getAttribute(NAME_ATTR)) {
+                switch (getNameAttribute(currentElement)) {
                     case LEVEL_MAX:
-                        levelMax.set(currentElement.getAttribute(VALUE_ATTR));
+                        levelMax.set(getValueAttribute(currentElement));
                         break;
                     case LEVEL_MIN:
-                        levelMax.set(currentElement.getAttribute(VALUE_ATTR));
+                        levelMax.set(getValueAttribute(currentElement));
                         break;
                     case ACCEPT_ON_MATCH:
-                        acceptOnMatch.set(Boolean.parseBoolean(currentElement.getAttribute(VALUE_ATTR)));
+                        acceptOnMatch.set(Boolean.parseBoolean(getValueAttribute(currentElement)));
                         break;
                 }
             }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/StringMatchFilterBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/StringMatchFilterBuilder.java
index 96326a3..00de770 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/StringMatchFilterBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/StringMatchFilterBuilder.java
@@ -17,8 +17,6 @@
 package org.apache.log4j.builders.filter;
 
 import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.xml.XmlConfiguration.NAME_ATTR;
-import static org.apache.log4j.xml.XmlConfiguration.VALUE_ATTR;
 import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
 
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -51,12 +49,12 @@ public class StringMatchFilterBuilder extends AbstractBuilder implements FilterB
         final AtomicReference<String> text = new AtomicReference<>();
         forEachElement(filterElement.getElementsByTagName("param"), currentElement -> {
             if (currentElement.getTagName().equals("param")) {
-                switch (currentElement.getAttribute(NAME_ATTR)) {
+                switch (getNameAttribute(currentElement)) {
                     case STRING_TO_MATCH:
-                        text.set(currentElement.getAttribute(VALUE_ATTR));
+                        text.set(getValueAttribute(currentElement));
                         break;
                     case ACCEPT_ON_MATCH:
-                        acceptOnMatch.set(Boolean.parseBoolean(currentElement.getAttribute(VALUE_ATTR)));
+                        acceptOnMatch.set(Boolean.parseBoolean(getValueAttribute(currentElement)));
                         break;
 
                 }
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 af9c083..1f53571 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
@@ -17,9 +17,7 @@
 package org.apache.log4j.builders.layout;
 
 import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-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;
 
 import java.util.Properties;
@@ -68,21 +66,21 @@ public class TTCCLayoutBuilder extends AbstractBuilder implements LayoutBuilder
         final AtomicReference<String> timezone = new AtomicReference<>();
         forEachElement(layoutElement.getElementsByTagName("param"), currentElement -> {
             if (currentElement.getTagName().equals(PARAM_TAG)) {
-                switch (currentElement.getAttribute(NAME_ATTR)) {
+                switch (getNameAttribute(currentElement)) {
                     case THREAD_PRINTING_PARAM:
-                        threadPrinting.set(Boolean.parseBoolean(currentElement.getAttribute(VALUE_ATTR)));
+                        threadPrinting.set(Boolean.parseBoolean(getValueAttribute(currentElement)));
                         break;
                     case CATEGORY_PREFIXING_PARAM:
-                        categoryPrefixing.set(Boolean.parseBoolean(currentElement.getAttribute(VALUE_ATTR)));
+                        categoryPrefixing.set(Boolean.parseBoolean(getValueAttribute(currentElement)));
                         break;
                     case CONTEXT_PRINTING_PARAM:
-                        contextPrinting.set(Boolean.parseBoolean(currentElement.getAttribute(VALUE_ATTR)));
+                        contextPrinting.set(Boolean.parseBoolean(getValueAttribute(currentElement)));
                         break;
                     case DATE_FORMAT_PARAM:
-                        dateFormat.set(currentElement.getAttribute(VALUE_ATTR));
+                        dateFormat.set(getValueAttribute(currentElement));
                         break;
                     case TIMEZONE_FORMAT:
-                        timezone.set(currentElement.getAttribute(VALUE_ATTR));
+                        timezone.set(getValueAttribute(currentElement));
                         break;
                 }
             }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
index 545fdf0..e4030f1 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
@@ -344,7 +344,9 @@ public class OptionConverter {
 
     private static String substVars(final String val, final Properties props, final List<String> keys)
             throws IllegalArgumentException {
-
+        if (val == null) {
+            return null;
+        }
         final StringBuilder sbuf = new StringBuilder();
 
         int i = 0;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java
index 3f51153..e83e68b 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java
@@ -664,9 +664,9 @@ public class XmlConfiguration extends Log4j1Configuration {
         LOGGER.debug("{} level set to {}", catName,  logger.getLevel());
     }
 
-    private void setParameter(Element elem, PropertySetter propSetter) {
-        String name = subst(elem.getAttribute(NAME_ATTR));
-        String value = (elem.getAttribute(VALUE_ATTR));
+    private void setParameter(Element element, PropertySetter propSetter) {
+        String name = subst(element.getAttribute(NAME_ATTR));
+        String value = (element.getAttribute(VALUE_ATTR));
         value = subst(OptionConverter.convertSpecialChars(value));
         propSetter.setProperty(name, value);
     }
diff --git a/log4j-1.2-api/src/test/resources/log4j1-rolling-properties.xml b/log4j-1.2-api/src/test/resources/log4j1-rolling-properties.xml
index c138a25..a272630 100644
--- a/log4j-1.2-api/src/test/resources/log4j1-rolling-properties.xml
+++ b/log4j-1.2-api/src/test/resources/log4j1-rolling-properties.xml
@@ -18,7 +18,7 @@
 <!-- See https://issues.apache.org/jira/browse/LOG4J2-3328 -->
 <log4j:configuration>
   <appender name="DAILY" class="org.apache.log4j.RollingFileAppender">
-    <param name="File" value="${sys:test.directory}/logs/etl.log" />
+    <param name="File" value="${test.directory}/logs/etl.log" />
     <param name="DatePattern" value="'.'yyyy-MM-dd" />
     <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="GATEWAY: %p %d [%t] %c{1}.%M(%L) | %m%n" />