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:22 UTC

[12/27] logging-log4j2 git commit: LOG4J2-1151 fixes and documentation

LOG4J2-1151 fixes and documentation 

- Mention on Layout manual page that specifying ISO-8859-1 charset can
improve performance
- cover both US-ASCII and ISO-8859-1
- Improve wording in change.xml


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

Branch: refs/heads/LOG4J2-1136
Commit: ce419dc11453f26665b9f1963cd26aefa5cc6aad
Parents: d44bf68
Author: rpopma <rp...@apache.org>
Authored: Mon Oct 5 19:03:08 2015 +0200
Committer: Ralph Goers <rg...@nextiva.com>
Committed: Sun Oct 11 12:40:43 2015 -0700

----------------------------------------------------------------------
 .../log4j/core/layout/AbstractStringLayout.java | 23 ++++++++++++--------
 src/changes/changes.xml                         |  2 +-
 src/site/xdoc/manual/layouts.xml.vm             |  5 +++++
 3 files changed, 20 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ce419dc1/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 0001b20..d48ee00 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
@@ -24,10 +24,13 @@ import org.apache.logging.log4j.core.LogEvent;
 
 /**
  * Abstract base class for Layouts that result in a String.
+ * <p>
+ * Since 2.4.1, this class has custom logic to convert ISO-8859-1 or US-ASCII Strings to byte[] arrays to improve
+ * performance: all characters are simply cast to bytes.
  */
 /*
- * Implementation note: prefer String.getBytes(String) to String.getBytes(Charset) for performance reasons.
- * See https://issues.apache.org/jira/browse/LOG4J2-935 for details.
+ * Implementation note: prefer String.getBytes(String) to String.getBytes(Charset) for performance reasons. See
+ * https://issues.apache.org/jira/browse/LOG4J2-935 for details.
  */
 public abstract class AbstractStringLayout extends AbstractLayout<String> {
 
@@ -35,7 +38,7 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
      * Default length for new StringBuilder instances: {@value} .
      */
     protected static final int DEFAULT_STRING_BUILDER_SIZE = 1024;
-    
+
     private final static ThreadLocal<StringBuilder> threadLocal = new ThreadLocal<>();
 
     private static final long serialVersionUID = 1L;
@@ -46,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 isIso8859_1;
+    private final boolean isDirectSingleByteMapping;
 
     protected AbstractStringLayout(final Charset charset) {
         this(charset, null, null);
@@ -56,7 +59,8 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
         super(header, footer);
         this.charset = charset == null ? StandardCharsets.UTF_8 : charset;
         this.charsetName = this.charset.name();
-        isIso8859_1 = StandardCharsets.ISO_8859_1.equals(charset);
+        isDirectSingleByteMapping = StandardCharsets.ISO_8859_1.equals(charset)
+                || StandardCharsets.US_ASCII.equals(charset);
     }
 
     /**
@@ -69,7 +73,7 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
     static byte[] toBytes(final String str, final Charset charset) {
         if (str != null) {
             if (StandardCharsets.ISO_8859_1.equals(charset)) {
-                return customEncode(str);
+                return encodeSingleByteChars(str);
             }
             final Charset actual = charset != null ? charset : Charset.defaultCharset();
             try { // LOG4J2-935: String.getBytes(String) gives better performance
@@ -97,8 +101,8 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
     }
 
     protected byte[] getBytes(final String s) {
-        if (isIso8859_1) { // rely on branch prediction to eliminate this check if false
-            return customEncode(s);
+        if (isDirectSingleByteMapping) { // rely on branch prediction to eliminate this check if false
+            return encodeSingleByteChars(s);
         }
         try { // LOG4J2-935: String.getBytes(String) gives better performance
             return s.getBytes(charsetName);
@@ -109,11 +113,12 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
 
     /**
      * Encode the specified string by casting each character to a byte.
+     * 
      * @param s the string to encode
      * @return the encoded String
      * @see https://issues.apache.org/jira/browse/LOG4J2-1151
      */
-    private static byte[] customEncode(String s) {
+    private static byte[] encodeSingleByteChars(String s) {
         final int length = s.length();
         final byte[] result = new byte[length];
         for (int i = 0; i < length; i++) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ce419dc1/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 7ad26f1..f7f5df1 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -67,7 +67,7 @@
         Web site corrections and updates.
       </action>
       <action issue="LOG4J2-1151" dev="rpopma" type="update">
-        Performance improvement: backport fast Java 8 String to byte[] encoder to AbstractStringLayout.
+        Performance improvement: backport Java 8 fast ISO-8859-1 String to byte[] encoder to AbstractStringLayout.
       </action>
       <action issue="LOG4J2-935" dev="rpopma" type="update">
         Performance improvement when converting Strings to byte[] arrays.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ce419dc1/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 ee1270a..6075b6a 100644
--- a/src/site/xdoc/manual/layouts.xml.vm
+++ b/src/site/xdoc/manual/layouts.xml.vm
@@ -49,6 +49,11 @@
           where the default there is UTF-8. Each layout that extends <code>org.apache.logging.log4j.core.layout.AbstractStringLayout</code> 
           can provide its own default. See each layout below.
         </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.
+        </p>
         <a name="CSVLayouts"/>
         <subsection name="CSV Layouts">
           <p>