You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by rg...@apache.org on 2011/08/07 00:44:32 UTC

svn commit: r1154618 - in /logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src: main/java/org/apache/logging/log4j/core/appender/ main/java/org/apache/logging/log4j/core/layout/ test/java/org/apache/logging/log4j/core/appender/ test/j...

Author: rgoers
Date: Sat Aug  6 22:44:31 2011
New Revision: 1154618

URL: http://svn.apache.org/viewvc?rev=1154618&view=rev
Log:
Allow some MDC fields to be required

Modified:
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/layout/RFC5424Layout.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/RFC5424LayoutTest.java

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java?rev=1154618&r1=1154617&r2=1154618&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java Sat Aug  6 22:44:31 2011
@@ -62,7 +62,8 @@ public class SyslogAppender extends Sock
                                                 @PluginAttr("appName") String appName,
                                                 @PluginAttr("messageId") String msgId,
                                                 @PluginAttr("mdcExcludes") String excludes,
-                                                @PluginAttr("mdcINcludes") String includes,
+                                                @PluginAttr("mdcIncludes") String includes,
+                                                @PluginAttr("mdcRequired") String required,
                                                 @PluginAttr("format") String format,
                                                 @PluginElement("filters") Filters filters,
                                                 @PluginAttr("charset") String charset) {
@@ -81,7 +82,7 @@ public class SyslogAppender extends Sock
         }
         Layout layout = (format.equalsIgnoreCase(RFC5424)) ?
             RFC5424Layout.createLayout(facility, id, ein, includeMDC, mdcId, includeNL, appName,  msgId,
-                excludes, includes, charset) :
+                excludes, includes, required, charset) :
             SyslogLayout.createLayout(facility, includeNL, charset);
 
         if (name == null) {

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/layout/RFC5424Layout.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/layout/RFC5424Layout.java?rev=1154618&r1=1154617&r2=1154618&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/layout/RFC5424Layout.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/layout/RFC5424Layout.java Sat Aug  6 22:44:31 2011
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.core.la
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.LoggingException;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
@@ -58,10 +59,13 @@ public class RFC5424Layout extends Abstr
     private final String configName;
     private final List<String> mdcExcludes;
     private final List<String> mdcIncludes;
+    private final List<String> mdcRequired;
     private final ListChecker checker;
     private final ListChecker noopChecker = new NoopChecker();
     private final boolean includeNewLine;
 
+    private static final String DEFAULT_MDCID = "mdc";
+
     private long lastTimestamp = -1;
     private String timestamppStr = null;
 
@@ -73,7 +77,8 @@ public class RFC5424Layout extends Abstr
     public static final String DEFAULT_ID = "Audit";
 
     public RFC5424Layout(Facility facility, String id, int ein, boolean includeMDC, boolean includeNL, String mdcId,
-                         String appName, String messageId, String excludes, String includes, Charset charset) {
+                         String appName, String messageId, String excludes, String includes, String required,
+                         Charset charset) {
         super(charset);
         this.facility = facility;
         this.defaultId = id == null ? DEFAULT_ID : id;
@@ -113,6 +118,20 @@ public class RFC5424Layout extends Abstr
         } else {
             mdcIncludes = null;
         }
+        if (required != null) {
+            String[] array = required.split(",");
+            if (array.length > 0) {
+                mdcRequired = new ArrayList<String>(array.length);
+                for (String str : array) {
+                    mdcRequired.add(str.trim());
+                }
+            } else {
+                mdcRequired = null;
+            }
+
+        } else {
+            mdcRequired = null;
+        }
         this.checker = c != null ? c : noopChecker;
         LoggerContext ctx = (LoggerContext) LogManager.getContext();
         String name = ctx.getConfiguration().getName();
@@ -153,24 +172,33 @@ public class RFC5424Layout extends Abstr
             buf.append("-");
         }
         buf.append(" ");
