Skip to content

Commit ee08593

Browse files
committed
Make Appender detection independent of plugin name.
1 parent fb3dcc0 commit ee08593

File tree

3 files changed

+93
-12
lines changed

3 files changed

+93
-12
lines changed

powertools-logging/powertools-logging-log4j/src/main/java/software/amazon/lambda/powertools/logging/log4j/internal/Log4jLoggingManager.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414

1515
package software.amazon.lambda.powertools.logging.log4j.internal;
1616

17-
import static software.amazon.lambda.powertools.logging.log4j.Log4jConstants.BUFFERING_APPENDER_PLUGIN_NAME;
17+
import java.util.Collection;
18+
import java.util.stream.Collectors;
1819

1920
import org.apache.logging.log4j.Level;
2021
import org.apache.logging.log4j.LogManager;
@@ -57,24 +58,23 @@ public org.slf4j.event.Level getLogLevel(Logger logger) {
5758
*/
5859
@Override
5960
public void flushBuffer() {
60-
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
61-
BufferingAppender bufferingAppender = (BufferingAppender) ctx.getConfiguration()
62-
.getAppender(BUFFERING_APPENDER_PLUGIN_NAME);
63-
if (bufferingAppender != null) {
64-
bufferingAppender.flushBuffer();
65-
}
61+
getBufferingAppenders().forEach(BufferingAppender::flushBuffer);
6662
}
6763

6864
/**
6965
* @inheritDoc
7066
*/
7167
@Override
7268
public void clearBuffer() {
69+
getBufferingAppenders().forEach(BufferingAppender::clearBuffer);
70+
}
71+
72+
private Collection<BufferingAppender> getBufferingAppenders() {
73+
// Search all buffering appenders to avoid relying on the appender name given by the user
7374
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
74-
BufferingAppender bufferingAppender = (BufferingAppender) ctx.getConfiguration()
75-
.getAppender(BUFFERING_APPENDER_PLUGIN_NAME);
76-
if (bufferingAppender != null) {
77-
bufferingAppender.clearBuffer();
78-
}
75+
return ctx.getConfiguration().getAppenders().values().stream()
76+
.filter(BufferingAppender.class::isInstance)
77+
.map(BufferingAppender.class::cast)
78+
.collect(Collectors.toList());
7979
}
8080
}

powertools-logging/powertools-logging-log4j/src/test/java/software/amazon/lambda/powertools/logging/log4j/internal/Log4jLoggingManagerTest.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,20 @@
55
import static org.slf4j.event.Level.ERROR;
66
import static org.slf4j.event.Level.WARN;
77

8+
import java.io.File;
9+
import java.io.IOException;
10+
import java.nio.channels.FileChannel;
11+
import java.nio.file.NoSuchFileException;
12+
import java.nio.file.Paths;
13+
import java.nio.file.StandardOpenOption;
14+
15+
import org.apache.logging.log4j.LogManager;
16+
import org.apache.logging.log4j.core.LoggerContext;
17+
import org.apache.logging.log4j.core.config.Configuration;
18+
import org.apache.logging.log4j.core.config.ConfigurationFactory;
19+
import org.apache.logging.log4j.core.config.ConfigurationSource;
20+
import org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory;
21+
import org.junit.jupiter.api.AfterEach;
822
import org.junit.jupiter.api.Order;
923
import org.junit.jupiter.api.Test;
1024
import org.slf4j.Logger;
@@ -47,4 +61,45 @@ void resetLogLevel() {
4761
assertThat(rootLevel).isEqualTo(ERROR);
4862
assertThat(logLevel).isEqualTo(ERROR);
4963
}
64+
65+
@Test
66+
void shouldDetectMultipleBufferingAppendersRegardlessOfName() throws IOException {
67+
// Given - configuration with multiple BufferingAppenders with different names
68+
try {
69+
FileChannel.open(Paths.get("target/logfile.json"), StandardOpenOption.WRITE).truncate(0).close();
70+
} catch (NoSuchFileException e) {
71+
// may not be there in the first run
72+
}
73+
74+
ConfigurationFactory factory = new XmlConfigurationFactory();
75+
ConfigurationSource source = new ConfigurationSource(
76+
getClass().getResourceAsStream("/log4j2-multiple-buffering.xml"));
77+
Configuration config = factory.getConfiguration(null, source);
78+
79+
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
80+
ctx.setConfiguration(config);
81+
ctx.updateLoggers();
82+
83+
org.apache.logging.log4j.Logger logger = LogManager.getLogger("test.multiple.appenders");
84+
85+
// When - log messages and flush buffers
86+
logger.debug("Test message 1");
87+
logger.debug("Test message 2");
88+
89+
Log4jLoggingManager manager = new Log4jLoggingManager();
90+
manager.flushBuffer();
91+
92+
// Then - both appenders should have flushed their buffers
93+
File logFile = new File("target/logfile.json");
94+
assertThat(logFile).exists();
95+
}
96+
97+
@AfterEach
98+
void cleanUp() throws IOException {
99+
try {
100+
FileChannel.open(Paths.get("target/logfile.json"), StandardOpenOption.WRITE).truncate(0).close();
101+
} catch (NoSuchFileException e) {
102+
// may not be there
103+
}
104+
}
50105
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Configuration>
3+
<Appenders>
4+
<File name="testFile" fileName="target/logfile.json">
5+
<PatternLayout pattern="%msg%n" />
6+
</File>
7+
<BufferingAppender name="FirstBufferingAppender"
8+
bufferAtVerbosity="DEBUG"
9+
maxBytes="1024"
10+
flushOnErrorLog="true">
11+
<AppenderRef ref="testFile" />
12+
</BufferingAppender>
13+
<BufferingAppender name="SecondBufferingAppender"
14+
bufferAtVerbosity="DEBUG"
15+
maxBytes="1024"
16+
flushOnErrorLog="true">
17+
<AppenderRef ref="testFile" />
18+
</BufferingAppender>
19+
</Appenders>
20+
<Loggers>
21+
<Logger name="test.multiple.appenders" level="DEBUG" additivity="false">
22+
<AppenderRef ref="FirstBufferingAppender" />
23+
<AppenderRef ref="SecondBufferingAppender" />
24+
</Logger>
25+
</Loggers>
26+
</Configuration>

0 commit comments

Comments
 (0)