Merge pull request #482 from clevertension/my-main

fix Illegal group reference
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/logging/EasyLogger.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/logging/EasyLogger.java
index 1986bf8..246cf49 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/logging/EasyLogger.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/logging/EasyLogger.java
@@ -4,6 +4,8 @@
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.regex.Matcher;
+
 import org.skywalking.apm.agent.core.conf.Config;
 import org.skywalking.apm.agent.core.conf.Constants;
 import org.skywalking.apm.logging.ILog;
@@ -35,8 +37,10 @@
             if (parametersIndex >= parameters.length) {
                 break;
             }
-
-            tmpMessage = tmpMessage.replaceFirst("\\{\\}", String.valueOf(parameters[parametersIndex++]));
+            /**
+             * @Fix the Illegal group reference issue
+             */
+            tmpMessage = tmpMessage.replaceFirst("\\{\\}", Matcher.quoteReplacement(String.valueOf(parameters[parametersIndex++])));
             startSize = index + 2;
         }
         return tmpMessage;
diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/logging/EasyLoggerTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/logging/EasyLoggerTest.java
index e447ea9..e3866d3 100644
--- a/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/logging/EasyLoggerTest.java
+++ b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/logging/EasyLoggerTest.java
@@ -54,13 +54,41 @@
     }
 
     @Test
+    public void testLogWithSpecialChar() {
+        PrintStream output = Mockito.mock(PrintStream.class);
+        System.setOut(output);
+        PrintStream err = Mockito.mock(PrintStream.class);
+        System.setErr(err);
+        EasyLogger logger = new EasyLogger(EasyLoggerTest.class);
+
+        Assert.assertTrue(logger.isDebugEnable());
+        Assert.assertTrue(logger.isInfoEnable());
+        Assert.assertTrue(logger.isWarnEnable());
+        Assert.assertTrue(logger.isErrorEnable());
+
+        logger.debug("$^!@#*()");
+        logger.debug("hello {}", "!@#$%^&*(),./[]:;");
+        logger.info("{}{}");
+        logger.info("hello {}", "{}{}");
+
+        logger.warn("hello {}", "\\");
+        logger.warn("hello \\");
+        logger.error("hello <>..");
+        logger.error("hello ///\\\\", new NullPointerException());
+        logger.error(new NullPointerException(), "hello {}", "&&&**%%");
+
+        Mockito.verify(output, times(9))
+                .println(anyString());
+    }
+
+    @Test
     public void testFormat() {
         NullPointerException exception = new NullPointerException();
         EasyLogger logger = new EasyLogger(EasyLoggerTest.class);
         String formatLines = logger.format(exception);
         String[] lines = formatLines.split(Constants.LINE_SEPARATOR);
         Assert.assertEquals("java.lang.NullPointerException", lines[1]);
-        Assert.assertEquals("\tat org.skywalking.apm.agent.core.logging.EasyLoggerTest.testFormat(EasyLoggerTest.java:58)", lines[2]);
+        Assert.assertEquals("\tat org.skywalking.apm.agent.core.logging.EasyLoggerTest.testFormat(EasyLoggerTest.java:86)", lines[2]);
     }
 
     @AfterClass