Repository: logging-log4j2 Updated Branches: refs/heads/master 5656ffdd4 -> 711278b44
[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/master Commit: 711278b4460fb68f192c2ee562b6b238f4c131a1 Parents: 5656ffd Author: ggregory <[email protected]> Authored: Mon Jan 4 15:12:00 2016 -0800 Committer: ggregory <[email protected]> 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", - "[email protected]", "[email protected]", "[email protected]", - "[email protected]", "[email protected]", "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", "[email protected]", "[email protected]", + "[email protected]", "[email protected]", "[email protected]", "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("[email protected]", email.getHeaderValue("From")); assertEquals("[email protected]", 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>
