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

logging-log4j2 git commit: [LOG4J2-969] Refactor SyslogAppender so that Layout is a Plugin element.

Repository: logging-log4j2
Updated Branches:
  refs/heads/master f95c7eb91 -> 19d775868


[LOG4J2-969] Refactor SyslogAppender so that Layout is a Plugin element.

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

Branch: refs/heads/master
Commit: 19d7758689961cf8134879f75d897fd006930efd
Parents: f95c7eb
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Dec 12 19:03:14 2016 -0800
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Dec 12 19:03:14 2016 -0800

----------------------------------------------------------------------
 .../log4j/core/appender/SyslogAppender.java     | 17 +++---
 .../log4j/core/layout/Rfc5424Layout.java        |  4 ++
 .../logging/log4j/core/layout/SyslogLayout.java | 10 ++++
 .../log4j/core/appender/SyslogAppenderTest.java | 22 ++++---
 .../core/appender/SyslogAppenderTestBase.java   | 63 +++++++++++++++-----
 .../core/appender/TlsSyslogAppenderTest.java    | 10 ++--
 src/changes/changes.xml                         |  3 +
 src/site/xdoc/manual/appenders.xml              |  5 ++
 8 files changed, 98 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/19d77586/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
index 63e9483..bdfa41d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
@@ -103,18 +103,21 @@ public class SyslogAppender extends SocketAppender {
         @PluginElement("LoggerFields")
         private LoggerFields[] loggerFields;
 
+        @SuppressWarnings("resource")
         @Override
         public SyslogAppender build() {
             final Protocol protocol = getProtocol();
             final SslConfiguration sslConfiguration = getSslConfiguration();
             final boolean useTlsMessageFormat = sslConfiguration != null || protocol == Protocol.SSL;
             final Configuration configuration = getConfiguration();
-            final Layout<? extends Serializable> layout = RFC5424.equalsIgnoreCase(format)
-                    ? Rfc5424Layout.createLayout(facility, id, enterpriseNumber, includeMdc, mdcId, mdcPrefix,
-                            eventPrefix, newLine, escapeNL, appName, msgId, excludes, includes, required,
-                            exceptionPattern, useTlsMessageFormat, loggerFields, configuration)
-                    :
-                    // @formatter:off
+            Layout<? extends Serializable> layout = getLayout();
+            if (layout == null) {
+                layout = RFC5424.equalsIgnoreCase(format)
+                        ? Rfc5424Layout.createLayout(facility, id, enterpriseNumber, includeMdc, mdcId, mdcPrefix,
+                                eventPrefix, newLine, escapeNL, appName, msgId, excludes, includes, required,
+                                exceptionPattern, useTlsMessageFormat, loggerFields, configuration)
+                        :
+                        // @formatter:off
                         SyslogLayout.newBuilder()
                             .setFacility(facility)
                             .setIncludeNewLine(newLine)
@@ -122,7 +125,7 @@ public class SyslogAppender extends SocketAppender {
                             .setCharset(charsetName)
                             .build();
                         // @formatter:off
-
+            }
             final String name = getName();
             if (name == null) {
                 LOGGER.error("No name provided for SyslogAppender");

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/19d77586/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
index b5c57a1..3e8b7ab 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
@@ -719,4 +719,8 @@ public final class Rfc5424Layout extends AbstractStringLayout {
             return this.fields;
         }
     }
+
+    public Facility getFacility() {
+        return facility;
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/19d77586/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java
index 0b47364..96c0ae5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java
@@ -199,6 +199,7 @@ public final class SyslogLayout extends AbstractStringLayout {
 
     /**
      * Creates a SyslogLayout.
+     * 
      * @param facility The Facility is used to try to classify the message.
      * @param includeNewLine If true a newline will be appended to the result.
      * @param escapeNL Pattern to use for replacing newlines.
@@ -214,4 +215,13 @@ public final class SyslogLayout extends AbstractStringLayout {
             @PluginAttribute(value = "charset", defaultString = "UTF-8") final Charset charset) {
         return new SyslogLayout(facility, includeNewLine, escapeNL, charset);
     }
+
+    /**
+     * Gets the facility.
+     * 
+     * @return the facility
+     */
+    public Facility getFacility() {
+        return facility;
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/19d77586/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
index 79213b3..741a51f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.core.appender;
 import java.io.IOException;
 import java.net.SocketException;
 
+import org.apache.logging.log4j.core.appender.SyslogAppender.Builder;
 import org.apache.logging.log4j.core.net.Protocol;
 import org.apache.logging.log4j.core.net.mock.MockSyslogServerFactory;
 import org.apache.logging.log4j.util.EnglishEnums;
@@ -52,16 +53,16 @@ public class SyslogAppenderTest extends SyslogAppenderTestBase {
     public void testTCPAppender() throws Exception {
         initTCPTestEnvironment(null);
 
-        sendAndCheckLegacyBSDMessage("This is a test message");
-        sendAndCheckLegacyBSDMessage("This is a test message 2");
+        sendAndCheckLegacyBsdMessage("This is a test message");
+        sendAndCheckLegacyBsdMessage("This is a test message 2");
     }
 
     @Test
     public void testDefaultAppender() throws Exception {
         initTCPTestEnvironment(null);
 
-        sendAndCheckLegacyBSDMessage("This is a test message");
-        sendAndCheckLegacyBSDMessage("This is a test message 2");
+        sendAndCheckLegacyBsdMessage("This is a test message");
+        sendAndCheckLegacyBsdMessage("This is a test message 2");
     }
 
     @Test
@@ -75,7 +76,7 @@ public class SyslogAppenderTest extends SyslogAppenderTestBase {
     public void testUDPAppender() throws Exception {
         initUDPTestEnvironment("bsd");
 
-        sendAndCheckLegacyBSDMessage("This is a test message");
+        sendAndCheckLegacyBsdMessage("This is a test message");
         root.removeAppender(appender);
         appender.stop();
     }
@@ -103,12 +104,16 @@ public class SyslogAppenderTest extends SyslogAppenderTestBase {
 
     protected void initAppender(final String transportFormat, final String messageFormat) {
         appender = createAppender(transportFormat, messageFormat);
+        validate(appender);
         appender.start();
         initRootLogger(appender);
     }
 
-    private SyslogAppender createAppender(final String protocol, final String format) {
-        final boolean newLine = includeNewLine;
+    protected SyslogAppender createAppender(final String protocol, final String format) {
+        return newSyslogAppenderBuilder(protocol, format, includeNewLine).build();
+    }
+
+    protected Builder newSyslogAppenderBuilder(final String protocol, final String format, final boolean newLine) {
         // @formatter:off
         return SyslogAppender.newSyslogAppenderBuilder()
                 .withPort(PORTNUM)
@@ -122,8 +127,7 @@ public class SyslogAppenderTest extends SyslogAppenderTestBase {
                 .setNewLine(newLine)
                 .setAppName("TestApp")
                 .setMsgId("Test")
-                .setFormat(format)
-                .build();
+                .setFormat(format);
         // @formatter:on
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/19d77586/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTestBase.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTestBase.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTestBase.java
index 11a8275..17ffbe4 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTestBase.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTestBase.java
@@ -16,6 +16,7 @@
  */
 package org.apache.logging.log4j.core.appender;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -25,16 +26,22 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.MarkerManager;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.layout.Rfc5424Layout;
+import org.apache.logging.log4j.core.layout.SyslogLayout;
+import org.apache.logging.log4j.core.net.Facility;
+import org.apache.logging.log4j.core.net.Priority;
 import org.apache.logging.log4j.core.net.mock.MockSyslogServer;
 import org.apache.logging.log4j.message.StructuredDataMessage;
 import org.apache.logging.log4j.util.Strings;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 
 import static org.junit.Assert.*;
 
-public class SyslogAppenderTestBase {
+public abstract class SyslogAppenderTestBase {
     protected static final String line1 =
             "TestApp - Audit [Transfer@18060 Amount=\"200.00\" FromAccount=\"123457\" ToAccount=\"123456\"]" +
                     "[RequestContext@18060 ipAddress=\"192.168.0.120\" loginId=\"JohnDoe\"] Transfer Complete";
@@ -52,40 +59,40 @@ public class SyslogAppenderTestBase {
         LoggerContext.getContext().reconfigure();
     }
 
-    protected void sendAndCheckLegacyBSDMessages(final List<String> messagesToSend) throws InterruptedException {
+    protected void sendAndCheckLegacyBsdMessages(final List<String> messagesToSend) throws InterruptedException {
         for (final String message : messagesToSend) {
-            sendLegacyBSDMessage(message);
+            sendDebugLegacyBsdMessage(message);
         }
         checkTheNumberOfSentAndReceivedMessages();
-        checkTheEqualityOfSentAndReceivedMessages();
+        checkTheEqualityOfSentAndReceivedMessages(Level.DEBUG);
     }
 
-    protected void sendAndCheckLegacyBSDMessage(final String message) throws InterruptedException {
-        sendLegacyBSDMessage(message);
+    protected void sendAndCheckLegacyBsdMessage(final String message) throws InterruptedException {
+        sendDebugLegacyBsdMessage(message);
         checkTheNumberOfSentAndReceivedMessages();
-        checkTheEqualityOfSentAndReceivedMessages();
+        checkTheEqualityOfSentAndReceivedMessages(Level.DEBUG);
     }
 
-    protected void sendLegacyBSDMessage(final String message) {
+    protected void sendDebugLegacyBsdMessage(final String message) {
         sentMessages.add(message);
         root.debug(message);
     }
 
     protected void sendAndCheckStructuredMessages(final int numberOfMessages) throws InterruptedException {
         for (int i = 0; i < numberOfMessages; i++) {
-            sendStructuredMessage();
+            sendInfoStructuredMessage();
         }
         checkTheNumberOfSentAndReceivedMessages();
-        checkTheEqualityOfSentAndReceivedMessages();
+        checkTheEqualityOfSentAndReceivedMessages(Level.INFO);
     }
 
     protected void sendAndCheckStructuredMessage() throws InterruptedException {
-        sendStructuredMessage();
+        sendInfoStructuredMessage();
         checkTheNumberOfSentAndReceivedMessages();
-        checkTheEqualityOfSentAndReceivedMessages();
+        checkTheEqualityOfSentAndReceivedMessages(Level.INFO);
     }
 
-    protected void sendStructuredMessage() {
+    protected void sendInfoStructuredMessage() {
         ThreadContext.put("loginId", "JohnDoe");
         ThreadContext.put("ipAddress", "192.168.0.120");
         ThreadContext.put("locale", Locale.US.getDisplayName());
@@ -104,16 +111,19 @@ public class SyslogAppenderTestBase {
                 sentMessages.size(), getReceivedMessages(DEFAULT_TIMEOUT_IN_MS).size());
     }
 
-    protected void checkTheEqualityOfSentAndReceivedMessages() throws InterruptedException {
+    protected void checkTheEqualityOfSentAndReceivedMessages(Level expectedLevel) throws InterruptedException {
         final List<String> receivedMessages = getReceivedMessages(DEFAULT_TIMEOUT_IN_MS);
 
         assertNotNull("No messages received", receivedMessages);
         for (int i = 0; i < receivedMessages.size(); i++) {
             final String receivedMessage = receivedMessages.get(i);
             final String sentMessage = sentMessages.get(i);
-            final String suffix =  includeNewLine ? "\n" : Strings.EMPTY;
+            final String suffix = includeNewLine ? "\n" : Strings.EMPTY;
             assertTrue("Incorrect message received: " + receivedMessage,
                     receivedMessage.endsWith(sentMessage + suffix) || receivedMessage.contains(sentMessage));
+            final int expectedPriority = Priority.getPriority(getExpectedFacility(), expectedLevel);
+            assertTrue("Expected facility " + expectedPriority + " in message " + receivedMessage,
+                    receivedMessage.startsWith("<" + expectedPriority + ">"));
         }
     }
 
@@ -138,4 +148,27 @@ public class SyslogAppenderTestBase {
         }
         return syslogServer.getMessageList();
     }
+
+    protected Facility getExpectedFacility() {
+        return Facility.LOCAL0;
+    }
+
+    protected void validate(SyslogAppender syslogAppender) {
+        final Layout<? extends Serializable> layout = syslogAppender.getLayout();
+        if (layout instanceof SyslogLayout) {
+            validate((SyslogLayout) layout);
+        } else if (layout instanceof Rfc5424Layout) {
+            validate((Rfc5424Layout) layout);
+        } else {
+            Assert.fail("Unexpected layout: " + layout);
+        }
+    }
+
+    protected void validate(Rfc5424Layout layout) {
+        Assert.assertEquals(getExpectedFacility(), layout.getFacility());
+    }
+
+    protected void validate(SyslogLayout layout) {
+        Assert.assertEquals(getExpectedFacility(), layout.getFacility());
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/19d77586/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
index 4e4eb43..e025fd8 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
@@ -52,16 +52,15 @@ public class TlsSyslogAppenderTest extends SyslogAppenderTest {
         final char[] msg = new char[2 * 1024 * 2014 + prefix.length()];
         Arrays.fill(msg, 'a');
         System.arraycopy(prefix.toCharArray(), 0, msg, 0, prefix.length());
-        sendAndCheckLegacyBSDMessage(new String(msg));
+        sendAndCheckLegacyBsdMessage(new String(msg));
     }
 
     @Test
     public void sendLegacyBsdMessagesOverTls() throws IOException, InterruptedException {
         final int numberOfMessages = 100;
-        initTlsTestEnvironment(100, TlsSyslogMessageFormat.LEGACY_BSD);
-
-        final List<String> sentMessages = TlsSyslogTestUtil.generateMessages(numberOfMessages, TlsSyslogMessageFormat.LEGACY_BSD);
-        sendAndCheckLegacyBSDMessages(sentMessages);
+        initTlsTestEnvironment(numberOfMessages, TlsSyslogMessageFormat.LEGACY_BSD);
+        final List<String> generatedMessages = TlsSyslogTestUtil.generateMessages(numberOfMessages, TlsSyslogMessageFormat.LEGACY_BSD);
+        sendAndCheckLegacyBsdMessages(generatedMessages);
     }
 
     @Test
@@ -110,6 +109,7 @@ public class TlsSyslogAppenderTest extends SyslogAppenderTest {
 
     protected void initAppender() {
         appender = createAppender();
+        validate(appender);
         appender.start();
         initRootLogger(appender);
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/19d77586/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 05eb33c..b2a3f94 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -189,6 +189,9 @@
       <action issue="LOG4J2-1700" dev="ggregory" type="update">
         Update Jansi from 1.13 to 1.14.
       </action>
+      <action issue="LOG4J2-969" dev="ggregory" type="add">
+        Refactor SyslogAppender so that Layout is a Plugin element.
+      </action>
       <action issue="LOG4J2-1660" dev="rpopma" type="add">
         Added public method ThreadContext::getThreadContextMap; removed class ThreadContextAccess.
       </action>

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/19d77586/src/site/xdoc/manual/appenders.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/appenders.xml b/src/site/xdoc/manual/appenders.xml
index 54c554c..41d798e 100644
--- a/src/site/xdoc/manual/appenders.xml
+++ b/src/site/xdoc/manual/appenders.xml
@@ -3935,6 +3935,11 @@ public class JpaLogEntity extends AbstractLogEventWrapperEntity {
                 Defaults to true.</td>
             </tr>
             <tr>
+              <td>Layout</td>
+              <td>Layout</td>
+              <td>A custom layout which overrides the <code>format</code> setting.</td>
+            </tr>
+            <tr>
               <td>loggerFields</td>
               <td>List of KeyValuePairs</td>
               <td>Allows arbitrary PatternLayout patterns to be included as specified ThreadContext fields; no default