This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-java.git


The following commit(s) were added to refs/heads/main by this push:
     new c30b98d91b Fix replaceParam when the replaced string contains a 
replacement marker (#782)
c30b98d91b is described below

commit c30b98d91b9c93deb849709805ca8806f27e2f95
Author: 袁世超 <[email protected]>
AuthorDate: Wed Nov 26 19:55:19 2025 +0800

    Fix replaceParam when the replaced string contains a replacement marker 
(#782)
---
 CHANGES.md                                         |  1 +
 .../agent/core/logging/core/AbstractLogger.java    | 16 +++----
 .../core/logging/core/AbstractLoggerTest.java      | 56 ++++++++++++++++++++++
 3 files changed, 64 insertions(+), 9 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 45b20f1aa8..b27ad9805b 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -22,6 +22,7 @@ Release Notes.
 * Fix Gateway 2.0.x plugin not activated for spring-cloud-starter-gateway 
2.0.0.RELEASE.
 * Support kafka-clients-3.9.x intercept.
 * Upgrade kafka-clients version in optional-reporter-plugins to 3.9.1.
+* Fix AbstractLogger replaceParam when the replaced string contains a 
replacement marker.
 
 All issues and pull requests are 
[here](https://github.com/apache/skywalking/milestone/242?closed=1)
 
diff --git 
a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/core/AbstractLogger.java
 
b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/core/AbstractLogger.java
index 20b55589f9..4020359d0a 100644
--- 
a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/core/AbstractLogger.java
+++ 
b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/core/AbstractLogger.java
@@ -32,7 +32,6 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.regex.Matcher;
 
 /**
  * An abstract class to simplify the real implementation of the loggers.
@@ -189,18 +188,17 @@ public abstract class AbstractLogger implements ILog {
         int startSize = 0;
         int parametersIndex = 0;
         int index;
-        String tmpMessage = message;
-        while ((index = message.indexOf("{}", startSize)) != -1) {
+        StringBuilder sb = new StringBuilder(message);
+        while ((index = sb.indexOf("{}", startSize)) != -1) {
             if (parametersIndex >= parameters.length) {
                 break;
             }
-            /**
-             * @Fix the Illegal group reference issue
-             */
-            tmpMessage = tmpMessage.replaceFirst("\\{\\}", 
Matcher.quoteReplacement(String.valueOf(parameters[parametersIndex++])));
-            startSize = index + 2;
+
+            String replaced = String.valueOf(parameters[parametersIndex++]);
+            sb.replace(index, index + 2, replaced);
+            startSize = index + replaced.length();
         }
-        return tmpMessage;
+        return sb.toString();
     }
 
     protected void logger(LogLevel level, String message, Throwable e) {
diff --git 
a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/logging/core/AbstractLoggerTest.java
 
b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/logging/core/AbstractLoggerTest.java
new file mode 100644
index 0000000000..1d56d7700b
--- /dev/null
+++ 
b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/logging/core/AbstractLoggerTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.agent.core.logging.core;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class AbstractLoggerTest {
+
+    @Test
+    public void replaceParamNormal() {
+        TestLogger logger = new TestLogger("AbstractLoggerTest");
+        String result = logger.testReplaceParam("from {} to {}", "a", "b");
+        assertEquals("from a to b", result);
+    }
+
+    @Test
+    public void replaceParamWithReplaceMark() {
+        TestLogger logger = new TestLogger("AbstractLoggerTest");
+        String result = logger.testReplaceParam("from {} to {}", "a={}", 
"b={}");
+        assertEquals("from a={} to b={}", result);
+    }
+
+    private static class TestLogger extends AbstractLogger {
+
+        public TestLogger(String targetClass) {
+            super(targetClass);
+        }
+
+        @Override
+        protected String format(LogLevel level, String message, Throwable e) {
+            return message;
+        }
+
+        String testReplaceParam(String message, Object... parameters) {
+            return replaceParam(message, parameters);
+        }
+    }
+}
\ No newline at end of file

Reply via email to