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.<.identifier>.</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