You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2016/01/12 17:50:50 UTC

[42/50] logging-log4j2 git commit: [LOG4J2-1192] Dynamic Subject for SMTP Appender.

[LOG4J2-1192] Dynamic Subject for SMTP Appender.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/711278b4
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/711278b4
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/711278b4

Branch: refs/heads/LOG4J-1181
Commit: 711278b4460fb68f192c2ee562b6b238f4c131a1
Parents: 5656ffd
Author: ggregory <gg...@apache.org>
Authored: Mon Jan 4 15:12:00 2016 -0800
Committer: ggregory <gg...@apache.org>
Committed: Mon Jan 4 15:12:00 2016 -0800

----------------------------------------------------------------------
 .../log4j/core/appender/SmtpAppender.java       |  7 ++-
 .../log4j/core/layout/PatternLayout.java        | 29 +++++++++++-
 .../logging/log4j/core/net/SmtpManager.java     | 49 +++++++++++---------
 .../log4j/core/appender/SmtpAppenderTest.java   | 17 ++++---
 src/changes/changes.xml                         |  3 ++
 5 files changed, 72 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/711278b4/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
index 10668af..28edd24 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
@@ -22,8 +22,11 @@ import java.io.Serializable;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.filter.ThresholdFilter;
@@ -105,6 +108,7 @@ public final class SmtpAppender extends AbstractAppender {
      */
     @PluginFactory
     public static SmtpAppender createAppender(
+            @PluginConfiguration final Configuration config,
             @PluginAttribute("name") final String name,
             @PluginAttribute("to") final String to,
             @PluginAttribute("cc") final String cc,
@@ -138,8 +142,9 @@ public final class SmtpAppender extends AbstractAppender {
         if (filter == null) {
             filter = ThresholdFilter.createFilter(null, null, null);
         }
+        final Configuration configuration = config != null ? config : new DefaultConfiguration();
 
-        final SmtpManager manager = SmtpManager.getSMTPManager(to, cc, bcc, from, replyTo, subject, smtpProtocol,
+        final SmtpManager manager = SmtpManager.getSmtpManager(configuration, to, cc, bcc, from, replyTo, subject, smtpProtocol,
             smtpHost, smtpPort, smtpUsername, smtpPassword, isSmtpDebug, filter.toString(),  bufferSize);
         if (manager == null) {
             return null;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/711278b4/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index 4f9244d..0503fc8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j.core.layout;
 
 import java.nio.charset.Charset;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -127,7 +128,7 @@ public final class PatternLayout extends AbstractStringLayout {
                 alwaysWriteExceptions, noConsoleNoAnsi);
     }
 
-    private Serializer createSerializer(final Configuration configuration, final RegexReplacement replace,
+    public static Serializer createSerializer(final Configuration configuration, final RegexReplacement replace,
             final String pattern, final String defaultPattern, final PatternSelector patternSelector,
             final boolean alwaysWriteExceptions, final boolean noConsoleNoAnsi) {
         if (Strings.isEmpty(pattern) && Strings.isEmpty(defaultPattern)) {
@@ -278,7 +279,7 @@ public final class PatternLayout extends AbstractStringLayout {
             .build();
     }
 
-    private interface Serializer {
+    public interface Serializer {
         
         String toSerializable(final LogEvent event);        
     }
@@ -307,6 +308,18 @@ public final class PatternLayout extends AbstractStringLayout {
             }
             return str;
         }
+
+        @Override
+        public String toString() {
+            StringBuilder builder = new StringBuilder();
+            builder.append(super.toString());
+            builder.append("[formatters=");
+            builder.append(Arrays.toString(formatters));
+            builder.append(", replace=");
+            builder.append(replace);
+            builder.append("]");
+            return builder.toString();
+        }
     }
 
     private static class PatternSelectorSerializer implements Serializer {
@@ -334,6 +347,18 @@ public final class PatternLayout extends AbstractStringLayout {
             }
             return str;
         }
+
+        @Override
+        public String toString() {
+            StringBuilder builder = new StringBuilder();
+            builder.append(super.toString());
+            builder.append("[patternSelector=");
+            builder.append(patternSelector);
+            builder.append(", replace=");
+            builder.append(replace);
+            builder.append("]");
+            return builder.toString();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/711278b4/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
index 7727457..67f0932 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
@@ -41,6 +41,11 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractManager;
 import org.apache.logging.log4j.core.appender.ManagerFactory;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.DefaultConfiguration;
+import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
+import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.core.layout.PatternLayout.Serializer;
 import org.apache.logging.log4j.core.util.CyclicBuffer;
 import org.apache.logging.log4j.core.util.NameUtil;
 import org.apache.logging.log4j.core.util.NetUtils;
@@ -54,13 +59,21 @@ public class SmtpManager extends AbstractManager {
     private static final SMTPManagerFactory FACTORY = new SMTPManagerFactory();
 
     private final Session session;
-
+    
     private final CyclicBuffer<LogEvent> buffer;
 
     private volatile MimeMessage message;
 
     private final FactoryData data;
 
+    private static MimeMessage createMimeMessage(final FactoryData data, final Session session, LogEvent appendEvent)
+            throws MessagingException {
+        return new MimeMessageBuilder(session).setFrom(data.from).setReplyTo(data.replyto)
+                .setRecipients(Message.RecipientType.TO, data.to).setRecipients(Message.RecipientType.CC, data.cc)
+                .setRecipients(Message.RecipientType.BCC, data.bcc).setSubject(data.subject.toSerializable(appendEvent))
+                .getMimeMessage();
+    }
+
     protected SmtpManager(final String name, final Session session, final MimeMessage message,
                           final FactoryData data) {
         super(name);
@@ -74,7 +87,9 @@ public class SmtpManager extends AbstractManager {
         buffer.add(event);
     }
 
-    public static SmtpManager getSMTPManager(final String to, final String cc, final String bcc,
+    public static SmtpManager getSmtpManager(
+                                             final Configuration config,
+                                             final String to, final String cc, final String bcc,
                                              final String from, final String replyTo,
                                              final String subject, String protocol, final String host,
                                              final int port, final String username, final String password,
@@ -120,8 +135,9 @@ public class SmtpManager extends AbstractManager {
         sb.append(filterName);
 
         final String name = "SMTP:" + NameUtil.md5(sb.toString());
+        final Serializer subjectSerializer = PatternLayout.createSerializer(config, null, subject, null, null, false, false);
 
-        return getManager(name, FACTORY, new FactoryData(to, cc, bcc, from, replyTo, subject,
+        return getManager(name, FACTORY, new FactoryData(to, cc, bcc, from, replyTo, subjectSerializer,
             protocol, host, port, username, password, isDebug, numElements));
     }
 
@@ -132,7 +148,7 @@ public class SmtpManager extends AbstractManager {
      */
     public void sendEvents(final Layout<?> layout, final LogEvent appendEvent) {
         if (message == null) {
-            connect();
+            connect(appendEvent);
         }
         try {
             final LogEvent[] priorEvents = buffer.removeAll();
@@ -251,7 +267,7 @@ public class SmtpManager extends AbstractManager {
         private final String bcc;
         private final String from;
         private final String replyto;
-        private final String subject;
+        private final Serializer subject;
         private final String protocol;
         private final String host;
         private final int port;
@@ -261,14 +277,14 @@ public class SmtpManager extends AbstractManager {
         private final int numElements;
 
         public FactoryData(final String to, final String cc, final String bcc, final String from, final String replyTo,
-                           final String subject, final String protocol, final String host, final int port,
+                           final Serializer subjectSerializer, final String protocol, final String host, final int port,
                            final String username, final String password, final boolean isDebug, final int numElements) {
             this.to = to;
             this.cc = cc;
             this.bcc = bcc;
             this.from = from;
             this.replyto = replyTo;
-            this.subject = subject;
+            this.subject = subjectSerializer;
             this.protocol = protocol;
             this.host = host;
             this.port = port;
@@ -279,14 +295,12 @@ public class SmtpManager extends AbstractManager {
         }
     }
 
-    private synchronized void connect() {
+    private synchronized void connect(LogEvent appendEvent) {
         if (message != null) {
             return;
         }
         try {
-            message = new MimeMessageBuilder(session).setFrom(data.from).setReplyTo(data.replyto)
-                .setRecipients(Message.RecipientType.TO, data.to).setRecipients(Message.RecipientType.CC, data.cc)
-                .setRecipients(Message.RecipientType.BCC, data.bcc).setSubject(data.subject).getMimeMessage();
+            message = createMimeMessage(data, session, appendEvent);
         } catch (final MessagingException e) {
             logError("Could not set SmtpAppender message options", e);
             message = null;
@@ -324,18 +338,7 @@ public class SmtpManager extends AbstractManager {
             final Session session = Session.getInstance(properties, authenticator);
             session.setProtocolForAddress("rfc822", data.protocol);
             session.setDebug(data.isDebug);
-            MimeMessage message;
-
-            try {
-                message = new MimeMessageBuilder(session).setFrom(data.from).setReplyTo(data.replyto)
-                    .setRecipients(Message.RecipientType.TO, data.to).setRecipients(Message.RecipientType.CC, data.cc)
-                    .setRecipients(Message.RecipientType.BCC, data.bcc).setSubject(data.subject).getMimeMessage();
-            } catch (final MessagingException e) {
-                LOGGER.error("Could not set SmtpAppender message options.", e);
-                message = null;
-            }
-
-            return new SmtpManager(name, session, message, data);
+            return new SmtpManager(name, session, null, data);
         }
 
         private Authenticator buildAuthenticator(final String username, final String password) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/711278b4/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java
index f433a40..b0577ee 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java
@@ -26,6 +26,7 @@ import javax.mail.internet.InternetAddress;
 import org.apache.logging.dumbster.smtp.SimpleSmtpServer;
 import org.apache.logging.dumbster.smtp.SmtpMessage;
 import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.net.MimeMessageBuilder;
@@ -130,10 +131,12 @@ public class SmtpAppenderTest {
 
     @Test
     public void testDelivery() {
-        final SmtpAppender appender = SmtpAppender.createAppender("Test",
-                "to@example.com", "cc@example.com", "bcc@example.com",
-                "from@example.com", "replyTo@example.com", "Subject", null,
-                HOST, PORT, null, null, "false", "3", null, null, "true");
+        final String subjectKey = getClass().getName();
+        final String subjectValue = "SubjectValue1";
+        ThreadContext.put(subjectKey, subjectValue);
+        final SmtpAppender appender = SmtpAppender.createAppender(null, "Test", "to@example.com", "cc@example.com",
+                "bcc@example.com", "from@example.com", "replyTo@example.com", "Subject Pattern %X{" + subjectKey + "}",
+                null, HOST, PORT, null, null, "false", "3", null, null, "true");
         appender.start();
 
         final LoggerContext context = LoggerContext.getContext();
@@ -148,8 +151,7 @@ public class SmtpAppenderTest {
         root.debug("Debug message #2");
         root.debug("Debug message #3");
         root.debug("Debug message #4");
-        root.error("Error with exception", new RuntimeException(
-                "Exception message"));
+        root.error("Error with exception", new RuntimeException("Exception message"));
         root.error("Error message #2");
 
         server.stop();
@@ -163,7 +165,8 @@ public class SmtpAppenderTest {
         // can't be tested with Dumpster 1.6
         assertEquals("from@example.com", email.getHeaderValue("From"));
         assertEquals("replyTo@example.com", email.getHeaderValue("Reply-To"));
-        assertEquals("Subject", email.getHeaderValue("Subject"));
+        final String headerValue = email.getHeaderValue("Subject");
+        assertEquals(headerValue, "Subject Pattern " + subjectValue);
 
         final String body = email.getBody();
         assertFalse(body.contains("Debug message #1"));

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/711278b4/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 6c36be1..0664458 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -31,6 +31,9 @@
       <action issue="LOG4J2-1237" dev="ggregory" type="add" due-to="Mike Calmus, Gary Gregory">
         Make PatternLayout header and footer accept a pattern. 
       </action>
+      <action issue="LOG4J2-1192" dev="ggregory" type="add" due-to="Jörg Bretschneider, Gary Gregory">
+        Dynamic Subject for SMTP Appender.
+      </action>
       <action issue="LOG4J2-908" dev="ggregory" type="fix" due-to="Konstantinos Liakos, Patrick Flaherty, Robin Coe, Gary Gregory">
         JSONLayout doesn't add a comma between log events.
       </action>