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">