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