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>

Reply via email to