Index: flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
===================================================================
--- flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java	(revision 1490391)
+++ flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java	(working copy)
@@ -77,7 +77,6 @@
      * Publish the event.
      * @param event The LogEvent.
      */
-    @Override
     public void append(final LogEvent event) {
 
         final FlumeEvent flumeEvent = factory.createEvent(event, mdcIncludes, mdcExcludes, mdcRequired, mdcPrefix,
@@ -103,7 +102,6 @@
      * @param compress If true the body will be compressed.
      * @return A Flume Event.
      */
-    @Override
     public FlumeEvent createEvent(final LogEvent event, final String includes, final String excludes,
                                   final String required, final String mdcPrefix, final String eventPrefix,
                                   final boolean compress) {
@@ -198,7 +196,7 @@
         if (layout == null) {
             @SuppressWarnings({"unchecked", "UnnecessaryLocalVariable"})
             Layout<S> l = (Layout<S>)RFC5424Layout.createLayout(null, null, null, "True", null, mdcPrefix, eventPrefix,
-                    null, null, null, excludes, includes, required, null, null, null);
+                    null, null, null, excludes, includes, required, null, null, null, null);
             layout = l;
         }
 
Index: src/site/xdoc/manual/appenders.xml
===================================================================
--- src/site/xdoc/manual/appenders.xml	(revision 1490391)
+++ src/site/xdoc/manual/appenders.xml	(working copy)
@@ -2843,6 +2843,15 @@
               <td>The default is true, causing exceptions to be internally logged and then ignored. When set to
                 false exceptions will be percolated to the caller.</td>
             </tr>
+            <tr>
+              <td>loggerFields</td>
+              <td>List of KeyValuePairs</td>
+              <td>Allows arbitrary PatternLayout patterns to be included as specified MDC fields; no default
+                specified. To use, include a &gt;LoggerFields&lt; nested element, containing one or more
+                &gt;KeyValuePair&lt; elements. Each &gt;KeyValuePair&lt; must have a key attribute, which
+                specifies the RFC-5424 SD-ID which will be used to identify the field, and a value attribute,
+                whcih specifies the PatternLayout pattern to use as the value.</td>
+            </tr>
             <caption align="top">SyslogAppender Parameters</caption>
           </table>
           <p>
Index: core/src/test/java/org/apache/logging/log4j/core/layout/RFC5424LayoutTest.java
===================================================================
--- core/src/test/java/org/apache/logging/log4j/core/layout/RFC5424LayoutTest.java	(revision 1490391)
+++ core/src/test/java/org/apache/logging/log4j/core/layout/RFC5424LayoutTest.java	(working copy)
@@ -27,6 +27,7 @@
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.test.appender.ListAppender;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.helpers.KeyValuePair;
 import org.apache.logging.log4j.message.StructuredDataMessage;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -81,7 +82,7 @@
         }
         // set up appender
         final AbstractStringLayout layout = RFC5424Layout.createLayout("Local0", "Event", "3692", "true", "RequestContext",
-            null, null, "true", null, "ATM", null, "key1, key2, locale", null, "loginId", null, null);
+            null, null, "true", null, "ATM", null, "key1, key2, locale", null, "loginId", null, null, null);
         final ListAppender<String> appender = new ListAppender<String>("List", null, layout, true, false);
 
         appender.start();
@@ -143,9 +144,9 @@
         for (final Appender appender : root.getAppenders().values()) {
             root.removeAppender(appender);
         }
-        // set up appender
+        // set up layout/appender
         final AbstractStringLayout layout = RFC5424Layout.createLayout("Local0", "Event", "3692", "true", "RequestContext",
-            null, null, "true", "#012", "ATM", null, "key1, key2, locale", null, "loginId", null, null);
+            null, null, "true", "#012", "ATM", null, "key1, key2, locale", null, "loginId", null, null, null);
         final ListAppender<String> appender = new ListAppender<String>("List", null, layout, true, false);
 
         appender.start();
