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 2015/10/11 23:06:24 UTC

[14/27] logging-log4j2 git commit: LOG4J2-1151: bugfixes and doc improvement

LOG4J2-1151: bugfixes and doc improvement

- use JDK 8 built-in encoder if available
- on Java 7, use JDK 8 backported logic to handle invalid input
- layout manual documentation improvement


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

Branch: refs/heads/LOG4J2-1136
Commit: 3ca1bfd6223ecb3e826dbbdc354c74ba091de517
Parents: 1d1c5d1
Author: rpopma <rp...@apache.org>
Authored: Tue Oct 6 01:39:48 2015 +0200
Committer: Ralph Goers <rg...@nextiva.com>
Committed: Sun Oct 11 12:40:43 2015 -0700

----------------------------------------------------------------------
 .../log4j/core/layout/AbstractStringLayout.java | 63 +++++++++++++++++---
 src/site/xdoc/manual/layouts.xml.vm             |  4 +-
 2 files changed, 58 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3ca1bfd6/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
index d48ee00..bb4ad1c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
@@ -49,7 +49,7 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
     // TODO: Charset is not serializable. Implement read/writeObject() ?
     private final Charset charset;
     private final String charsetName;
-    private final boolean isDirectSingleByteMapping;
+    private final boolean useCustomEncoding;
 
     protected AbstractStringLayout(final Charset charset) {
         this(charset, null, null);
@@ -59,8 +59,20 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
         super(header, footer);
         this.charset = charset == null ? StandardCharsets.UTF_8 : charset;
         this.charsetName = this.charset.name();
-        isDirectSingleByteMapping = StandardCharsets.ISO_8859_1.equals(charset)
-                || StandardCharsets.US_ASCII.equals(charset);
+        useCustomEncoding = isPreJava8()
+                && (StandardCharsets.ISO_8859_1.equals(charset) || StandardCharsets.US_ASCII.equals(charset));
+    }
+
+    // LOG4J2-1151: If the built-in JDK 8 encoders are available we should use them.
+    private static boolean isPreJava8() {
+        final String version = System.getProperty("java.version");
+        final String[] parts = version.split("\\.");
+        try {
+            int major = Integer.parseInt(parts[1]);
+            return major < 8;
+        } catch (Exception ex) {
+            return true;
+        }
     }
 
     /**
@@ -101,7 +113,7 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
     }
 
     protected byte[] getBytes(final String s) {
-        if (isDirectSingleByteMapping) { // rely on branch prediction to eliminate this check if false
+        if (useCustomEncoding) { // rely on branch prediction to eliminate this check if false
             return encodeSingleByteChars(s);
         }
         try { // LOG4J2-935: String.getBytes(String) gives better performance
@@ -121,12 +133,49 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
     private static byte[] encodeSingleByteChars(String s) {
         final int length = s.length();
         final byte[] result = new byte[length];
-        for (int i = 0; i < length; i++) {
-            result[i] = (byte) s.charAt(i);
-        }
+        encode(s, 0, length, result);
         return result;
     }
 
+    // LOG4J2-1151
+    private static int encodeISOArray(String charArray, int charIndex, byte[] byteArray, int byteIndex, int length) {
+        int i = 0;
+        for (; i < length; i++) {
+            char c = charArray.charAt(charIndex++);
+            if (c > 255) {
+                break;
+            }
+            byteArray[(byteIndex++)] = ((byte) c);
+        }
+        return i;
+    }
+
+    // LOG4J2-1151
+    private static int encode(String charArray, int charOffset, int charLength, byte[] byteArray) {
+        int offset = 0;
+        int length = Math.min(charLength, byteArray.length);
+        int charDoneIndex = charOffset + length;
+        while (charOffset < charDoneIndex) {
+            int m = encodeISOArray(charArray, charOffset, byteArray, offset, length);
+            charOffset += m;
+            offset += m;
+            if (m != length) {
+                char c = charArray.charAt(charOffset++);
+                if ((Character.isHighSurrogate(c)) && (charOffset < charDoneIndex)
+                        && (Character.isLowSurrogate(charArray.charAt(charOffset)))) {
+                    if (charLength > byteArray.length) {
+                        charDoneIndex++;
+                        charLength--;
+                    }
+                    charOffset++;
+                }
+                byteArray[(offset++)] = '?';
+                length = Math.min(charDoneIndex - charOffset, byteArray.length - offset);
+            }
+        }
+        return offset;
+    }
+
     protected Charset getCharset() {
         return charset;
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3ca1bfd6/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 6075b6a..8ec444c 100644
--- a/src/site/xdoc/manual/layouts.xml.vm
+++ b/src/site/xdoc/manual/layouts.xml.vm
@@ -51,8 +51,8 @@
         </p>
         <p>
           A custom character encoder was added to Log4j 2.4.1 for the ISO-8859-1 and US-ASCII charsets,
-          backporting the performance improvements from Java 8 for use on Java 7.
-          For applications that log only ISO-8859-1 characters, specifying this charset will improve performance.
+          backporting the performance improvements built-in to Java 8 to Log4j for use on Java 7.
+          For applications that log only ISO-8859-1 characters, specifying this charset will improve performance significantly.
         </p>
         <a name="CSVLayouts"/>
         <subsection name="CSV Layouts">