You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2017/11/06 20:19:06 UTC

logging-log4j2 git commit: LOG4J2-2103 XML encoding for PatternLayout

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 16c673b08 -> 70a67801d


LOG4J2-2103 XML encoding for PatternLayout


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/70a67801
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/70a67801
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/70a67801

Branch: refs/heads/master
Commit: 70a67801d8d29d78a00c360b4dd9da9fdea08212
Parents: 16c673b
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Mon Nov 6 21:18:59 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Mon Nov 6 21:18:59 2017 +0100

----------------------------------------------------------------------
 .../core/pattern/EncodingPatternConverter.java  | 36 ++++++++++++++++++++
 .../pattern/EncodingPatternConverterTest.java   | 20 +++++++++++
 src/changes/changes.xml                         |  3 ++
 src/site/xdoc/manual/layouts.xml.vm             | 16 +++++++--
 4 files changed, 73 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/70a67801/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
index 9897e9d..4d22ee0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
@@ -172,6 +172,42 @@ public final class EncodingPatternConverter extends LogEventPatternConverter {
                     }
                 }
             }
+        },
+
+        /**
+         * XML string escaping as defined in XML specification.
+         *
+         * @see <a href="https://www.w3.org/TR/xml/">XML specification</a>
+         */
+        XML {
+            @Override
+            void escape(final StringBuilder toAppendTo, final int start) {
+                for (int i = toAppendTo.length() - 1; i >= start; i--) { // backwards: length may change
+                    final char c = toAppendTo.charAt(i);
+                    switch (c) {
+                        case '&':
+                            toAppendTo.setCharAt(i, '&');
+                            toAppendTo.insert(i + 1, "amp;");
+                            break;
+                        case '<':
+                            toAppendTo.setCharAt(i, '&');
+                            toAppendTo.insert(i + 1, "lt;");
+                            break;
+                        case '>':
+                            toAppendTo.setCharAt(i, '&');
+                            toAppendTo.insert(i + 1, "gt;");
+                            break;
+                        case '"':
+                            toAppendTo.setCharAt(i, '&');
+                            toAppendTo.insert(i + 1, "quot;");
+                            break;
+                        case '\'':
+                            toAppendTo.setCharAt(i, '&');
+                            toAppendTo.insert(i + 1, "apos;");
+                            break;
+                    }
+                }
+            }
         };
 
         /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/70a67801/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverterTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverterTest.java
index 57ecbb0..7767fea 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverterTest.java
@@ -86,4 +86,24 @@ public class EncodingPatternConverterTest {
             "Test \\r\\n<div class=\"test\">this\\r</div> & \\n<div class='test'>that</div>",
             sb.toString());
     }
+
+    @Test
+    public void testXmlEscaping() {
+        final LogEvent event = Log4jLogEvent.newBuilder() //
+                .setLoggerName(EncodingPatternConverterTest.class.getName()) //
+                .setLevel(Level.DEBUG) //
+                .setMessage(new SimpleMessage("Test \r\n<div class=\"test\">this</div> & <div class='test'>that</div>"))
+                .build();
+        final StringBuilder sb = new StringBuilder();
+        final LoggerContext ctx = LoggerContext.getContext();
+        final String[] options = new String[]{"%msg", "XML"};
+        final EncodingPatternConverter converter = EncodingPatternConverter
+            .newInstance(ctx.getConfiguration(), options);
+        assertNotNull("Error creating converter", converter);
+        converter.format(event, sb);
+        assertEquals(
+            "Test \r\n&lt;div class=&quot;test&quot;&gt;this&lt;/div&gt; &amp; &lt;div class=&apos;test&apos;&gt;that&lt;/div&gt;",
+            sb.toString());
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/70a67801/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 55e53dd..d54484a 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -31,6 +31,9 @@
          - "remove" - Removed
     -->
     <release version="2.10.0" date="2017-MM-DD" description="GA Release 2.10.0">
+      <action issue="LOG4J2-2103" dev="mikes" type="add">
+        XML encoding for PatternLayout.
+      </action>
       <action issue="LOG4J2-1203" dev="mikes" type="add" due-to="Robert Turner">
         Allow filtering of line breaks in layout pattern.
       </action>

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/70a67801/src/site/xdoc/manual/layouts.xml.vm
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/layouts.xml.vm b/src/site/xdoc/manual/layouts.xml.vm
index 9d4cd31..ab61955 100644
--- a/src/site/xdoc/manual/layouts.xml.vm
+++ b/src/site/xdoc/manual/layouts.xml.vm
@@ -780,8 +780,8 @@ WARN  [main]: Message 2</pre>
             </tr>
             <tr>
               <td align="center">
-                <b>enc</b>{<i>pattern</i>}{[HTML|JSON|CRLF]}<br />
-                <b>encode</b>{<i>pattern</i>}{[HTML|JSON|CRLF]}
+                <b>enc</b>{<i>pattern</i>}{[HTML|XML|JSON|CRLF]}<br />
+                <b>encode</b>{<i>pattern</i>}{[HTML|XML|JSON|CRLF]}
               </td>
               <td>
                 <p>
@@ -811,6 +811,18 @@ WARN  [main]: Message 2</pre>
                     <td>Replaced with the corresponding HTML entity</td>
                   </tr>
                 </table>
+                <p>Using the XML encoding format, this follows the escaping rules specified by
+                   <a href="https://www.w3.org/TR/xml/">the XML specification</a>:</p>
+                <table>
+                  <tr>
+                    <th>Character</th>
+                    <th>Replacement</th>
+                  </tr>
+                  <tr>
+                    <td>&amp;, &lt;, &gt;, &quot;, &apos;</td>
+                    <td>Replaced with the corresponding XML entity</td>
+                  </tr>
+                </table>
                 <p>
                   Using the JSON encoding format, this follows the escaping rules specified by
                   <a href="https://www.ietf.org/rfc/rfc4627.txt">RFC 4627 section 2.5</a>: