diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/common/tasklogs/ConsoleLoggingEnforcementConfigurationFactory.java b/indexing-service/src/main/java/org/apache/druid/indexing/common/tasklogs/ConsoleLoggingEnforcementConfigurationFactory.java index 8ecbb41fa8a3e..70a6a24325ef8 100644 --- a/indexing-service/src/main/java/org/apache/druid/indexing/common/tasklogs/ConsoleLoggingEnforcementConfigurationFactory.java +++ b/indexing-service/src/main/java/org/apache/druid/indexing/common/tasklogs/ConsoleLoggingEnforcementConfigurationFactory.java @@ -34,7 +34,7 @@ import org.apache.logging.log4j.core.config.xml.XmlConfiguration; import org.apache.logging.log4j.core.layout.PatternLayout; -import javax.validation.constraints.NotNull; +import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -119,7 +119,7 @@ protected void doConfigure() } } - @NotNull + @Nonnull private List findConsoleAppenders() { List consoleAppenders = new ArrayList<>(); diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/common/tasklogs/ConsoleLoggingEnforcementTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/common/tasklogs/ConsoleLoggingEnforcementTest.java index e74f87748880d..cf434ac89ff3e 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/common/tasklogs/ConsoleLoggingEnforcementTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/common/tasklogs/ConsoleLoggingEnforcementTest.java @@ -228,6 +228,73 @@ public void testEmptyAppender() throws IOException Assert.assertEquals("%m", layout.getConversionPattern()); } + @Test + public void testMultipleConsoleAppender() throws IOException + { + // this logger configuration contains multiple appenders and appender refers + String log4jConfiguration = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + LoggerContext context = enforceConsoleLogger(log4jConfiguration); + + // this logger is not defined in configuration, it derivates ROOT logger configuration + assertHasConsoleAppenderAndHttpAppender(getLogger(context, "name_not_in_config"), Level.INFO); + + assertHasConsoleAppenderAndHttpAppender(getLogger(context, "org.apache.druid"), Level.DEBUG); + assertHasConsoleAppenderAndHttpAppender(getLogger(context, ROOT), Level.INFO); + + assertHasConsoleAppenderAndHttpAppenderWithNameValidation(getLogger(context, "org.apache.mmon1"), Level.DEBUG, "Console1", "Http"); + assertHasConsoleAppenderAndHttpAppenderWithNameValidation(getLogger(context, "org.apache.mmon2"), Level.DEBUG, "Console2", "Http"); + assertHasOnlyOneConsoleAppender(getLogger(context, "org.apache.mmon3"), Level.DEBUG); + assertHasOnlyOneConsoleAppender(getLogger(context, "org.apache.mmon4"), Level.DEBUG); + + // the ConsoleAppender should be exactly the same as it's in the configuration + PatternLayout layout = (PatternLayout) getLogger(context, "anything").getAppenders() + .values() + .stream() + .findFirst() + .get() + .getLayout(); + Assert.assertEquals("%m", layout.getConversionPattern()); + } + private LoggerContext enforceConsoleLogger(String configuration) throws IOException { LoggerContext context = new LoggerContext("test"); @@ -239,19 +306,30 @@ private LoggerContext enforceConsoleLogger(String configuration) throws IOExcept } private void assertHasConsoleAppenderAndHttpAppender(Logger logger, Level level) + { + assertHasConsoleAppenderAndHttpAppenderWithNameValidation(logger, level, "Console", "Http"); + } + + private void assertHasConsoleAppenderAndHttpAppenderWithNameValidation( + Logger logger, + Level level, + String consoleName, + String httpName + ) { // there's two appenders Assert.assertEquals(2, logger.getAppenders().size()); // and the appenders must be ConsoleAppender and HttpAppender - Assert.assertEquals(ConsoleAppender.class, logger.getAppenders().get("Console").getClass()); - Assert.assertEquals(HttpAppender.class, logger.getAppenders().get("Http").getClass()); + Assert.assertEquals(ConsoleAppender.class, logger.getAppenders().get(consoleName).getClass()); + Assert.assertEquals(HttpAppender.class, logger.getAppenders().get(httpName).getClass()); if (level != null) { Assert.assertEquals(level, logger.getLevel()); } } + private void assertHasOnlyOneConsoleAppender(Logger logger, Level level) { // there's only one appender