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