@@ -199,16 +200,16 @@
     }
 
     /**
-     * Test case for MDC conversion pattern.
+     * Test case for MDC exception conversion pattern.
      */
     @Test
     public void testException() throws Exception {
         for (final Appender appender : root.getAppenders().values()) {
             root.removeAppender(appender);
         }
-        // set up appender
+        // set up layout/appender
         final AbstractStringLayout layout = RFC5424Layout.createLayout("Local0", "Event", "3692", "true", "RequestContext",
-            null, null, "true", null, "ATM", null, "key1, key2, locale", null, "loginId", "%xEx", null);
+            null, null, "true", null, "ATM", null, "key1, key2, locale", null, "loginId", "%xEx", null, null);
         final ListAppender<String> appender = new ListAppender<String>("List", null, layout, true, false);
         appender.start();
 
@@ -236,4 +237,45 @@
             appender.stop();
         }
     }
+
+    /**
+     * Test case for MDC logger field inclusion.
+     */
+    @Test
+    public void testMDCLoggerFields() throws Exception {
+        for (final Appender appender : root.getAppenders().values()) {
+            root.removeAppender(appender);
+        }
+        
+        LoggerFields loggerFields = LoggerFields.createLoggerFields(new KeyValuePair[] {
+        		new KeyValuePair("source", "%C.%M")
+        });
+        
+        // set up layout/appender
+        final AbstractStringLayout layout = RFC5424Layout.createLayout("Local0", "Event", "3692", "true", "RequestContext",
+            null, null, "true", null, "ATM", null, "key1, key2, locale", null, null, null, loggerFields, null);
+        final ListAppender<String> appender = new ListAppender<String>("List", null, layout, true, false);
+        appender.start();
+
+        // set appender on root and set level to debug
+        root.addAppender(appender);
+        root.setLevel(Level.DEBUG);
+
+        // output starting message
+        root.info("starting logger fields test");
+
+        try {
+
+            final List<String> list = appender.getMessages();
+            assertTrue("Not enough list entries", list.size() > 0);
+            assertTrue("No class/method", list.get(0).contains("RFC5424LayoutTest.testMDCLoggerFields"));
+
+            appender.clear();
+        } finally {
+            root.removeAppender(appender);
+            ThreadContext.clear();
+
+            appender.stop();
+        }
+    }
 }
