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 2021/03/21 20:33:51 UTC
[logging-log4j2] branch release-2.x updated: Make adding a prefix
garbage free
This is an automated email from the ASF dual-hosted git repository.
rgoers pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/release-2.x by this push:
new f899e81 Make adding a prefix garbage free
f899e81 is described below
commit f899e8122a4547d8adf166bfa7f6e5278cc76484
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Sun Mar 21 13:33:37 2021 -0700
Make adding a prefix garbage free
---
.../org/apache/logging/log4j/util/Strings.java | 34 +++++++++++++++++++---
.../org/apache/logging/log4j/util/StringsTest.java | 9 ++++++
.../logging/log4j/core/layout/GelfLayout.java | 2 +-
3 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
index c5bdce1..0686558 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
@@ -27,6 +27,8 @@ import java.util.Objects;
*/
public final class Strings {
+ private static final ThreadLocal<StringBuilder> tempStr = ThreadLocal.withInitial(StringBuilder::new);
+
/**
* The empty string.
*/
@@ -283,6 +285,26 @@ public final class Strings {
}
/**
+ * Concatenates 2 Strings without allocation.
+ * @param str1 the first string.
+ * @param str2 the second string.
+ * @return the concatenated String.
+ */
+ public static String concat(String str1, String str2) {
+ if (isEmpty(str1)) {
+ return str2;
+ } else if (isEmpty(str2)) {
+ return str1;
+ }
+ StringBuilder sb = tempStr.get();
+ try {
+ return sb.append(str1).append(str2).toString();
+ } finally {
+ sb.setLength(0);
+ }
+ }
+
+ /**
* Creates a new string repeating given {@code str} {@code count} times.
* @param str input string
* @param count the repetition count
@@ -294,11 +316,15 @@ public final class Strings {
if (count < 0) {
throw new IllegalArgumentException("count");
}
- StringBuilder sb = new StringBuilder(str.length() * count);
- for (int index = 0; index < count; index++) {
- sb.append(str);
+ StringBuilder sb = tempStr.get();
+ try {
+ for (int index = 0; index < count; index++) {
+ sb.append(str);
+ }
+ return sb.toString();
+ } finally {
+ sb.setLength(0);
}
- return sb.toString();
}
}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/StringsTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/StringsTest.java
index cfd5127..78b797a 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/StringsTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/StringsTest.java
@@ -56,6 +56,15 @@ public class StringsTest {
}
@Test
+ public void testConcat() {
+ assertEquals("ab", Strings.concat("a", "b"));
+ assertEquals("a", Strings.concat("a", ""));
+ assertEquals("a", Strings.concat("a", null));
+ assertEquals("b", Strings.concat("", "b"));
+ assertEquals("b", Strings.concat(null, "b"));
+ }
+
+ @Test
public void testJoin() {
assertNull(Strings.join((Iterable<?>) null, '.'));
assertNull(Strings.join((Iterator<?>) null, '.'));
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
index 27f9a5a..156c5d5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
@@ -671,7 +671,7 @@ public final class GelfLayout extends AbstractStringLayout {
public void accept(final String key, final Object value, final StringBuilder stringBuilder) {
if (checker.check(key)) {
stringBuilder.append(QU);
- JsonUtils.quoteAsString(prefix + key, stringBuilder);
+ JsonUtils.quoteAsString(Strings.concat(prefix, key), stringBuilder);
stringBuilder.append("\":\"");
JsonUtils.quoteAsString(toNullSafeString(String.valueOf(value)), stringBuilder);
stringBuilder.append(QC);