From a109d05742d7b5600d737685e7a116ae06aaf5ad Mon Sep 17 00:00:00 2001 From: Matt Sicker Date: Wed, 30 Jul 2025 16:22:06 -0500 Subject: [PATCH] Support `FailoverAppender::requiresLocation` This is a port of https://github.com/apache/logging-log4j2/pull/3259 to the 3.x line. This addresses #3257. --- .../core/appender/FailoverAppenderTest.java | 54 ++++++++----------- .../resources/log4j-failover-location.xml | 40 ++++++++++++++ .../log4j/core/appender/FailoverAppender.java | 13 +++++ 3 files changed, 76 insertions(+), 31 deletions(-) create mode 100644 log4j-core-test/src/test/resources/log4j-failover-location.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 b730f7bca13..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,61 +28,52 @@ 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.Tag; import org.junit.jupiter.api.Test; -@LoggerContextSource("log4j-failover.xml") -@Tag("sleepy") 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 - public void tearDown() throws Exception { - app.clear(); - } @Test - public 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); - assertEquals(events.size(), 1, "Incorrect number of events. Should be 1 is " + events.size()); + assertEquals(1, events.size(), "Incorrect number of events. Should be 1 is " + events.size()); app.clear(); logger.error("This is a test"); events = app.getEvents(); assertNotNull(events); - assertEquals(events.size(), 1, "Incorrect number of events. Should be 1 is " + events.size()); + assertEquals(1, events.size(), "Incorrect number of events. Should be 1 is " + events.size()); } @Test - @Tag("sleepy") - public 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(); assertNotNull(events); - assertEquals(events.size(), 2, "Incorrect number of events. Should be 2 is " + events.size()); + assertEquals(2, events.size(), "Incorrect number of events. Should be 2 is " + events.size()); app.clear(); Thread.sleep(1100); onceLogger.error("Fail after recovery interval"); onceLogger.error("Second log message"); events = app.getEvents(); - assertEquals(events.size(), 0, "Did not recover"); + assertEquals(0, events.size(), "Did not recover"); events = foApp.drainEvents(); - assertEquals(events.size(), 2, "Incorrect number of events in primary appender"); + 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 51883eb20a3..5e2235127ca 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 @@ -157,6 +157,19 @@ private void failover(final LogEvent event, final Exception ex) { } } + @Override + public boolean requiresLocation() { + if (primary != null && primary.getAppender().requiresLocation()) { + return true; + } + for (final AppenderControl control : failoverAppenders) { + if (control.getAppender().requiresLocation()) { + return true; + } + } + return false; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder(getName());