-        if (isStructured) {
-            StructuredDataMessage data = (StructuredDataMessage) msg;
-            Map map = data.getData();
-            StructuredDataId id = data.getId();
-            formatStructuredElement(id, map, buf, noopChecker);
+        if (isStructured || includeMDC) {
+            StructuredDataId id = null;
+            String text = "";
+            if (isStructured) {
+                StructuredDataMessage data = (StructuredDataMessage) msg;
+                Map map = data.getData();
+                id = data.getId();
+                formatStructuredElement(id, map, buf, noopChecker);
+                text = data.getMessageFormat();
+            } else {
+                text = msg.getFormattedMessage();
+            }
             if (includeMDC)
             {
-                int ein = id.getEnterpriseNumber() < 0 ? enterpriseNumber : id.getEnterpriseNumber();
+                if (mdcRequired != null) {
+                    checkRequired(event.getContextMap());
+                }
+                int ein = id == null || id.getEnterpriseNumber() < 0 ? enterpriseNumber : id.getEnterpriseNumber();
                 StructuredDataId mdcSDID = new StructuredDataId(mdcId, ein, null, null);
                 formatStructuredElement(mdcSDID, event.getContextMap(), buf, checker);
             }
-            String text = data.getMessageFormat();
             if (text != null && text.length() > 0) {
                 buf.append(" ").append(text);
             }
         } else {
             buf.append("- ");
-            buf.append(event.getMessage().getFormattedMessage());
+            buf.append(msg.getFormattedMessage());
         }
         if (includeNewLine) {
             buf.append("\n");
@@ -199,6 +227,14 @@ public class RFC5424Layout extends Abstr
         }
     }
 
