This is an automated email from the ASF dual-hosted git repository. mattsicker pushed a commit to branch feature/3.x/port-3259 in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 34f00048084a2f32b04f6e7895fb20523338897f Author: Matt Sicker <[email protected]> AuthorDate: Wed Jul 30 16:22:06 2025 -0500 Support `FailoverAppender::requiresLocation` This is a port of https://github.com/apache/logging-log4j2/pull/3259 to the 3.x line. This addresses #3257. --- .../log4j/core/appender/FailoverAppenderTest.java | 54 +++++++++------------- .../src/test/resources/log4j-failover-location.xml | 40 ++++++++++++++++ .../log4j/core/appender/FailoverAppender.java | 13 ++++++ .../3257_fix_FailoverAppender_requiresLocation.xml | 8 ++++ 4 files changed, 84 insertions(+), 31 deletions(-) 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 b730f7bca1..111044ff3e 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 @@ package org.apache.logging.log4j.core.appender; 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.FailOnceAppender; 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<LogEvent> 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<LogEvent> 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 0000000000..cff9434582 --- /dev/null +++ b/log4j-core-test/src/test/resources/log4j-failover-location.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one or more + ~ contributor license agreements. See the NOTICE file distributed with + ~ this work for additional information regarding copyright ownership. + ~ The ASF licenses this file to you under the Apache License, Version 2.0 + ~ (the "License"); you may not use this file except in compliance with + ~ the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<Configuration status="OFF" name="RoutingTest"> + + <Appenders> + <Console name="CONSOLE"> + <PatternLayout pattern="%m%L%n"/> + </Console> + <Console name="CONSOLE2"> + <PatternLayout pattern="%m%L%n"/> + </Console> + <Failover name="Failover" primary="CONSOLE"> + <Failovers> + <AppenderRef ref="CONSOLE2"/> + </Failovers> + </Failover> + </Appenders> + + <Loggers> + <Root level="debug" includeLocation="true"> + <AppenderRef ref="Failover"/> + </Root> + </Loggers> + +</Configuration> 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 51883eb20a..5e2235127c 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 @@ public final class FailoverAppender extends AbstractAppender { } } + @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()); diff --git a/src/changelog/.3.x.x/3257_fix_FailoverAppender_requiresLocation.xml b/src/changelog/.3.x.x/3257_fix_FailoverAppender_requiresLocation.xml new file mode 100644 index 0000000000..f0cb262f81 --- /dev/null +++ b/src/changelog/.3.x.x/3257_fix_FailoverAppender_requiresLocation.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="https://logging.apache.org/xml/ns" + xsi:schemaLocation="https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" + type="fixed"> + <issue id="3257" link="https://github.com/apache/logging-log4j2/issues/3257"/> + <description format="asciidoc">Fix detection of location requirements in `FailoverAppender`.</description> +</entry>
