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>