diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationTest.java index 181879489ca..e2b76e7072a 100644 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationTest.java +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationTest.java @@ -34,6 +34,7 @@ import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; +import org.apache.logging.log4j.core.config.Property; import org.apache.logging.log4j.core.filter.ThresholdFilter; import org.apache.logging.log4j.core.test.appender.ListAppender; import org.apache.logging.log4j.core.test.junit.LoggerContextSource; @@ -56,6 +57,21 @@ void testPropertiesConfiguration(final Configuration config) { final Filter filter = config.getFilter(); assertNotNull(filter, "No Filter"); assertInstanceOf(ThresholdFilter.class, filter, "Not a Threshold Filter"); + + final List rootProperties = config.getRootLogger().getPropertyList(); + assertNotNull(rootProperties, "Root properties list should not be null"); + assertEquals(1, rootProperties.size()); + assertEquals("client.address", rootProperties.get(0).getName()); + assertEquals("${web:request.remoteAddress}", rootProperties.get(0).getValue()); + + final LoggerConfig log4jLogger = loggers.get("org.apache.logging.log4j"); + assertNotNull(log4jLogger, "org.apache.logging.log4j logger should not be null"); + final List log4jProperties = log4jLogger.getPropertyList(); + assertNotNull(log4jProperties, "org.apache.logging.log4j properties list should not be null"); + assertEquals(1, log4jProperties.size()); + assertEquals("subsystem", log4jProperties.get(0).getName()); + assertEquals("Database", log4jProperties.get(0).getValue()); + final Logger logger = LogManager.getLogger(getClass()); logger.info("Welcome to Log4j!"); } diff --git a/log4j-core-test/src/test/resources/log4j2-properties.properties b/log4j-core-test/src/test/resources/log4j2-properties.properties index b2909d0c6fd..f525cfb615e 100644 --- a/log4j-core-test/src/test/resources/log4j2-properties.properties +++ b/log4j-core-test/src/test/resources/log4j2-properties.properties @@ -38,3 +38,11 @@ logger.log4j.additivity = false rootLogger.appenderRef.console.ref = StdOut rootLogger.level = ERROR + +rootLogger.property.type = Property +rootLogger.property.name = client.address +rootLogger.property.value = $${web:request.remoteAddress} + +logger.log4j.property.type = Property +logger.log4j.property.name = subsystem +logger.log4j.property.value = Database 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 4903e8bcb50..ba25b6626f4 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 @@ -312,8 +312,9 @@ private LoggerComponentBuilder createLogger(final String key, final Properties p } if (levelAndRefs != null) { loggerBuilder.addAttribute("levelAndRefs", levelAndRefs); + properties.remove(""); } - return loggerBuilder; + return processRemainingProperties(loggerBuilder, properties); } private RootLoggerComponentBuilder createRootLogger(final Properties properties) { @@ -343,8 +344,10 @@ private RootLoggerComponentBuilder createRootLogger(final Properties properties) addLoggersToComponent(loggerBuilder, properties); if (levelAndRefs != null) { loggerBuilder.addAttribute("levelAndRefs", levelAndRefs); + properties.remove(""); } - return addFiltersToComponent(loggerBuilder, properties); + addFiltersToComponent(loggerBuilder, properties); + return processRemainingProperties(loggerBuilder, properties); } private LayoutComponentBuilder createLayout(final String appenderName, final Properties properties) { diff --git a/src/changelog/.2.x.x/4024_fix_roperties_configuration_support_for_logger_properties.xml b/src/changelog/.2.x.x/4024_fix_roperties_configuration_support_for_logger_properties.xml new file mode 100644 index 00000000000..61b7da12f58 --- /dev/null +++ b/src/changelog/.2.x.x/4024_fix_roperties_configuration_support_for_logger_properties.xml @@ -0,0 +1,13 @@ + + + + + + Fix properties configuration format to correctly parse and apply nested custom properties on loggers and root loggers + +