Skip to content

Commit e3ced8b

Browse files
authored
Support FailoverAppender::requiresLocation (#3861)
This is a port of #3259 to the 3.x line. This addresses #3257.
1 parent 6af1756 commit e3ced8b

File tree

3 files changed

+76
-31
lines changed

3 files changed

+76
-31
lines changed

log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static org.junit.jupiter.api.Assertions.assertEquals;
2020
import static org.junit.jupiter.api.Assertions.assertNotNull;
21+
import static org.junit.jupiter.api.Assertions.assertTrue;
2122

2223
import java.util.List;
2324
import org.apache.logging.log4j.Logger;
@@ -27,61 +28,52 @@
2728
import org.apache.logging.log4j.core.test.appender.ListAppender;
2829
import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
2930
import org.apache.logging.log4j.core.test.junit.Named;
30-
import org.junit.jupiter.api.AfterEach;
31-
import org.junit.jupiter.api.Tag;
3231
import org.junit.jupiter.api.Test;
3332

34-
@LoggerContextSource("log4j-failover.xml")
35-
@Tag("sleepy")
3633
public class FailoverAppenderTest {
37-
private final ListAppender app;
38-
private final FailOnceAppender foApp;
39-
private final Logger logger;
40-
private final Logger onceLogger;
41-
42-
public FailoverAppenderTest(
43-
final LoggerContext context,
44-
@Named("List") final ListAppender app,
45-
@Named("Once") final FailOnceAppender foApp) {
46-
this.app = app;
47-
this.foApp = foApp;
48-
logger = context.getLogger("LoggerTest");
49-
onceLogger = context.getLogger("Once");
50-
}
51-
52-
@AfterEach
53-
public void tearDown() throws Exception {
54-
app.clear();
55-
}
5634

5735
@Test
58-
public void testFailover() {
36+
@LoggerContextSource("log4j-failover.xml")
37+
void testFailover(final LoggerContext context, @Named("List") final ListAppender app) {
38+
final Logger logger = context.getLogger("LoggerTest");
5939
logger.error("This is a test");
6040
List<LogEvent> events = app.getEvents();
6141
assertNotNull(events);
62-
assertEquals(events.size(), 1, "Incorrect number of events. Should be 1 is " + events.size());
42+
assertEquals(1, events.size(), "Incorrect number of events. Should be 1 is " + events.size());
6343
app.clear();
6444
logger.error("This is a test");
6545
events = app.getEvents();
6646
assertNotNull(events);
67-
assertEquals(events.size(), 1, "Incorrect number of events. Should be 1 is " + events.size());
47+
assertEquals(1, events.size(), "Incorrect number of events. Should be 1 is " + events.size());
6848
}
6949

7050
@Test
71-
@Tag("sleepy")
72-
public void testRecovery() throws Exception {
51+
@LoggerContextSource("log4j-failover.xml")
52+
void testRecovery(
53+
final LoggerContext context,
54+
@Named("List") final ListAppender app,
55+
@Named("Once") final FailOnceAppender foApp)
56+
throws Exception {
57+
final Logger onceLogger = context.getLogger("Once");
7358
onceLogger.error("Fail once");
7459
onceLogger.error("Fail again");
7560
List<LogEvent> events = app.getEvents();
7661
assertNotNull(events);
77-
assertEquals(events.size(), 2, "Incorrect number of events. Should be 2 is " + events.size());
62+
assertEquals(2, events.size(), "Incorrect number of events. Should be 2 is " + events.size());
7863
app.clear();
7964
Thread.sleep(1100);
8065
onceLogger.error("Fail after recovery interval");
8166
onceLogger.error("Second log message");
8267
events = app.getEvents();
83-
assertEquals(events.size(), 0, "Did not recover");
68+
assertEquals(0, events.size(), "Did not recover");
8469
events = foApp.drainEvents();
85-
assertEquals(events.size(), 2, "Incorrect number of events in primary appender");
70+
assertEquals(2, events.size(), "Incorrect number of events in primary appender");
71+
}
72+
73+
@Test
74+
@LoggerContextSource("log4j-failover-location.xml")
75+
void testRequiresLocation(final LoggerContext context) {
76+
final FailoverAppender appender = context.getConfiguration().getAppender("Failover");
77+
assertTrue(appender.requiresLocation());
8678
}
8779
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
~ Licensed to the Apache Software Foundation (ASF) under one or more
4+
~ contributor license agreements. See the NOTICE file distributed with
5+
~ this work for additional information regarding copyright ownership.
6+
~ The ASF licenses this file to you under the Apache License, Version 2.0
7+
~ (the "License"); you may not use this file except in compliance with
8+
~ the License. You may obtain a copy of the License at
9+
~
10+
~ http://www.apache.org/licenses/LICENSE-2.0
11+
~
12+
~ Unless required by applicable law or agreed to in writing, software
13+
~ distributed under the License is distributed on an "AS IS" BASIS,
14+
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
~ See the License for the specific language governing permissions and
16+
~ limitations under the License.
17+
-->
18+
<Configuration status="OFF" name="RoutingTest">
19+
20+
<Appenders>
21+
<Console name="CONSOLE">
22+
<PatternLayout pattern="%m%L%n"/>
23+
</Console>
24+
<Console name="CONSOLE2">
25+
<PatternLayout pattern="%m%L%n"/>
26+
</Console>
27+
<Failover name="Failover" primary="CONSOLE">
28+
<Failovers>
29+
<AppenderRef ref="CONSOLE2"/>
30+
</Failovers>
31+
</Failover>
32+
</Appenders>
33+
34+
<Loggers>
35+
<Root level="debug" includeLocation="true">
36+
<AppenderRef ref="Failover"/>
37+
</Root>
38+
</Loggers>
39+
40+
</Configuration>

log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,19 @@ private void failover(final LogEvent event, final Exception ex) {
157157
}
158158
}
159159

160+
@Override
161+
public boolean requiresLocation() {
162+
if (primary != null && primary.getAppender().requiresLocation()) {
163+
return true;
164+
}
165+
for (final AppenderControl control : failoverAppenders) {
166+
if (control.getAppender().requiresLocation()) {
167+
return true;
168+
}
169+
}
170+
return false;
171+
}
172+
160173
@Override
161174
public String toString() {
162175
final StringBuilder sb = new StringBuilder(getName());

0 commit comments

Comments
 (0)