You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2012/09/24 09:16:07 UTC
svn commit: r1389229 - in /logging/log4j/log4j2/trunk:
api/src/main/java/org/apache/logging/log4j/message/
core/src/main/java/org/apache/logging/log4j/core/layout/
core/src/test/java/org/apache/logging/log4j/core/ core/src/test/resources/
src/changes/
Author: rgoers
Date: Mon Sep 24 07:16:06 2012
New Revision: 1389229
URL: http://svn.apache.org/viewvc?rev=1389229&view=rev
Log:
Add getFormats to MultiformatMessage. Allow StructuredDataMessage to be formatted as XML
Added:
logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/XMLEvents.java
logging/log4j/log4j2/trunk/core/src/test/resources/xml-events.xml
Modified:
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MultiformatMessage.java
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/layout/XMLLayout.java
logging/log4j/log4j2/trunk/src/changes/changes.xml
Modified: logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MapMessage.java?rev=1389229&r1=1389228&r2=1389229&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MapMessage.java (original)
+++ logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MapMessage.java Mon Sep 24 07:16:06 2012
@@ -59,6 +59,15 @@ public class MapMessage implements Multi
this.data = map;
}
+ public String[] getFormats() {
+ String[] formats = new String[MapFormat.values().length];
+ int i = 0;
+ for (MapFormat format : MapFormat.values()) {
+ formats[i++] = format.name();
+ }
+ return formats;
+ }
+
/**
* Return the data elements as if they were parameters on the logging event.
* @return the data elements.
Modified: logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MultiformatMessage.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MultiformatMessage.java?rev=1389229&r1=1389228&r2=1389229&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MultiformatMessage.java (original)
+++ logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MultiformatMessage.java Mon Sep 24 07:16:06 2012
@@ -33,4 +33,10 @@ public interface MultiformatMessage exte
* @return The message String.
*/
String getFormattedMessage(String[] formats);
+
+ /**
+ * Returns the supported formats.
+ * @return The supported formats.
+ */
+ String[] getFormats();
}
Modified: logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java?rev=1389229&r1=1389228&r2=1389229&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java (original)
+++ logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java Mon Sep 24 07:16:06 2012
@@ -23,10 +23,6 @@ import java.util.Map;
* Represents a Message that conforms to RFC 5424 (http://tools.ietf.org/html/rfc5424).
*/
public class StructuredDataMessage extends MapMessage implements MultiformatMessage, Serializable {
- /**
- * Full message format includes the type and message.
- */
- public static final String FULL = "FULL";
private static final long serialVersionUID = 1703221292892071920L;
private static final int MAX_LENGTH = 32;
@@ -38,6 +34,13 @@ public class StructuredDataMessage exten
private String type;
+ public enum Format {
+ /** The map should be formatted as XML. */
+ XML,
+ /** Full message format includes the type and message. */
+ FULL
+ }
+
/**
* Constructor based on a String id.
* @param id The String id.
@@ -113,6 +116,19 @@ public class StructuredDataMessage exten
}
/**
+ * Return the supported formats.
+ * @return An array of the supported format names.
+ */
+ public String[] getFormats() {
+ String[] formats = new String[Format.values().length];
+ int i = 0;
+ for (Format format : Format.values()) {
+ formats[i++] = format.name();
+ }
+ return formats;
+ }
+
+ /**
* Return the id.
* @return the StructuredDataId.
*/
@@ -178,7 +194,7 @@ public class StructuredDataMessage exten
*/
@Override
public String asString() {
- return asString(FULL, null);
+ return asString(Format.FULL, null);
}
/**
@@ -189,7 +205,11 @@ public class StructuredDataMessage exten
*/
public String asString(String format) {
- return asString(format, null);
+ try {
+ return asString(Format.valueOf(format.toUpperCase()), null);
+ } catch (IllegalArgumentException ex) {
+ return asString();
+ }
}
/**
@@ -201,9 +221,9 @@ public class StructuredDataMessage exten
* will be used.
* @return The formatted String.
*/
- public final String asString(String format, StructuredDataId structuredDataId) {
+ public final String asString(Format format, StructuredDataId structuredDataId) {
StringBuilder sb = new StringBuilder();
- boolean full = FULL.equals(format);
+ boolean full = Format.FULL.equals(format);
if (full) {
String type = getType();
if (type == null) {
@@ -240,7 +260,7 @@ public class StructuredDataMessage exten
*/
@Override
public String getFormattedMessage() {
- return asString(FULL, null);
+ return asString(Format.FULL, null);
}
/**
@@ -256,14 +276,30 @@ public class StructuredDataMessage exten
public String getFormattedMessage(String[] formats) {
if (formats != null && formats.length > 0) {
for (String format : formats) {
- if (format.equalsIgnoreCase(FULL)) {
- return asString(FULL, null);
+ if (Format.XML.name().equalsIgnoreCase(format)) {
+ return asXML();
+ } else if (Format.FULL.name().equalsIgnoreCase(format)) {
+ return asString(Format.FULL, null);
}
}
return asString(null, null);
} else {
- return asString(FULL, null);
+ return asString(Format.FULL, null);
+ }
+ }
+
+ private String asXML() {
+ StringBuilder sb = new StringBuilder();
+ StructuredDataId id = getId();
+ if (id == null || id.getName() == null || type == null) {
+ return sb.toString();
}
+ sb.append("<StructuredData>\n");
+ sb.append("<type>").append(type).append("</type>\n");
+ sb.append("<id>").append(id).append("</id>\n");
+ super.asXML(sb);
+ sb.append("</StructuredData>\n");
+ return sb.toString();
}
@Override
Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/layout/XMLLayout.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/layout/XMLLayout.java?rev=1389229&r1=1389228&r2=1389229&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/layout/XMLLayout.java (original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/layout/XMLLayout.java Mon Sep 24 07:16:06 2012
@@ -32,6 +32,8 @@ import org.apache.logging.log4j.core.con
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.helpers.Transform;
import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.message.MultiformatMessage;
/**
@@ -77,6 +79,8 @@ public class XMLLayout extends AbstractS
private final boolean properties;
private final boolean complete;
+ private static final String[] FORMATS = new String[] {"xml"};
+
protected XMLLayout(boolean locationInfo, boolean properties, boolean complete, Charset charset) {
super(charset);
this.locationInfo = locationInfo;
@@ -108,13 +112,31 @@ public class XMLLayout extends AbstractS
buf.append(Transform.escapeTags(event.getThreadName()));
buf.append("\">\r\n");
- buf.append("<log4j:message><![CDATA[");
- // Append the rendered message. Also make sure to escape any
- // existing CDATA sections.
- Transform.appendEscapingCDATA(buf, event.getMessage().getFormattedMessage());
- buf.append("]]></log4j:message>\r\n");
+ Message msg = event.getMessage();
+ if (msg != null) {
+ boolean xmlSupported = false;
+ if (msg instanceof MultiformatMessage) {
+ String[] formats = ((MultiformatMessage) msg).getFormats();
+ for (String format : formats) {
+ if (format.equalsIgnoreCase("XML")) {
+ xmlSupported = true;
+ }
+ }
+ }
+ if (xmlSupported) {
+ buf.append("<log4j:message>");
+ buf.append(((MultiformatMessage) msg).getFormattedMessage(FORMATS));
+ buf.append("</log4j:message>");
+ } else {
+ buf.append("<log4j:message><![CDATA[");
+ // Append the rendered message. Also make sure to escape any
+ // existing CDATA sections.
+ Transform.appendEscapingCDATA(buf, event.getMessage().getFormattedMessage());
+ buf.append("]]></log4j:message>\r\n");
+ }
+ }
- if (event.getContextStack().size() > 0) {
+ if (event.getContextStack() != null && event.getContextStack().size() > 0) {
buf.append("<log4j:NDC><![CDATA[");
Transform.appendEscapingCDATA(buf, event.getContextStack().toString());
buf.append("]]></log4j:NDC>\r\n");
Added: logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/XMLEvents.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/XMLEvents.java?rev=1389229&view=auto
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/XMLEvents.java (added)
+++ logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/XMLEvents.java Mon Sep 24 07:16:06 2012
@@ -0,0 +1,70 @@
+/*
+ * 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;
+
+import org.apache.logging.log4j.EventLogger;
+import org.apache.logging.log4j.ThreadContext;
+import org.apache.logging.log4j.core.config.XMLConfigurationFactory;
+import org.apache.logging.log4j.message.StructuredDataMessage;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.Locale;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ *
+ */
+public class XMLEvents {
+
+ private static final String CONFIG = "xml-events.xml";
+
+ @BeforeClass
+ public static void setupClass() {
+ System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
+ }
+
+ @Test
+ public void testEvents() {
+ ThreadContext.put("loginId", "JohnDoe");
+ ThreadContext.put("ipAddress", "192.168.0.120");
+ ThreadContext.put("locale", Locale.US.getDisplayName());
+ TransferMessage msg = new TransferMessage();
+ msg.put("ToAccount", "123456");
+ msg.put("FromAccount", "123457");
+ msg.put("Amount", "200.00");
+ EventLogger.logEvent(msg);
+ msg.setCompletionStatus("Transfer Complete");
+ EventLogger.logEvent(msg);
+ ThreadContext.clear();
+
+
+ }
+
+ private class TransferMessage extends StructuredDataMessage {
+
+ public TransferMessage() {
+ super("Transfer@18060", null, "Audit");
+ }
+
+ public void setCompletionStatus(String msg) {
+ setMessageFormat(msg);
+ }
+ }
+}
Added: logging/log4j/log4j2/trunk/core/src/test/resources/xml-events.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/test/resources/xml-events.xml?rev=1389229&view=auto
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/test/resources/xml-events.xml (added)
+++ logging/log4j/log4j2/trunk/core/src/test/resources/xml-events.xml Mon Sep 24 07:16:06 2012
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration status="error" name="MyApp" packages="">
+ <appenders>
+ <Console name="STDOUT">
+ <PatternLayout pattern="%d [%p] %c %m%n"/>
+ </Console>
+ <File name="events" fileName="target/events.xml" append="false">
+ <XMLLayout properties="true" complete="true"/>
+ </File>
+ </appenders>
+ <loggers>
+ <logger name="EventLogger" level="info">
+ <appender-ref ref="events"/>
+ </logger>
+ <root level="warn">
+ <appender-ref ref="STDOUT"/>
+ </root>
+ </loggers>
+</configuration>
\ No newline at end of file
Modified: logging/log4j/log4j2/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/changes/changes.xml?rev=1389229&r1=1389228&r2=1389229&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/src/changes/changes.xml (original)
+++ logging/log4j/log4j2/trunk/src/changes/changes.xml Mon Sep 24 07:16:06 2012
@@ -23,6 +23,9 @@
<body>
<release version="2.0-beta2" date="TBD" description="Bug fixes and enhancements">
+ <action dev="rgoers" type="add">
+ Add getFormats to MultiformatMessage and allow StructuredDataMessage to format as XML.
+ </action>
<action issue="LOG4J2-90" dev="rgoers" type="fix">
Add documentation on client vs server mode to performance page.
</action>