+    public List<String> getMdcExcludes() {
+        return mdcExcludes;
+    }
+
+    public List<String> getMdcIncludes() {
+        return mdcIncludes;
+    }
+
     private String computeTimeStampString(long now) {
         long last;
         synchronized (this) {
@@ -294,6 +330,15 @@ public class RFC5424Layout extends Abstr
         return sb.toString();
     }
 
+    private void checkRequired(Map<String, Object> map) {
+        for (String key : mdcRequired) {
+            Object value = map.get(key);
+            if (value == null) {
+                throw new LoggingException("Required key " + key + " is missing from the " + mdcId);
+            }
+        }
+    }
+
     private void appendMap(Map<String, Object> map, StringBuilder sb, ListChecker checker)
     {
         SortedMap<String, Object> sorted = new TreeMap<String, Object>(map);
@@ -338,7 +383,8 @@ public class RFC5424Layout extends Abstr
                                              @PluginAttr("appName") String appName,
                                              @PluginAttr("messageId") String msgId,
                                              @PluginAttr("mdcExcludes") String excludes,
-                                             @PluginAttr("mdcINcludes") String includes,
+                                             @PluginAttr("mdcIncludes") String includes,
+                                             @PluginAttr("mdcRequired") String required,
                                              @PluginAttr("charset") String charset) {
         Charset c = Charset.isSupported("UTF-8") ? Charset.forName("UTF-8") : Charset.defaultCharset();
         if (charset != null) {
@@ -356,8 +402,11 @@ public class RFC5424Layout extends Abstr
         int enterpriseNumber = ein == null ? DEFAULT_ENTERPRISE_NUMBER : Integer.parseInt(ein);
         boolean isMdc = includeMDC == null ? true : Boolean.valueOf(includeMDC);
         boolean includeNewLine = includeNL == null ? false : Boolean.valueOf(includeNL);
+        if (mdcId == null) {
+            mdcId = DEFAULT_MDCID;
+        }
 
         return new RFC5424Layout(f, id, enterpriseNumber, isMdc, includeNewLine, mdcId, appName, msgId, excludes,
-                                 includes, c);
+                                 includes, required, c);
     }
 }

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java?rev=1154618&r1=1154617&r2=1154618&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java Sat Aug  6 22:44:31 2011
@@ -191,7 +191,7 @@ public class SyslogAppenderTest {
 
     private SyslogAppender createAppender(String protocol, String format) {
         return SyslogAppender.createAppender("localhost", PORT, protocol, "-1", "Test", "true", "false", "LOCAL0", "Audit",
-            "18060", "true", "RequestContext", "true", "TestApp", "Test", null, "ipAddress,loginId", format, null, null);
+            "18060", "true", "RequestContext", "true", "TestApp", "Test", null, "ipAddress,loginId", null, format, null, null);
     }
 
     public static class UDPSocketServer extends Thread {

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/RFC5424LayoutTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/RFC5424LayoutTest.java?rev=1154618&r1=1154617&r2=1154618&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/RFC5424LayoutTest.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/RFC5424LayoutTest.java Sat Aug  6 22:44:31 2011
@@ -44,9 +44,9 @@ public class RFC5424LayoutTest {
     Logger root = ctx.getLogger("");
 
 
-    private static final String line1 = "ATM - - - starting mdc pattern test";
-    private static final String line2 = "ATM - - - empty mdc";
-    private static final String line3 = "ATM - - - filled mdc";
+    private static final String line1 = "ATM - - [RequestContext@3692 loginId=\"JohnDoe\"] starting mdc pattern test";
+    private static final String line2 = "ATM - - [RequestContext@3692 loginId=\"JohnDoe\"] empty mdc";
+    private static final String line3 = "ATM - - [RequestContext@3692 loginId=\"JohnDoe\"] filled mdc";
     private static final String line4 =
         "ATM - Audit [Transfer@18060 Amount=\"200.00\" FromAccount=\"123457\" ToAccount=\"123456\"]" +
         "[RequestContext@18060 ipAddress=\"192.168.0.120\" loginId=\"JohnDoe\"] Transfer Complete";
@@ -76,7 +76,7 @@ public class RFC5424LayoutTest {
 
         // set up appender
         RFC5424Layout layout = RFC5424Layout.createLayout("Local0", "Event", "3692", "true", "RequestContext", "true",
-            "ATM", null, "key1, key2, locale", null, null);
+            "ATM", null, "key1, key2, locale", null, "loginId", null);
         ListAppender appender = new ListAppender("List", null, layout, true, false);
         appender.start();
 
@@ -84,6 +84,8 @@ public class RFC5424LayoutTest {
         root.addAppender(appender);
         root.setLevel(Level.DEBUG);
 
+        ThreadContext.put("loginId", "JohnDoe");
+
         // output starting message
         root.debug("starting mdc pattern test");
 
@@ -94,24 +96,37 @@ public class RFC5424LayoutTest {
 
         root.debug("filled mdc");
 
-        ThreadContext.put("loginId", "JohnDoe");
         ThreadContext.put("ipAddress", "192.168.0.120");
         ThreadContext.put("locale", Locale.US.getDisplayName());
-        StructuredDataMessage msg = new StructuredDataMessage("Transfer@18060", "Transfer Complete", "Audit");
-        msg.put("ToAccount", "123456");
-        msg.put("FromAccount", "123457");
-        msg.put("Amount", "200.00");
-        root.info(MarkerManager.getMarker("EVENT"), msg);
-
-        ThreadContext.clear();
-
-        appender.stop();
-
-        List<String> list = appender.getMessages();
-
-        assertTrue("Expected line 1 to end with: " + line1 + " Actual " + list.get(0), list.get(0).endsWith(line1));
-        assertTrue("Expected line 2 to end with: " + line2 + " Actual " + list.get(1), list.get(1).endsWith(line2));
-        assertTrue("Expected line 3 to end with: " + line3 + " Actual " + list.get(2), list.get(2).endsWith(line3));
-        assertTrue("Expected line 4 to end with: " + line4 + " Actual " + list.get(3), list.get(3).endsWith(line4));
+        try {
+            StructuredDataMessage msg = new StructuredDataMessage("Transfer@18060", "Transfer Complete", "Audit");
+            msg.put("ToAccount", "123456");
+            msg.put("FromAccount", "123457");
+            msg.put("Amount", "200.00");
+            root.info(MarkerManager.getMarker("EVENT"), msg);
+
+            List<String> list = appender.getMessages();
+
+            assertTrue("Expected line 1 to end with: " + line1 + " Actual " + list.get(0), list.get(0).endsWith(line1));
+            assertTrue("Expected line 2 to end with: " + line2 + " Actual " + list.get(1), list.get(1).endsWith(line2));
+            assertTrue("Expected line 3 to end with: " + line3 + " Actual " + list.get(2), list.get(2).endsWith(line3));
+            assertTrue("Expected line 4 to end with: " + line4 + " Actual " + list.get(3), list.get(3).endsWith(line4));
+
+            appender.clear();
+
+            ThreadContext.remove("loginId");
+
+            root.debug("This is a test");
+
+            list = appender.getMessages();
+            assertTrue("No messages expected, found " + list.size(), list.size() == 0);
+        } finally {
+
+            ThreadContext.clear();
+
+            appender.stop();
+        }
+
     }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org