Index: log4j-core/src/main/java/org/apache/logging/log4j/core/layout/XMLLayout.java =================================================================== --- log4j-core/src/main/java/org/apache/logging/log4j/core/layout/XMLLayout.java (revision 1544632) +++ log4j-core/src/main/java/org/apache/logging/log4j/core/layout/XMLLayout.java (working copy) @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; +import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginAttribute; @@ -195,6 +196,32 @@ buf.append(this.eol); } + if (event.getMarker() != null) { + Marker marker = event.getMarker(); + buf.append(this.indent2); + buf.append('<'); + if (!complete) { + buf.append(this.namespacePrefix); + } + + buf.append("Marker"); + + if(marker.getParent() != null) { + Marker parent = marker.getParent(); + buf.append(" parent=\"").append(Transform.escapeHtmlTags(parent.getName())).append("\""); + } + + buf.append(">"); + buf.append(Transform.escapeHtmlTags(marker.getName())); + + buf.append(""); + buf.append(this.eol); + } + final Throwable throwable = event.getThrown(); if (throwable != null) { final List s = Throwables.toStringList(throwable); Index: log4j-core/src/main/resources/Log4j-events.dtd =================================================================== --- log4j-core/src/main/resources/Log4j-events.dtd (revision 1544632) +++ log4j-core/src/main/resources/Log4j-events.dtd (working copy) @@ -28,6 +28,10 @@ + + @@ -39,7 +43,7 @@ - + + + + + + Index: log4j-core/src/test/java/org/apache/logging/log4j/core/layout/XMLLayoutTest.java =================================================================== --- log4j-core/src/test/java/org/apache/logging/log4j/core/layout/XMLLayoutTest.java (revision 1544632) +++ log4j-core/src/test/java/org/apache/logging/log4j/core/layout/XMLLayoutTest.java (working copy) @@ -16,6 +16,9 @@ */ package org.apache.logging.log4j.core.layout; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.MarkerManager; + import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.ThreadContext; @@ -39,6 +42,7 @@ */ public class XMLLayoutTest { private static final String body = ""; + private static final String markerTag = "EVENT"; static ConfigurationFactory cf = new BasicConfigurationFactory(); @AfterClass @@ -99,6 +103,9 @@ root.error("finished mdc pattern test", new NullPointerException("test")); + Marker marker = MarkerManager.getMarker("EVENT"); + root.error(marker, "marker test"); + appender.stop(); final List list = appender.getMessages(); @@ -108,5 +115,8 @@ assertTrue("Incorrect header: " + string, string.equals("")); assertTrue("Incorrect footer", list.get(list.size() - 1).equals("")); assertTrue("Incorrect body. Expected " + body + " Actual: " + list.get(7), list.get(7).trim().equals(body)); + + assertTrue("Missing Marker-Tag, Expected "+markerTag+", Actual"+list.get(list.size() - 4), + list.get(list.size() - 4).contains(markerTag)); } } Index: src/site/xdoc/manual/layouts.xml.vm =================================================================== --- src/site/xdoc/manual/layouts.xml.vm (revision 1544632) +++ src/site/xdoc/manual/layouts.xml.vm (working copy) @@ -1326,9 +1326,11 @@ <events xmlns="http://logging.apache.org/log4j/2.0/events"> <event logger="com.foo.Bar" timestamp="1373436580419" level="INFO" thread="main"> <message><![CDATA[This is a log message 1]]></message> + <marker parent="Parent Marker"><Child Marker></marker> </event> <event logger="com.foo.Baz" timestamp="1373436580420" level="INFO" thread="main"> <message><![CDATA[This is a log message 2]]></message> + <marker><The Marker Name></marker> </event> </events>

@@ -1338,6 +1340,12 @@

This approach enforces the independence of the XMLLayout and the appender where you embed it.

+

Marker

+

Markers are represented by a marker element within the event element. + The marker element appears only when a marker is used in the log message. The name of the marker's + parent will be provided in the parent attribute of the marker element. + Only the leaf marker is included, not the full hierarchy. +

Encoding

Appenders using this layout should have their charset set to UTF-8 or