Repository: logging-log4j2 Updated Branches: refs/heads/master e2536923d -> 35eda8aa4
[LOG4J2-1523] Log4j 1 appenders. Support System properties per Log4j 1 Javadoc. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/35eda8aa Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/35eda8aa Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/35eda8aa Branch: refs/heads/master Commit: 35eda8aa4a569d26979b7ffe2cf11134963cc6c6 Parents: e253692 Author: Gary Gregory <ggreg...@apache.org> Authored: Thu Sep 22 02:20:58 2016 -0700 Committer: Gary Gregory <ggreg...@apache.org> Committed: Thu Sep 22 02:20:58 2016 -0700 ---------------------------------------------------------------------- .../log4j/config/Log4j1ConfigurationParser.java | 28 +++++++++++++++++--- .../config/Log4j1ConfigurationFactoryTest.java | 16 ++++++++++- .../log4j-system-properties-1.properties | 14 ++++++++++ .../log4j-system-properties-2.properties | 15 +++++++++++ 4 files changed, 68 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/35eda8aa/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 27c7807..16c9b7c 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 @@ -43,6 +43,21 @@ import org.apache.logging.log4j.status.StatusLogger; * Experimental parser for Log4j 1.2 properties configuration files. * * This class is not thread-safe. + * + * <p> + * From the Log4j 1.2 Javadocs: + * </p> + * <p> + * All option values admit variable substitution. The syntax of variable + * substitution is similar to that of Unix shells. The string between an opening + * "${" and closing "}" is interpreted as a key. The value of the substituted + * variable can be defined as a system property or in the configuration file + * itself. The value of the key is first searched in the system properties, and + * if not found there, it is then searched in the configuration file being + * parsed. The corresponding value replaces the ${variableName} sequence. For + * example, if java.home system property is set to /home/xyz, then every + * occurrence of the sequence ${java.home} will be interpreted as /home/xyz. + * </p> */ public class Log4j1ConfigurationParser { @@ -52,7 +67,8 @@ public class Log4j1ConfigurationParser { private static final String FALSE = "false"; private final Properties properties = new Properties(); - private StrSubstitutor strSubstitutor; + private StrSubstitutor strSubstitutorProperties; + private StrSubstitutor strSubstitutorSystem; private final ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory .newConfigurationBuilder(); @@ -72,7 +88,8 @@ public class Log4j1ConfigurationParser { public ConfigurationBuilder<BuiltConfiguration> buildConfigurationBuilder(final InputStream input) throws IOException { properties.load(input); - strSubstitutor = new StrSubstitutor(properties); + strSubstitutorProperties = new StrSubstitutor(properties); + strSubstitutorSystem = new StrSubstitutor(System.getProperties()); final String rootCategoryValue = getLog4jValue(ROOTCATEGORY); final String rootLoggerValue = getLog4jValue(ROOTLOGGER); if (rootCategoryValue == null && rootLoggerValue == null) { @@ -364,11 +381,14 @@ public class Log4j1ConfigurationParser { } private String getProperty(final String key) { - return strSubstitutor.replace(properties.getProperty(key)); + final String value = properties.getProperty(key); + final String sysValue = strSubstitutorSystem.replace(value); + return strSubstitutorProperties.replace(sysValue); } private String getProperty(final String key, String defaultValue) { - return strSubstitutor.replace(properties.getProperty(key, defaultValue)); + final String value = getProperty(key); + return value == null ? defaultValue : value; } private String getLog4jAppenderValue(final String appenderName, final String attributeName, http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/35eda8aa/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 1e5ff36..cb58dbe 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 @@ -77,7 +77,7 @@ public class Log4j1ConfigurationFactoryTest { private Configuration configure(final String configResource) throws URISyntaxException { final URL configLocation = ClassLoader.getSystemResource(configResource); - assertNotNull(configLocation); + assertNotNull(configResource, configLocation); final Configuration configuration = new Log4j1ConfigurationFactory().getConfiguration(null, "test", configLocation.toURI()); assertNotNull(configuration); @@ -153,6 +153,20 @@ public class Log4j1ConfigurationFactoryTest { testRollingFileAppender("config-1.2/log4j-RollingFileAppender-with-props.properties", "RFA", "./hadoop.log.%i"); } + @Test + public void testSystemProperties1() throws Exception { + final Configuration configuration = configure("config-1.2/log4j-system-properties-1.properties"); + final RollingFileAppender appender = configuration.getAppender("RFA"); + assertEquals(System.getProperty("java.io.tmpdir") + "/hadoop.log", appender.getFileName()); + } + + @Test + public void testSystemProperties2() throws Exception { + final Configuration configuration = configure("config-1.2/log4j-system-properties-2.properties"); + final RollingFileAppender appender = configuration.getAppender("RFA"); + assertEquals("${java.io.tmpdir}/hadoop.log", appender.getFileName()); + } + private void testRollingFileAppender(final String configResource, final String name, final String filePattern) throws URISyntaxException { final Configuration configuration = configure(configResource); final Appender appender = configuration.getAppender(name); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/35eda8aa/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.properties ---------------------------------------------------------------------- diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.properties new file mode 100644 index 0000000..a82c4c3 --- /dev/null +++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-1.properties @@ -0,0 +1,14 @@ +############################################################################### +# +# Log4J 1.2 Configuration. +# + +hadoop.log.file=hadoop.log + +log4j.rootLogger=TRACE, RFA + +# +# Rolling File Appender +# +log4j.appender.RFA=org.apache.log4j.RollingFileAppender +log4j.appender.RFA.File=${java.io.tmpdir}/${hadoop.log.file} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/35eda8aa/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-2.properties ---------------------------------------------------------------------- diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-2.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-2.properties new file mode 100644 index 0000000..9228434 --- /dev/null +++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-system-properties-2.properties @@ -0,0 +1,15 @@ +############################################################################### +# +# Log4J 1.2 Configuration. +# + +hadoop.log.dir=${java.io.tmpdir} +hadoop.log.file=hadoop.log + +log4j.rootLogger=TRACE, RFA + +# +# Rolling File Appender +# +log4j.appender.RFA=org.apache.log4j.RollingFileAppender +log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file}