Index: core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
===================================================================
--- core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java	(revision 1490391)
+++ core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java	(working copy)
@@ -211,7 +211,7 @@
     private SyslogAppender createAppender(final String protocol, final String format) {
         return SyslogAppender.createAppender("localhost", PORT, protocol, "-1", null, "Test", "true", "false", "LOCAL0", "Audit",
             "18060", "true", "RequestContext", null, null, "true", null, "TestApp", "Test", null, "ipAddress,loginId",
-            null, format, null, null, null, null, null);
+            null, format, null, null, null, null, null, null);
     }
 
     public static class UDPSocketServer extends Thread {
Index: core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
===================================================================
--- core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java	(revision 1490391)
+++ core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java	(working copy)
@@ -24,6 +24,7 @@
 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.layout.LoggerFields;
 import org.apache.logging.log4j.core.layout.RFC5424Layout;
 import org.apache.logging.log4j.core.layout.SyslogLayout;
 import org.apache.logging.log4j.core.net.AbstractSocketManager;
@@ -32,6 +33,7 @@
 import org.apache.logging.log4j.util.EnglishEnums;
 
 import java.io.Serializable;
+import java.util.Map;
 
 /**
  * The Syslog Appender.
@@ -112,6 +114,7 @@
                                                 @PluginConfiguration final Configuration config,
                                                 @PluginAttr("charset") final String charsetName,
                                                 @PluginAttr("exceptionPattern") final String exceptionPattern,
+                                                @PluginElement("LoggerFields") LoggerFields loggerFields,
                                                 @PluginAttr("advertise") final String advertise) {
 
         final boolean isFlush = immediateFlush == null ? true : Boolean.valueOf(immediateFlush);
@@ -123,7 +126,7 @@
         @SuppressWarnings("unchecked")
         final Layout<S> layout = (Layout<S>)(RFC5424.equalsIgnoreCase(format) ?
             RFC5424Layout.createLayout(facility, id, ein, includeMDC, mdcId, mdcPrefix, eventPrefix, includeNL,
-                escapeNL, appName, msgId, excludes, includes, required, exceptionPattern, config) :
+                escapeNL, appName, msgId, excludes, includes, required, exceptionPattern, loggerFields, config) :
             SyslogLayout.createLayout(facility, includeNL, escapeNL, charsetName));
 
         if (name == null) {
Index: core/src/main/java/org/apache/logging/log4j/core/layout/LoggerFields.java
===================================================================
--- core/src/main/java/org/apache/logging/log4j/core/layout/LoggerFields.java	(revision 0)
+++ core/src/main/java/org/apache/logging/log4j/core/layout/LoggerFields.java	(revision 0)
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.core.layout;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.helpers.KeyValuePair;
+
+/**
+ * A LoggerFields container.
+ */
+@Plugin(name = "LoggerFields", category = "Core")
+public final class LoggerFields {
+
+    private Map<String, String> map;
+
+	private LoggerFields(Map<String, String> map) {
+		this.map = Collections.unmodifiableMap(map);
+    }
+	
+	public Map<String, String> getMap()
+	{
+		return map;
+	}
+
+    /**
+     * Create a LoggerFields from KeyValuePairs.
+     * @param keyValuePairs An array of KeyValuePairs.
+     * @return A LoggerFields instance containing a Map<String, String>.
+     */
+    @PluginFactory
+    public static LoggerFields createLoggerFields(
+                                             @PluginElement("LoggerFields") final KeyValuePair[] keyValuePairs) {
+        final Map<String, String> map =
+            new HashMap<String, String>();
+
+        for (final KeyValuePair keyValuePair : keyValuePairs) {
+                map.put(keyValuePair.getKey(), keyValuePair.getValue());
+        }
+
+        return new LoggerFields(map);
+    }
+}
Index: core/src/main/java/org/apache/logging/log4j/core/layout/RFC5424Layout.java
===================================================================
--- core/src/main/java/org/apache/logging/log4j/core/layout/RFC5424Layout.java	(revision 1490391)
+++ core/src/main/java/org/apache/logging/log4j/core/layout/RFC5424Layout.java	(working copy)
@@ -29,6 +29,7 @@
 import org.apache.logging.log4j.core.net.Facility;
 import org.apache.logging.log4j.core.net.Priority;
 import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
+import org.apache.logging.log4j.core.pattern.PatternConverter;
 import org.apache.logging.log4j.core.pattern.PatternFormatter;
 import org.apache.logging.log4j.core.pattern.PatternParser;
 import org.apache.logging.log4j.core.pattern.ThrowablePatternConverter;
@@ -103,16 +104,18 @@
     private long lastTimestamp = -1;
     private String timestamppStr;
 
-    private final List<PatternFormatter> formatters;
+    private final List<PatternFormatter> exceptionFormatters;
+	private final Map<String, List<PatternFormatter>> fieldFormatters; 
 
     private RFC5424Layout(final Configuration config, final Facility facility, final String id, final int ein,
                           final boolean includeMDC, final boolean includeNL, final String escapeNL, final String mdcId,
                           final String mdcPrefix, final String eventPrefix,
                           final String appName, final String messageId, final String excludes, final String includes,
-                          final String required, final Charset charset, final String exceptionPattern) {
+                          final String required, final Charset charset, final String exceptionPattern,
+                          final Map<String, String> loggerFields) {
         super(charset);
-        final PatternParser parser = createPatternParser(config);
-        formatters = exceptionPattern == null ? null : parser.parse(exceptionPattern, false);
+        final PatternParser exceptionParser = createPatternParser(config, ThrowablePatternConverter.class);
+        exceptionFormatters = exceptionPattern == null ? null : exceptionParser.parse(exceptionPattern, false);
         this.facility = facility;
         this.defaultId = id == null ? DEFAULT_ID : id;
         this.enterpriseNumber = ein;
@@ -171,6 +174,18 @@
         this.checker = c != null ? c : noopChecker;
         final String name = config == null ? null : config.getName();
         configName = name != null && name.length() > 0 ? name : null;
+        if(loggerFields != null && !loggerFields.isEmpty()) {
+            final PatternParser fieldParser = createPatternParser(config, null);
+
+        	Map<String, List<PatternFormatter>> map = new HashMap<String, List<PatternFormatter>>();
+        	for(Map.Entry<String, String> entry : loggerFields.entrySet()) {
+        		List<PatternFormatter> formatters = fieldParser.parse(entry.getValue(), false);
+        		map.put(entry.getKey(), formatters);
+        	}
+        	this.fieldFormatters = map;
+        } else {
+        	this.fieldFormatters = null;
+        }
     }
 
     /**
@@ -178,10 +193,10 @@
      * @param config The Configuration.
      * @return The PatternParser.
      */
-    public static PatternParser createPatternParser(final Configuration config) {
+    public static PatternParser createPatternParser(final Configuration config, final Class<? extends PatternConverter> filterClass) {
         if (config == null) {
             return new PatternParser(config, PatternLayout.KEY, LogEventPatternConverter.class,
-                ThrowablePatternConverter.class);
+            		filterClass);
         }
         PatternParser parser = (PatternParser) config.getComponent(COMPONENT_KEY);
         if (parser == null) {
@@ -265,6 +280,16 @@
                 final int ein = id == null || id.getEnterpriseNumber() < 0 ?
                     enterpriseNumber : id.getEnterpriseNumber();
                 final StructuredDataId mdcSDID = new StructuredDataId(mdcId, ein, null, null);
+                if(fieldFormatters != null) {
+                	map = new HashMap<String, String>(map);
+                    for (final Map.Entry<String, List<PatternFormatter>> entry : fieldFormatters.entrySet()) {
+                        final StringBuilder value = new StringBuilder();
+                        for (final PatternFormatter formatter : entry.getValue()) {
+                            formatter.format(event, value);
+                        }
+                        map.put(entry.getKey(), value.toString());
+                    }
+                }
                 formatStructuredElement(mdcSDID, mdcPrefix, map, buf, checker);
             }
             if (text != null && text.length() > 0) {
@@ -274,9 +299,9 @@
             buf.append("- ");
             buf.append(escapeNewlines(msg.getFormattedMessage(), escapeNewLine));
         }
-        if (formatters != null && event.getThrown() != null) {
+        if (exceptionFormatters != null && event.getThrown() != null) {
             final StringBuilder exception = new StringBuilder("\n");
-            for (final PatternFormatter formatter : formatters) {
+            for (final PatternFormatter formatter : exceptionFormatters) {
                 formatter.format(event, exception);
             }
             buf.append(escapeNewlines(exception.toString(), escapeNewLine));
@@ -517,6 +542,7 @@
                                              @PluginAttr("mdcIncludes") String includes,
                                              @PluginAttr("mdcRequired") final String required,
                                              @PluginAttr("exceptionPattern") final String exceptionPattern,
+                                             @PluginAttr("loggerFields") final LoggerFields loggerFields,
                                              @PluginConfiguration final Configuration config) {
         final Charset charset = Charsets.UTF_8;
         if (includes != null && excludes != null) {
@@ -527,11 +553,13 @@
         final int enterpriseNumber = ein == null ? DEFAULT_ENTERPRISE_NUMBER : Integer.parseInt(ein);
         final boolean isMdc = includeMDC == null ? true : Boolean.valueOf(includeMDC);
         final boolean includeNewLine = includeNL == null ? false : Boolean.valueOf(includeNL);
+        final Map<String, String> loggerFieldValues = loggerFields == null ? null : loggerFields.getMap();
         if (mdcId == null) {
             mdcId = DEFAULT_MDCID;
         }
 
         return new RFC5424Layout(config, f, id, enterpriseNumber, isMdc, includeNewLine, escapeNL, mdcId, mdcPrefix,
-                                 eventPrefix, appName, msgId, excludes, includes, required, charset, exceptionPattern);
+                                 eventPrefix, appName, msgId, excludes, includes, required, charset, exceptionPattern,
+                                 loggerFieldValues);
     }
 }
