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>

Reply via email to