You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/08/19 07:15:54 UTC
[29/50] logging-log4j2 git commit: Support Log4j 1 XmlLayout options
Support Log4j 1 XmlLayout options
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/b529739c
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/b529739c
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/b529739c
Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: b529739c0b40611065140ac7d8b4ba1bbbccbcc5
Parents: bbae0af
Author: Mikael St�ldal <mi...@staldal.nu>
Authored: Wed Aug 17 11:52:17 2016 +0200
Committer: Mikael St�ldal <mi...@staldal.nu>
Committed: Wed Aug 17 11:52:17 2016 +0200
----------------------------------------------------------------------
.../config/Log4j1ConfigurationFactory.java | 8 ++-
.../apache/log4j/layout/Log4j1XmlLayout.java | 63 +++++++++++++++++++-
.../config/Log4j1ConfigurationFactoryTest.java | 5 +-
.../log4j/layout/Log4j1XmlLayoutTest.java | 40 ++++++++++++-
.../log4j-console-XmlLayout.properties | 2 +
5 files changed, 109 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b529739c/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
----------------------------------------------------------------------
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 0848f4d..0824fae 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -157,8 +157,12 @@ public class Log4j1ConfigurationFactory extends ConfigurationFactory {
break;
}
case "org.apache.log4j.xml.XMLLayout": {
- // TODO support properties
- appenderBuilder.add(builder.newLayout("Log4j1XmlLayout"));
+ LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
+ xmlLayout.addAttribute("locationInfo",
+ Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.LocationInfo", "false")));
+ xmlLayout.addAttribute("properties",
+ Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.Properties", "false")));
+ appenderBuilder.add(xmlLayout);
break;
}
default:
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b529739c/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
----------------------------------------------------------------------
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
index d602b41..8f9df10 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
@@ -21,13 +21,16 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.layout.AbstractStringLayout;
import org.apache.logging.log4j.core.layout.ByteBufferDestination;
import org.apache.logging.log4j.core.util.Transform;
import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
import java.util.List;
+import java.util.Map;
/**
* Port of XMLLayout in Log4j 1.x. Provided for compatibility with existing Log4j 1 configurations.
@@ -37,13 +40,31 @@ import java.util.List;
@Plugin(name = "Log4j1XmlLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
public final class Log4j1XmlLayout extends AbstractStringLayout {
+ private final boolean locationInfo;
+ private final boolean properties;
+
@PluginFactory
- public static Log4j1XmlLayout createLayout() {
- return new Log4j1XmlLayout();
+ public static Log4j1XmlLayout createLayout(
+ // @formatter:off
+ @PluginAttribute(value = "locationInfo", defaultBoolean = false) final boolean locationInfo,
+ @PluginAttribute(value = "properties", defaultBoolean = false) final boolean properties
+ // @formatter:on
+ ) {
+ return new Log4j1XmlLayout(locationInfo, properties);
}
- private Log4j1XmlLayout() {
+ private Log4j1XmlLayout(boolean locationInfo, boolean properties) {
super(StandardCharsets.UTF_8);
+ this.locationInfo = locationInfo;
+ this.properties = properties;
+ }
+
+ public boolean isLocationInfo() {
+ return locationInfo;
+ }
+
+ public boolean isProperties() {
+ return properties;
}
@Override
@@ -98,6 +119,42 @@ public final class Log4j1XmlLayout extends AbstractStringLayout {
buf.append("]]></log4j:throwable>\r\n");
}
+ if (locationInfo) {
+ StackTraceElement source = event.getSource();
+ if (source != null) {
+ buf.append("<log4j:locationInfo class=\"");
+ buf.append(Transform.escapeHtmlTags(source.getClassName()));
+ buf.append("\" method=\"");
+ buf.append(Transform.escapeHtmlTags(source.getMethodName()));
+ buf.append("\" file=\"");
+ buf.append(Transform.escapeHtmlTags(source.getFileName()));
+ buf.append("\" line=\"");
+ buf.append(source.getLineNumber());
+ buf.append("\"/>\r\n");
+ }
+ }
+
+ if (properties) {
+ Map<String, String> contextMap = event.getContextMap();
+ if (!contextMap.isEmpty()) {
+ buf.append("<log4j:properties>\r\n");
+ Object[] keys = contextMap.keySet().toArray();
+ Arrays.sort(keys);
+ for (Object key1 : keys) {
+ String key = key1.toString();
+ String val = contextMap.get(key);
+ if (val != null) {
+ buf.append("<log4j:data name=\"");
+ buf.append(Transform.escapeHtmlTags(key));
+ buf.append("\" value=\"");
+ buf.append(Transform.escapeHtmlTags(val));
+ buf.append("\"/>\r\n");
+ }
+ }
+ buf.append("</log4j:properties>\r\n");
+ }
+ }
+
buf.append("</log4j:event>\r\n\r\n");
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b529739c/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java
----------------------------------------------------------------------
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java
index 66935cc..1ee78c5 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java
@@ -87,7 +87,8 @@ public class Log4j1ConfigurationFactoryTest {
@Test
public void testConsoleXmlLayout() throws Exception {
- final Layout<?> layout = testConsole("config-1.2/log4j-console-XmlLayout.properties");
- assertTrue(layout instanceof Log4j1XmlLayout);
+ final Log4j1XmlLayout layout = (Log4j1XmlLayout)testConsole("config-1.2/log4j-console-XmlLayout.properties");
+ assertTrue(layout.isLocationInfo());
+ assertFalse(layout.isProperties());
}
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b529739c/log4j-1.2-api/src/test/java/org/apache/log4j/layout/Log4j1XmlLayoutTest.java
----------------------------------------------------------------------
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/layout/Log4j1XmlLayoutTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/layout/Log4j1XmlLayoutTest.java
index 9898550..7f38c56 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/layout/Log4j1XmlLayoutTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/layout/Log4j1XmlLayoutTest.java
@@ -21,25 +21,61 @@ import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.message.SimpleMessage;
import org.junit.Test;
+import java.util.HashMap;
+import java.util.Map;
+
import static org.junit.Assert.assertEquals;
public class Log4j1XmlLayoutTest {
@Test
public void testWithoutThrown() {
- Log4j1XmlLayout layout = Log4j1XmlLayout.createLayout();
+ Log4j1XmlLayout layout = Log4j1XmlLayout.createLayout(false, true);
+
+ Log4jLogEvent event = Log4jLogEvent.newBuilder()
+ .setLoggerName("a.B")
+ .setLevel(Level.INFO)
+ .setMessage(new SimpleMessage("Hello, World"))
+ .setTimeMillis(System.currentTimeMillis() + 17)
+ .build();
+
+ String result = layout.toSerializable(event);
+
+ String expected =
+ "<log4j:event logger=\"a.B\" timestamp=\"" + event.getTimeMillis() + "\" level=\"INFO\" thread=\"main\">\r\n" +
+ "<log4j:message><![CDATA[Hello, World]]></log4j:message>\r\n" +
+ "</log4j:event>\r\n\r\n";
+
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void testWithPropertiesAndLocationInfo() {
+ Log4j1XmlLayout layout = Log4j1XmlLayout.createLayout(true, true);
+ Map<String, String> contextMap = new HashMap<>(2);
+ contextMap.put("key1", "value1");
+ contextMap.put("key2", "value2");
Log4jLogEvent event = Log4jLogEvent.newBuilder()
.setLoggerName("a.B")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, World"))
- .setTimeMillis(System.currentTimeMillis() + 17).build();
+ .setTimeMillis(System.currentTimeMillis() + 17)
+ .setIncludeLocation(true)
+ .setSource(new StackTraceElement("pack.MyClass", "myMethod", "MyClass.java", 17))
+ .setContextMap(contextMap)
+ .build();
String result = layout.toSerializable(event);
String expected =
"<log4j:event logger=\"a.B\" timestamp=\"" + event.getTimeMillis() + "\" level=\"INFO\" thread=\"main\">\r\n" +
"<log4j:message><![CDATA[Hello, World]]></log4j:message>\r\n" +
+ "<log4j:locationInfo class=\"pack.MyClass\" method=\"myMethod\" file=\"MyClass.java\" line=\"17\"/>\r\n" +
+ "<log4j:properties>\r\n" +
+ "<log4j:data name=\"key1\" value=\"value1\"/>\r\n" +
+ "<log4j:data name=\"key2\" value=\"value2\"/>\r\n" +
+ "</log4j:properties>\r\n"+
"</log4j:event>\r\n\r\n";
assertEquals(expected, result);
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b529739c/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties
----------------------------------------------------------------------
diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties
index ab1c53b..96302a2 100644
--- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties
+++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties
@@ -14,5 +14,7 @@ log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.ImmediateFlush=false
log4j.appender.Console.Target=System.err
log4j.appender.Console.layout=org.apache.log4j.xml.XMLLayout
+log4j.appender.Console.layout.LocationInfo=true
+log4j.appender.Console.layout.Properties=false
log4j.logger.com.example.foo = DEBUG