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);