LOG4J2-1402 - Fix regression in properties configuration to support arbitrary 
component ids


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

Branch: refs/heads/LOG4J-1181
Commit: 7792679c3b1add777b489a0d698c11cd4f96ea8e
Parents: 140e4c7
Author: Ralph Goers <rgo...@nextiva.com>
Authored: Wed Jun 1 14:36:57 2016 -0700
Committer: Ralph Goers <rgo...@nextiva.com>
Committed: Wed Jun 1 14:36:57 2016 -0700

----------------------------------------------------------------------
 .../PropertiesConfigurationBuilder.java         | 60 +++++++++++++++-----
 .../src/test/resources/log4j-rolling.properties | 24 ++++----
 src/changes/changes.xml                         |  3 +
 src/site/xdoc/manual/configuration.xml.vm       | 10 ++--
 4 files changed, 67 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7792679c/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
index 51bdcca..2c70234 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
@@ -120,24 +120,56 @@ public class PropertiesConfigurationBuilder extends 
ConfigurationBuilderFactory
             }
         }
 
-        final Map<String, Properties> filters = 
PropertiesUtil.partitionOnCommonPrefixes(
-            PropertiesUtil.extractSubset(rootProperties, "filter"));
-        for (final Map.Entry<String, Properties> entry : filters.entrySet()) {
-            builder.add(createFilter(entry.getKey().trim(), entry.getValue()));
+        String filterProp = rootProperties.getProperty("filters");
+        if (filterProp != null) {
+            String[] filterNames = filterProp.split(",");
+            for (String filterName : filterNames) {
+                String name = filterName.trim();
+                builder.add(createFilter(name, 
PropertiesUtil.extractSubset(rootProperties, "filter." + name)));
+            }
+        } else {
+
+            final Map<String, Properties> filters = PropertiesUtil
+                    
.partitionOnCommonPrefixes(PropertiesUtil.extractSubset(rootProperties, 
"filter"));
+            for (final Map.Entry<String, Properties> entry : 
filters.entrySet()) {
+                builder.add(createFilter(entry.getKey().trim(), 
entry.getValue()));
+            }
         }
 
-        final Map<String, Properties> appenders = 
PropertiesUtil.partitionOnCommonPrefixes(
-            PropertiesUtil.extractSubset(rootProperties, "appender"));
-        for (final Map.Entry<String, Properties> entry : appenders.entrySet()) 
{
-            builder.add(createAppender(entry.getKey().trim(), 
entry.getValue()));
+        String appenderProp = rootProperties.getProperty("appenders");
+        if (appenderProp != null) {
+            String[] appenderNames = appenderProp.split(",");
+            for (String appenderName : appenderNames) {
+                String name = appenderName.trim();
+                builder.add(createAppender(appenderName.trim(),
+                        PropertiesUtil.extractSubset(rootProperties, 
"appender." + name)));
+            }
+        } else {
+            final Map<String, Properties> appenders = PropertiesUtil
+                    
.partitionOnCommonPrefixes(PropertiesUtil.extractSubset(rootProperties, 
"appender"));
+            for (final Map.Entry<String, Properties> entry : 
appenders.entrySet()) {
+                builder.add(createAppender(entry.getKey().trim(), 
entry.getValue()));
+            }
         }
 
-        final Map<String, Properties> loggers = 
PropertiesUtil.partitionOnCommonPrefixes(
-            PropertiesUtil.extractSubset(rootProperties, "logger"));
-        for (final Map.Entry<String, Properties> entry : loggers.entrySet()) {
-            final String name = entry.getKey().trim();
-            if (!name.equals(LoggerConfig.ROOT)) {
-                builder.add(createLogger(name, entry.getValue()));
+        String loggerProp = rootProperties.getProperty("loggers");
+        if (loggerProp != null) {
+            String[] loggerNames = loggerProp.split(",");
+            for (String loggerName : loggerNames) {
+                String name = loggerName.trim();
+                if (!name.equals(LoggerConfig.ROOT)) {
+                    builder.add(createLogger(name, 
PropertiesUtil.extractSubset(rootProperties, "logger." +
+                            name)));
+                }
+            }
+        } else {
+            final Map<String, Properties> loggers = PropertiesUtil
+                    
.partitionOnCommonPrefixes(PropertiesUtil.extractSubset(rootProperties, 
"logger"));
+            for (final Map.Entry<String, Properties> entry : 
loggers.entrySet()) {
+                final String name = entry.getKey().trim();
+                if (!name.equals(LoggerConfig.ROOT)) {
+                    builder.add(createLogger(name, entry.getValue()));
+                }
             }
         }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7792679c/log4j-core/src/test/resources/log4j-rolling.properties
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/resources/log4j-rolling.properties 
b/log4j-core/src/test/resources/log4j-rolling.properties
index 17e4a60..d02e0a8 100644
--- a/log4j-core/src/test/resources/log4j-rolling.properties
+++ b/log4j-core/src/test/resources/log4j-rolling.properties
@@ -23,7 +23,7 @@ filters = threshold
 filter.threshold.type = ThresholdFilter
 filter.threshold.level = debug
 
-appenders = console, rolling, list
+appenders = console, rolling, my.list
 
 appender.console.type = Console
 appender.console.name = STDOUT
@@ -43,19 +43,19 @@ appender.rolling.policies.time.modulate = true
 appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
 appender.rolling.policies.size.size=100MB
 
-appender.list.type = List
-appender.list.name = List
-appender.list.filters = threshold
-appender.list.filter.threshold.type = ThresholdFilter
-appender.list.filter.threshold.level = error
+appender.my.list.type = List
+appender.my.list.name = List
+appender.my.list.filters = threshold
+appender.my.list.filter.threshold.type = ThresholdFilter
+appender.my.list.filter.threshold.level = error
 
-loggers = rolling
+loggers = rolling.file
 
-logger.rolling.name = org.apache.logging.log4j.core.appender.rolling
-logger.rolling.level = debug
-logger.rolling.additivity = false
-logger.rolling.appenderRefs = rolling
-logger.rolling.appenderRef.rolling.ref = RollingFile
+logger.rolling.file.name = org.apache.logging.log4j.core.appender.rolling
+logger.rolling.file.level = debug
+logger.rolling.file.additivity = false
+logger.rolling.file.appenderRefs = rolling
+logger.rolling.file.appenderRef.rolling.ref = RollingFile
 
 rootLogger.level = info
 rootLogger.appenderRefs = stdout

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7792679c/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 1724b0d..f952402 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -24,6 +24,9 @@
   </properties>
   <body>
     <release version="2.6.1" date="2016-MM-DD" description="GA Release 2.6.1">
+      <action issue="LOG4J2-1402" dev="rgoers" type="fix">
+        Fix regression in properties configuration to support arbitrary 
component ids.
+      </action>
       <action issue="LOG4J2-1385" dev="ggregory" type="update">
         (GC) CSV layouts should not create a new CSVPrinter for each log event.
       </action>

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7792679c/src/site/xdoc/manual/configuration.xml.vm
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/configuration.xml.vm 
b/src/site/xdoc/manual/configuration.xml.vm
index 47a0ce8..ca0bceb 100644
--- a/src/site/xdoc/manual/configuration.xml.vm
+++ b/src/site/xdoc/manual/configuration.xml.vm
@@ -821,14 +821,16 @@ public class Bar {
               Prior to version 2.6,
               the properties configuration requires that you list the 
identifiers of the appenders, filters and loggers,
               in a comma separated list in properties with those names. Each 
of those components will then be expected
-              to be defined in sets of properties that begin with 
<i>component.identifier</i>. The identifier does not
+              to be defined in sets of properties that begin with 
<i>component.&lt.identifier&gt.</i>. The identifier does not
               have to match the name of the component being defined but must 
uniquely identify all the attributes and
-              subcomponents that are part of the component. Each individual 
component MUST have a "type" attribute
+              subcomponents that are part of the component. If the list of 
identifiers is not present the
+              identier must not contain a '.'. Each individual component MUST 
have a "type" attribute
               specified that identifies the component's Plugin type.
             </p>
             <p>
-              As of version 2.6, this list of identifiers is no longer 
required as names are inferred upon first usage.
-              The list of identifiers used in a 2.4/2.5 format will be safely 
ignored in 2.6+.
+              As of version 2.6, this list of identifiers is no longer 
required as names are inferred upon first usage,
+              however if you wish to use more complex identifies you must 
still use the list. If the list is present
+              it will be used.
             </p>
             <p>
               Unlike the base components, when creating subcomponents you 
cannot specify an element containing a list of

Reply via email to