This is an automated email from the ASF dual-hosted git repository.
vy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/master by this push:
new 5baac56 LOG4J2-3172 Buffer immutable log events in the SmtpManager.
(#588)
5baac56 is described below
commit 5baac5651788bd9b844f176e5b572f3a93a6ba32
Author: Volkan Yazıcı <[email protected]>
AuthorDate: Tue Oct 19 08:45:42 2021 +0200
LOG4J2-3172 Buffer immutable log events in the SmtpManager. (#588)
Co-authored-by: Barry Fleming <[email protected]>
---
.../logging/log4j/smtp/appender/SmtpManager.java | 13 +++---
.../log4j/smtp/appender/SmtpManagerTest.java | 48 ++++++++++++++++++++++
src/changes/changes.xml | 3 ++
3 files changed, 57 insertions(+), 7 deletions(-)
diff --git
a/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
index 9d93932..2e1f0e9 100644
---
a/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
+++
b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
@@ -88,12 +88,7 @@ public class SmtpManager extends AbstractManager {
}
public void add(LogEvent event) {
- if (event instanceof Log4jLogEvent && event.getMessage() instanceof
ReusableMessage) {
- ((Log4jLogEvent) event).makeMessageImmutable();
- } else if (event instanceof MutableLogEvent) {
- event = ((MutableLogEvent) event).createMemento();
- }
- buffer.add(event);
+ buffer.add(event.toImmutable());
}
public static SmtpManager getSmtpManager(
@@ -182,7 +177,7 @@ public class SmtpManager extends AbstractManager {
connect(appendEvent);
}
try {
- final LogEvent[] priorEvents = buffer.removeAll();
+ final LogEvent[] priorEvents = removeAllBufferedEvents();
// LOG4J-310: log appendEvent even if priorEvents is empty
final byte[] rawBytes = formatContentToBytes(priorEvents,
appendEvent, layout);
@@ -201,6 +196,10 @@ public class SmtpManager extends AbstractManager {
}
}
+ LogEvent[] removeAllBufferedEvents() {
+ return buffer.removeAll();
+ }
+
protected byte[] formatContentToBytes(final LogEvent[] priorEvents, final
LogEvent appendEvent,
final Layout<?> layout) throws
IOException {
final ByteArrayOutputStream raw = new ByteArrayOutputStream();
diff --git
a/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpManagerTest.java
b/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpManagerTest.java
index 6d8e037..71247ce 100644
---
a/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpManagerTest.java
+++
b/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpManagerTest.java
@@ -1,7 +1,17 @@
package org.apache.logging.log4j.smtp.appender;
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.async.RingBufferLogEvent;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
+import org.apache.logging.log4j.core.impl.MementoMessage;
+import org.apache.logging.log4j.core.impl.MutableLogEvent;
+import org.apache.logging.log4j.message.ReusableMessage;
+import org.apache.logging.log4j.message.ReusableSimpleMessage;
import org.junit.jupiter.api.Test;
/**
@@ -16,4 +26,42 @@ class SmtpManagerTest {
assertEquals("SMTP:to:cc::from::LOG4J2-3107:proto:smtp.log4j.com:4711:username::filter",
managerName);
}
+ private void testAdd(LogEvent event) {
+ SmtpManager smtpManager = SmtpManager.getSmtpManager(null, "to", "cc",
"bcc", "from", "replyTo", "subject", "protocol", "host", 0, "username",
"password", false, "filterName", 10, null);
+ smtpManager.removeAllBufferedEvents(); // in case this smtpManager is
reused
+ smtpManager.add(event);
+
+ LogEvent[] bufferedEvents = smtpManager.removeAllBufferedEvents();
+ assertThat("unexpected number of buffered events",
bufferedEvents.length, is(1));
+ assertThat("expected the immutable version of the event to be
buffered", bufferedEvents[0].getMessage(),
is(instanceOf(MementoMessage.class)));
+ }
+
+ // LOG4J2-3172: make sure existing protections are not violated
+ @Test
+ void testAdd_WhereLog4jLogEventWithReusableMessage() {
+ LogEvent event = new
Log4jLogEvent.Builder().setMessage(getReusableMessage("test message")).build();
+ testAdd(event);
+ }
+
+ // LOG4J2-3172: make sure existing protections are not violated
+ @Test
+ void testAdd_WhereMutableLogEvent() {
+ MutableLogEvent event = new MutableLogEvent(new StringBuilder("test
message"), null);
+ testAdd(event);
+ }
+
+ // LOG4J2-3172
+ @Test
+ void testAdd_WhereRingBufferLogEvent() {
+ RingBufferLogEvent event = new RingBufferLogEvent();
+ event.setValues(null, null, null, null, null, getReusableMessage("test
message"), null, null, null, 0, null, 0, null, ClockFactory.getClock(), new
DummyNanoClock());
+ testAdd(event);
+ }
+
+ private ReusableMessage getReusableMessage(String text) {
+ ReusableSimpleMessage message = new ReusableSimpleMessage();
+ message.set(text);
+ return message;
+ }
+
}
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 09d6052..a3189f5 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -237,6 +237,9 @@
based on performance improvements in modern Java releases.
</action>
<!-- FIXES -->
+ <action issue="LOG4J2-3172" dev="vy" type="fix" due-to="Barry Fleming">
+ Buffer immutable log events in the SmtpManager.
+ </action>
<action issue="LOG4J2-3175" dev="vy" type="fix" due-to="wuqian0808">
Avoid KafkaManager override when topics differ.
</action>