From 1b689447940633d6b62cac4f49b79bf66274c3ad Mon Sep 17 00:00:00 2001 From: Xianren Liu Date: Sat, 30 Nov 2024 23:39:31 +0800 Subject: [PATCH] Add requiresLocation function for FailoverAppender (#3257) --- .../core/appender/FailoverAppenderTest.java | 41 ++++++++----------- .../resources/log4j-failover-location.xml | 40 ++++++++++++++++++ .../log4j/core/appender/FailoverAppender.java | 17 ++++++++ ..._fix_FailoverAppender_requiresLocation.xml | 8 ++++ 4 files changed, 83 insertions(+), 23 deletions(-) create mode 100644 log4j-core-test/src/test/resources/log4j-failover-location.xml create mode 100644 src/changelog/.2.x.x/3257_fix_FailoverAppender_requiresLocation.xml diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java index efba39b0b97..111044ff3ef 100644 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java @@ -18,6 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.List; import org.apache.logging.log4j.Logger; @@ -27,33 +28,14 @@ import org.apache.logging.log4j.core.test.appender.ListAppender; import org.apache.logging.log4j.core.test.junit.LoggerContextSource; import org.apache.logging.log4j.core.test.junit.Named; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; -@LoggerContextSource("log4j-failover.xml") public class FailoverAppenderTest { - private final ListAppender app; - private final FailOnceAppender foApp; - private final Logger logger; - private final Logger onceLogger; - - public FailoverAppenderTest( - final LoggerContext context, - @Named("List") final ListAppender app, - @Named("Once") final FailOnceAppender foApp) { - this.app = app; - this.foApp = foApp; - logger = context.getLogger("LoggerTest"); - onceLogger = context.getLogger("Once"); - } - - @AfterEach - void tearDown() { - app.clear(); - } @Test - void testFailover() { + @LoggerContextSource("log4j-failover.xml") + void testFailover(final LoggerContext context, @Named("List") final ListAppender app) { + final Logger logger = context.getLogger("LoggerTest"); logger.error("This is a test"); List events = app.getEvents(); assertNotNull(events); @@ -66,7 +48,13 @@ void testFailover() { } @Test - void testRecovery() throws Exception { + @LoggerContextSource("log4j-failover.xml") + void testRecovery( + final LoggerContext context, + @Named("List") final ListAppender app, + @Named("Once") final FailOnceAppender foApp) + throws Exception { + final Logger onceLogger = context.getLogger("Once"); onceLogger.error("Fail once"); onceLogger.error("Fail again"); List events = app.getEvents(); @@ -81,4 +69,11 @@ void testRecovery() throws Exception { events = foApp.drainEvents(); assertEquals(2, events.size(), "Incorrect number of events in primary appender"); } + + @Test + @LoggerContextSource("log4j-failover-location.xml") + void testRequiresLocation(final LoggerContext context) { + final FailoverAppender appender = context.getConfiguration().getAppender("Failover"); + assertTrue(appender.requiresLocation()); + } } diff --git a/log4j-core-test/src/test/resources/log4j-failover-location.xml b/log4j-core-test/src/test/resources/log4j-failover-location.xml new file mode 100644 index 00000000000..cff9434582a --- /dev/null +++ b/log4j-core-test/src/test/resources/log4j-failover-location.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java index 0c2e186ce72..27b035fad56 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java @@ -34,6 +34,7 @@ import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; import org.apache.logging.log4j.core.config.plugins.PluginElement; import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.impl.LocationAware; import org.apache.logging.log4j.core.util.Booleans; import org.apache.logging.log4j.core.util.Constants; @@ -223,4 +224,20 @@ public static FailoverAppender createAppender( return new FailoverAppender( name, filter, primary, failovers, retryIntervalMillis, config, ignoreExceptions, null); } + + @Override + public boolean requiresLocation() { + if (primary != null + && primary.getAppender() instanceof LocationAware + && ((LocationAware) primary.getAppender()).requiresLocation()) { + return true; + } + for (final AppenderControl control : failoverAppenders) { + final Appender appender = control.getAppender(); + if (appender instanceof LocationAware && ((LocationAware) appender).requiresLocation()) { + return true; + } + } + return false; + } } diff --git a/src/changelog/.2.x.x/3257_fix_FailoverAppender_requiresLocation.xml b/src/changelog/.2.x.x/3257_fix_FailoverAppender_requiresLocation.xml new file mode 100644 index 00000000000..f0cb262f819 --- /dev/null +++ b/src/changelog/.2.x.x/3257_fix_FailoverAppender_requiresLocation.xml @@ -0,0 +1,8 @@ + + + + Fix detection of location requirements in `FailoverAppender`. +