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

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 7c6314cb9f0 optimize agent log (#23846)
7c6314cb9f0 is described below

commit 7c6314cb9f008f5e2decebd88cad2747e2c1c3d7
Author: jiangML <[email protected]>
AuthorDate: Tue Jan 31 15:02:26 2023 +0800

    optimize agent log (#23846)
    
    * add log-api and log-to-slf4j
    
    * optimize code
    
    * optimize package name
    
    * add license
    
    * add license for pom
    
    * add NOPAgentLogger and optimize AgentLoggerFactory
    
    * optimize PluginLifecycleServiceManager
    
    * fix error about classloader
    
    * rename IAgentLoggerFactory to AgentLoggerFactorySPI
    
    * optimize SLF4JAgentLoggerFactory
---
 agent/core/pom.xml                                 |  11 ++
 .../advisor/config/AdvisorConfigurationLoader.java |   4 +-
 .../executor/type/ConstructorAdviceExecutor.java   |   4 +-
 .../type/InstanceMethodAdviceExecutor.java         |   4 +-
 .../executor/type/StaticMethodAdviceExecutor.java  |   4 +-
 .../agent/core/builder/AgentLoggingListener.java   |   4 +-
 .../impl/MethodAdvisorBuilderInterceptor.java      |  10 +-
 .../agent/core/log/AgentLoggerClassLoader.java     |   2 +-
 .../AgentLoggerClassLoaderFactory.java}            |  49 +++---
 .../agent/core/log/AgentLoggerFactory.java         | 172 ++++-----------------
 .../core/plugin/PluginLifecycleServiceManager.java |  20 +--
 .../agent/core/plugin/jar/PluginJarLoader.java     |   4 +-
 .../agent/core/spi/AgentServiceLoader.java         |  23 ++-
 agent/log/log-api/pom.xml                          |  47 ++++++
 .../shardingsphere/agent/log/api/AgentLogger.java  |  69 +++++++++
 .../agent/log/api/impl/NOPAgentLogger.java}        |  43 ++++--
 .../agent/log/spi/AgentLoggerFactorySPI.java}      |  33 ++--
 agent/log/log-to-slf4j/pom.xml                     |  44 ++++++
 .../agent/log/slf4j/SLF4JAgentLogger.java          |  61 ++++++++
 .../agent/log/slf4j/SLF4JAgentLoggerFactory.java}  |  28 ++--
 ...rdingsphere.agent.log.spi.AgentLoggerFactorySPI |  18 +++
 agent/log/pom.xml                                  |  35 +++++
 agent/pom.xml                                      |   1 +
 distribution/agent/pom.xml                         |   5 +
 .../shardingsphere-agent-binary-distribution.xml   |   1 +
 25 files changed, 458 insertions(+), 238 deletions(-)

diff --git a/agent/core/pom.xml b/agent/core/pom.xml
index 47bcdad9a4e..f21c35c4f88 100644
--- a/agent/core/pom.xml
+++ b/agent/core/pom.xml
@@ -37,6 +37,11 @@
             <artifactId>shardingsphere-agent-api</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-agent-log-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         
         <dependency>
             <groupId>net.bytebuddy</groupId>
@@ -62,6 +67,12 @@
             <artifactId>jul-to-slf4j</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-agent-log-to-slf4j</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
     
     <build>
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java
index fc06dc8fd8f..125fb5eb7ca 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java
@@ -22,9 +22,9 @@ import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.agent.core.advisor.config.yaml.loader.YamlAdvisorsConfigurationLoader;
 import 
org.apache.shardingsphere.agent.core.advisor.config.yaml.swapper.YamlAdvisorsConfigurationSwapper;
 import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
-import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory.Logger;
 import 
org.apache.shardingsphere.agent.core.plugin.classloader.AgentPluginClassLoader;
 import org.apache.shardingsphere.agent.core.plugin.jar.PluginJarLoader;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
 
 import java.io.InputStream;
 import java.util.Collection;
@@ -38,7 +38,7 @@ import java.util.jar.JarFile;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class AdvisorConfigurationLoader {
     
-    private static final Logger LOGGER = 
AgentLoggerFactory.getLogger(PluginJarLoader.class);
+    private static final AgentLogger LOGGER = 
AgentLoggerFactory.getAgentLogger(PluginJarLoader.class);
     
     /**
      * Load advisor configurations.
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/ConstructorAdviceExecutor.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/ConstructorAdviceExecutor.java
index 9015f4e25ac..f25eaf0e2ca 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/ConstructorAdviceExecutor.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/ConstructorAdviceExecutor.java
@@ -30,8 +30,8 @@ import 
org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
 import org.apache.shardingsphere.agent.api.advice.type.ConstructorAdvice;
 import org.apache.shardingsphere.agent.core.advisor.executor.AdviceExecutor;
 import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
-import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory.Logger;
 import org.apache.shardingsphere.agent.core.plugin.PluginContext;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
 
 import java.util.Collection;
 import java.util.Map;
@@ -43,7 +43,7 @@ import java.util.Map.Entry;
 @RequiredArgsConstructor
 public final class ConstructorAdviceExecutor implements AdviceExecutor {
     
-    private static final Logger LOGGER = 
AgentLoggerFactory.getLogger(ConstructorAdviceExecutor.class);
+    private static final AgentLogger LOGGER = 
AgentLoggerFactory.getAgentLogger(ConstructorAdviceExecutor.class);
     
     private final Map<String, Collection<ConstructorAdvice>> advices;
     
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/InstanceMethodAdviceExecutor.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/InstanceMethodAdviceExecutor.java
index 4426967f000..20a793af70a 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/InstanceMethodAdviceExecutor.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/InstanceMethodAdviceExecutor.java
@@ -32,8 +32,8 @@ import 
org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
 import org.apache.shardingsphere.agent.api.advice.type.InstanceMethodAdvice;
 import org.apache.shardingsphere.agent.core.advisor.executor.AdviceExecutor;
 import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
-import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory.Logger;
 import org.apache.shardingsphere.agent.core.plugin.PluginContext;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
 
 import java.lang.reflect.Method;
 import java.util.Collection;
@@ -47,7 +47,7 @@ import java.util.concurrent.Callable;
 @RequiredArgsConstructor
 public final class InstanceMethodAdviceExecutor implements AdviceExecutor {
     
-    private static final Logger LOGGER = 
AgentLoggerFactory.getLogger(InstanceMethodAdviceExecutor.class);
+    private static final AgentLogger LOGGER = 
AgentLoggerFactory.getAgentLogger(InstanceMethodAdviceExecutor.class);
     
     private final Map<String, Collection<InstanceMethodAdvice>> advices;
     
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/StaticMethodAdviceExecutor.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/StaticMethodAdviceExecutor.java
index 53b543abae4..a802a88ca02 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/StaticMethodAdviceExecutor.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/type/StaticMethodAdviceExecutor.java
@@ -30,8 +30,8 @@ import net.bytebuddy.matcher.ElementMatchers;
 import org.apache.shardingsphere.agent.api.advice.type.StaticMethodAdvice;
 import org.apache.shardingsphere.agent.core.advisor.executor.AdviceExecutor;
 import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
-import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory.Logger;
 import org.apache.shardingsphere.agent.core.plugin.PluginContext;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
 
 import java.lang.reflect.Method;
 import java.util.Collection;
@@ -45,7 +45,7 @@ import java.util.concurrent.Callable;
 @RequiredArgsConstructor
 public final class StaticMethodAdviceExecutor implements AdviceExecutor {
     
-    private static final Logger LOGGER = 
AgentLoggerFactory.getLogger(StaticMethodAdviceExecutor.class);
+    private static final AgentLogger LOGGER = 
AgentLoggerFactory.getAgentLogger(StaticMethodAdviceExecutor.class);
     
     private final Map<String, Collection<StaticMethodAdvice>> advices;
     
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentLoggingListener.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentLoggingListener.java
index 634a6430c1b..270eb28f6f4 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentLoggingListener.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentLoggingListener.java
@@ -22,7 +22,7 @@ import net.bytebuddy.description.type.TypeDescription;
 import net.bytebuddy.dynamic.DynamicType;
 import net.bytebuddy.utility.JavaModule;
 import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
-import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory.Logger;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
 
 /**
  * Agent logging listener.
@@ -30,7 +30,7 @@ import 
org.apache.shardingsphere.agent.core.log.AgentLoggerFactory.Logger;
 @SuppressWarnings("NullableProblems")
 public final class AgentLoggingListener implements Listener {
     
-    private static final Logger LOGGER = 
AgentLoggerFactory.getLogger(AgentLoggingListener.class);
+    private static final AgentLogger LOGGER = 
AgentLoggerFactory.getAgentLogger(AgentLoggingListener.class);
     
     @Override
     public void onDiscovery(final String typeName, final ClassLoader 
classLoader, final JavaModule module, final boolean loaded) {
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/interceptor/impl/MethodAdvisorBuilderInterceptor.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/interceptor/impl/MethodAdvisorBuilderInterceptor.java
index d7d78f8e0f0..ab8d82f6fc8 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/interceptor/impl/MethodAdvisorBuilderInterceptor.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/interceptor/impl/MethodAdvisorBuilderInterceptor.java
@@ -20,13 +20,13 @@ package 
org.apache.shardingsphere.agent.core.builder.interceptor.impl;
 import net.bytebuddy.description.method.MethodDescription.InDefinedShape;
 import net.bytebuddy.description.type.TypeDescription;
 import net.bytebuddy.dynamic.DynamicType.Builder;
-import 
org.apache.shardingsphere.agent.core.builder.interceptor.AgentBuilderInterceptor;
-import org.apache.shardingsphere.agent.core.classloader.ClassLoaderContext;
-import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
-import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory.Logger;
 import 
org.apache.shardingsphere.agent.core.advisor.config.AdvisorConfiguration;
 import org.apache.shardingsphere.agent.core.advisor.executor.AdviceExecutor;
 import 
org.apache.shardingsphere.agent.core.advisor.executor.AdviceExecutorFactory;
+import 
org.apache.shardingsphere.agent.core.builder.interceptor.AgentBuilderInterceptor;
+import org.apache.shardingsphere.agent.core.classloader.ClassLoaderContext;
+import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
 
 import java.util.Optional;
 
@@ -35,7 +35,7 @@ import java.util.Optional;
  */
 public final class MethodAdvisorBuilderInterceptor implements 
AgentBuilderInterceptor {
     
-    private static final Logger LOGGER = 
AgentLoggerFactory.getLogger(MethodAdvisorBuilderInterceptor.class);
+    private static final AgentLogger LOGGER = 
AgentLoggerFactory.getAgentLogger(MethodAdvisorBuilderInterceptor.class);
     
     private final TypeDescription typePointcut;
     
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
index 010a49e8a93..b7c45746254 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
@@ -30,7 +30,7 @@ import java.util.jar.JarFile;
 public final class AgentLoggerClassLoader extends AgentExtraClassLoader {
     
     public AgentLoggerClassLoader(final Collection<JarFile> loggingJars, final 
File resourcePath) {
-        super(AgentLoggerFactory.class.getClassLoader().getParent(), 
loggingJars, Collections.singleton(resourcePath));
+        super(AgentLoggerFactory.class.getClassLoader(), loggingJars, 
Collections.singleton(resourcePath));
     }
     
     public AgentLoggerClassLoader() {
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/jar/PluginJarLoader.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoaderFactory.java
similarity index 57%
copy from 
agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/jar/PluginJarLoader.java
copy to 
agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoaderFactory.java
index 3b3e45538c3..65d6f28b059 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/jar/PluginJarLoader.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoaderFactory.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.plugin.jar;
+package org.apache.shardingsphere.agent.core.log;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import lombok.SneakyThrows;
-import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
-import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory.Logger;
+import org.apache.shardingsphere.agent.core.path.AgentPath;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.URISyntaxException;
 import java.nio.file.FileVisitResult;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -35,43 +35,44 @@ import java.util.LinkedList;
 import java.util.jar.JarFile;
 
 /**
- * Plugin jar loader.
+ * Agent logger class loader factory.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class PluginJarLoader {
-    
-    private static final Logger LOGGER = 
AgentLoggerFactory.getLogger(PluginJarLoader.class);
+public final class AgentLoggerClassLoaderFactory {
     
     /**
-     * Load plugin jars.
-     * 
-     * @param agentRootPath agent root path
-     * @return plugin jars
-     * @throws IOException IO exception
+     * Create agent logger class loader.
+     *
+     * @return agent logger class loader
      */
-    public static Collection<JarFile> load(final File agentRootPath) throws 
IOException {
-        Collection<File> jarFiles = getJarFiles(new 
File(String.join(File.separator, agentRootPath.getPath(), "plugins")));
-        Collection<JarFile> result = new LinkedList<>();
-        for (File each : jarFiles) {
-            result.add(new JarFile(each, true));
-            LOGGER.info("Loaded jar: {}", each.getName());
-        }
-        return result;
+    @SneakyThrows(URISyntaxException.class)
+    public static AgentLoggerClassLoader create() {
+        File agentFle = new 
File(AgentLoggerFactory.class.getProtectionDomain().getCodeSource().getLocation().toURI());
+        return agentFle.isFile() && agentFle.getName().endsWith(".jar") ? new 
AgentLoggerClassLoader(getLoggingJars(), getLoggingResourcePath()) : new 
AgentLoggerClassLoader();
     }
     
     @SneakyThrows(IOException.class)
-    private static Collection<File> getJarFiles(final File file) {
-        Collection<File> result = new LinkedList<>();
-        Files.walkFileTree(file.toPath(), new SimpleFileVisitor<Path>() {
+    private static Collection<JarFile> getLoggingJars() {
+        Collection<JarFile> result = new LinkedList<>();
+        Files.walkFileTree(new File(String.join(File.separator, 
AgentPath.getRootPath().getPath(), "lib")).toPath(), new 
SimpleFileVisitor<Path>() {
             
             @Override
             public FileVisitResult visitFile(final Path path, final 
BasicFileAttributes attributes) {
                 if (path.toFile().isFile() && 
path.toFile().getName().endsWith(".jar")) {
-                    result.add(path.toFile());
+                    result.add(getJarFile(path));
                 }
                 return FileVisitResult.CONTINUE;
             }
         });
         return result;
     }
+    
+    @SneakyThrows(IOException.class)
+    private static JarFile getJarFile(final Path path) {
+        return new JarFile(path.toFile(), true);
+    }
+    
+    private static File getLoggingResourcePath() {
+        return new File(String.join(File.separator, 
AgentPath.getRootPath().getPath(), "conf"));
+    }
 }
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerFactory.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerFactory.java
index c2327a22f37..ebb41a965d4 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerFactory.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerFactory.java
@@ -17,163 +17,53 @@
 
 package org.apache.shardingsphere.agent.core.log;
 
-import lombok.RequiredArgsConstructor;
-import lombok.SneakyThrows;
-import org.apache.shardingsphere.agent.core.path.AgentPath;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.agent.core.spi.AgentServiceLoader;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
+import org.apache.shardingsphere.agent.log.api.impl.NOPAgentLogger;
+import org.apache.shardingsphere.agent.log.spi.AgentLoggerFactorySPI;
 
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.Method;
-import java.net.URISyntaxException;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.jar.JarFile;
+import java.util.Optional;
 
 /**
  * Agent logger factory.
  */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class AgentLoggerFactory {
     
-    private static AgentLoggerClassLoader classLoader;
+    private static AgentLoggerClassLoader agentLoggerClassLoader;
     
     /**
-     * Get logger.
-     * 
-     * @param clazz class
-     * @return logger
+     * Get agent logger.
+     *
+     * @param clazz clazz
+     * @return agent logger
      */
-    @SneakyThrows(ReflectiveOperationException.class)
-    public static Logger getLogger(final Class<?> clazz) {
-        Class<?> factoryClazz = 
getClassLoader().loadClass("org.slf4j.LoggerFactory");
-        Method method = factoryClazz.getMethod("getLogger", Class.class);
-        return new Logger(method.invoke(null, clazz));
+    public static AgentLogger getAgentLogger(final Class<?> clazz) {
+        return AgentLoggerFactory.getAgentLogger(clazz.getName());
     }
     
-    private static AgentLoggerClassLoader getClassLoader() {
-        if (null != classLoader) {
-            return classLoader;
-        }
-        synchronized (AgentLoggerFactory.class) {
-            if (null == classLoader) {
-                classLoader = getAgentLoggerClassLoader();
-            }
-        }
-        return classLoader;
+    /**
+     * Get agent logger.
+     *
+     * @param name name
+     * @return agent logger
+     */
+    public static AgentLogger getAgentLogger(final String name) {
+        Optional<AgentLoggerFactorySPI> loggerFactory = 
AgentServiceLoader.getServiceLoader(getAgentLoggerClassLoader(), 
AgentLoggerFactorySPI.class).getServices().stream().findFirst();
+        return loggerFactory.isPresent() ? 
loggerFactory.get().getAgentLogger(name) : new NOPAgentLogger();
     }
     
-    @SneakyThrows(URISyntaxException.class)
     private static AgentLoggerClassLoader getAgentLoggerClassLoader() {
-        File agentFle = new 
File(AgentLoggerFactory.class.getProtectionDomain().getCodeSource().getLocation().toURI());
-        return agentFle.isFile() && agentFle.getName().endsWith(".jar") ? new 
AgentLoggerClassLoader(getLoggingJars(), getLoggingResourcePath()) : new 
AgentLoggerClassLoader();
-    }
-    
-    @SneakyThrows(IOException.class)
-    private static Collection<JarFile> getLoggingJars() {
-        Collection<JarFile> result = new LinkedList<>();
-        Files.walkFileTree(new File(String.join(File.separator, 
AgentPath.getRootPath().getPath(), "lib")).toPath(), new 
SimpleFileVisitor<Path>() {
-            
-            @Override
-            public FileVisitResult visitFile(final Path path, final 
BasicFileAttributes attributes) {
-                if (path.toFile().isFile() && 
path.toFile().getName().endsWith(".jar")) {
-                    result.add(getJarFile(path));
-                }
-                return FileVisitResult.CONTINUE;
-            }
-        });
-        return result;
-    }
-    
-    @SneakyThrows(IOException.class)
-    private static JarFile getJarFile(final Path path) {
-        return new JarFile(path.toFile(), true);
-    }
-    
-    private static File getLoggingResourcePath() {
-        return new File(String.join(File.separator, 
AgentPath.getRootPath().getPath(), "conf"));
-    }
-    
-    /**
-     * Logger.
-     */
-    @RequiredArgsConstructor
-    public static final class Logger {
-        
-        private final Object logger;
-        
-        /**
-         * Info.
-         * 
-         * @param msg message
-         */
-        public void info(final String msg) {
-            invokeMethod("info", msg);
-        }
-        
-        /**
-         * Info.
-         * 
-         * @param format format
-         * @param arguments arguments
-         */
-        public void info(final String format, final Object... arguments) {
-            invokeMethod("info", format, arguments);
-        }
-        
-        /**
-         * Debug.
-         * 
-         * @param format format
-         * @param arguments arguments
-         */
-        public void debug(final String format, final Object... arguments) {
-            invokeMethod("debug", format, arguments);
+        if (null != agentLoggerClassLoader) {
+            return agentLoggerClassLoader;
         }
-        
-        /**
-         * Debug.
-         * 
-         * @param msg message
-         */
-        public void debug(final String msg) {
-            invokeMethod("debug", msg);
-        }
-        
-        /**
-         * Error.
-         * 
-         * @param format format
-         * @param arguments arguments
-         */
-        public void error(final String format, final Object... arguments) {
-            invokeMethod("error", format, arguments);
-        }
-        
-        /**
-         * Error.
-         * 
-         * @param msg message
-         */
-        public void error(final String msg) {
-            invokeMethod("error", msg);
-        }
-        
-        @SneakyThrows(ReflectiveOperationException.class)
-        private void invokeMethod(final String methodName, final String msg) {
-            Class<?> actualLogger = 
AgentLoggerFactory.getClassLoader().loadClass("org.slf4j.Logger");
-            Method method = actualLogger.getMethod(methodName, String.class);
-            method.invoke(logger, msg);
-        }
-        
-        @SneakyThrows(ReflectiveOperationException.class)
-        private void invokeMethod(final String methodName, final String msg, 
final Object... arguments) {
-            Class<?> actualLogger = 
AgentLoggerFactory.getClassLoader().loadClass("org.slf4j.Logger");
-            Method method = actualLogger.getMethod(methodName, String.class, 
Object[].class);
-            method.invoke(logger, msg, arguments);
+        synchronized (AgentLoggerFactory.class) {
+            if (null == agentLoggerClassLoader) {
+                agentLoggerClassLoader = 
AgentLoggerClassLoaderFactory.create();
+            }
         }
+        return agentLoggerClassLoader;
     }
 }
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginLifecycleServiceManager.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginLifecycleServiceManager.java
index 2c773405a8a..be3ec3ba020 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginLifecycleServiceManager.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginLifecycleServiceManager.java
@@ -21,8 +21,8 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.agent.api.PluginConfiguration;
 import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
-import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory.Logger;
 import org.apache.shardingsphere.agent.core.spi.AgentServiceLoader;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
 import org.apache.shardingsphere.agent.spi.PluginLifecycleService;
 
 import java.io.IOException;
@@ -40,27 +40,27 @@ public final class PluginLifecycleServiceManager {
     
     private static final AtomicBoolean STARTED_FLAG = new AtomicBoolean(false);
     
-    private static final Logger LOGGER = 
AgentLoggerFactory.getLogger(PluginLifecycleServiceManager.class);
+    private static final AgentLogger LOGGER = 
AgentLoggerFactory.getAgentLogger(PluginLifecycleServiceManager.class);
     
     /**
      * Initialize all plugins.
      * 
      * @param pluginConfigs plugin configuration map
      * @param pluginJars plugin jars
-     * @param agentClassLoader agent class loader
+     * @param pluginClassLoader plugin class loader
      * @param isEnhancedForProxy is enhanced for proxy
      */
-    public static void init(final Map<String, PluginConfiguration> 
pluginConfigs, final Collection<JarFile> pluginJars, final ClassLoader 
agentClassLoader, final boolean isEnhancedForProxy) {
+    public static void init(final Map<String, PluginConfiguration> 
pluginConfigs, final Collection<JarFile> pluginJars, final ClassLoader 
pluginClassLoader, final boolean isEnhancedForProxy) {
         if (STARTED_FLAG.compareAndSet(false, true)) {
-            PluginLifecycleServiceManager.start(pluginConfigs, 
agentClassLoader, isEnhancedForProxy);
-            Runtime.getRuntime().addShutdownHook(new Thread(() -> 
PluginLifecycleServiceManager.close(pluginJars)));
+            PluginLifecycleServiceManager.start(pluginConfigs, 
pluginClassLoader, isEnhancedForProxy);
+            Runtime.getRuntime().addShutdownHook(new Thread(() -> 
PluginLifecycleServiceManager.close(pluginClassLoader, pluginJars)));
         }
     }
     
-    private static void start(final Map<String, PluginConfiguration> 
pluginConfigs, final ClassLoader agentClassLoader, final boolean 
isEnhancedForProxy) {
+    private static void start(final Map<String, PluginConfiguration> 
pluginConfigs, final ClassLoader pluginClassLoader, final boolean 
isEnhancedForProxy) {
         ClassLoader originalClassLoader = 
Thread.currentThread().getContextClassLoader();
         try {
-            Thread.currentThread().setContextClassLoader(agentClassLoader);
+            Thread.currentThread().setContextClassLoader(pluginClassLoader);
             for (Entry<String, PluginConfiguration> entry : 
pluginConfigs.entrySet()) {
                 
AgentServiceLoader.getServiceLoader(PluginLifecycleService.class).getServices()
                         .stream().filter(each -> 
each.getType().equalsIgnoreCase(entry.getKey())).findFirst().ifPresent(optional 
-> start(entry.getValue(), optional, isEnhancedForProxy));
@@ -81,8 +81,8 @@ public final class PluginLifecycleServiceManager {
         }
     }
     
-    private static void close(final Collection<JarFile> pluginJars) {
-        
AgentServiceLoader.getServiceLoader(PluginLifecycleService.class).getServices().forEach(each
 -> {
+    private static void close(final ClassLoader pluginClassLoader, final 
Collection<JarFile> pluginJars) {
+        AgentServiceLoader.getServiceLoader(pluginClassLoader, 
PluginLifecycleService.class).getServices().forEach(each -> {
             try {
                 each.close();
                 // CHECKSTYLE:OFF
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/jar/PluginJarLoader.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/jar/PluginJarLoader.java
index 3b3e45538c3..b890cd7ed64 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/jar/PluginJarLoader.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/jar/PluginJarLoader.java
@@ -21,7 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
-import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory.Logger;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
 
 import java.io.File;
 import java.io.IOException;
@@ -40,7 +40,7 @@ import java.util.jar.JarFile;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class PluginJarLoader {
     
-    private static final Logger LOGGER = 
AgentLoggerFactory.getLogger(PluginJarLoader.class);
+    private static final AgentLogger LOGGER = 
AgentLoggerFactory.getAgentLogger(PluginJarLoader.class);
     
     /**
      * Load plugin jars.
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentServiceLoader.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentServiceLoader.java
index 6d028090d27..4d1b6885f82 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentServiceLoader.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentServiceLoader.java
@@ -36,9 +36,9 @@ public final class AgentServiceLoader<T> {
     
     private final Collection<T> services;
     
-    private AgentServiceLoader(final Class<T> service) {
+    private AgentServiceLoader(final ClassLoader classLoader, final Class<T> 
service) {
         validate(service);
-        this.services = load(service);
+        this.services = load(classLoader, service);
     }
     
     private void validate(final Class<T> service) {
@@ -46,9 +46,9 @@ public final class AgentServiceLoader<T> {
         Preconditions.checkArgument(service.isInterface(), "SPI class `%s` is 
not interface.", service);
     }
     
-    private Collection<T> load(final Class<T> service) {
+    private Collection<T> load(final ClassLoader classLoader, final Class<T> 
service) {
         Collection<T> result = new LinkedList<>();
-        for (T each : ServiceLoader.load(service)) {
+        for (T each : ServiceLoader.load(service, classLoader)) {
             result.add(each);
         }
         return result;
@@ -63,6 +63,19 @@ public final class AgentServiceLoader<T> {
      */
     @SuppressWarnings("unchecked")
     public static <T> AgentServiceLoader<T> getServiceLoader(final Class<T> 
service) {
-        return (AgentServiceLoader<T>) LOADERS.computeIfAbsent(service, 
AgentServiceLoader::new);
+        return 
AgentServiceLoader.getServiceLoader(Thread.currentThread().getContextClassLoader(),
 service);
+    }
+    
+    /**
+     * Get singleton agent service loader.
+     *
+     * @param classLoader class loader
+     * @param service service type
+     * @param <T> type of class
+     * @return agent service loader
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> AgentServiceLoader<T> getServiceLoader(final ClassLoader 
classLoader, final Class<T> service) {
+        return (AgentServiceLoader<T>) LOADERS.computeIfAbsent(service, key -> 
new AgentServiceLoader<>(classLoader, service));
     }
 }
diff --git a/agent/log/log-api/pom.xml b/agent/log/log-api/pom.xml
new file mode 100644
index 00000000000..3abbb90be9a
--- /dev/null
+++ b/agent/log/log-api/pom.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.shardingsphere</groupId>
+        <artifactId>shardingsphere-agent-log</artifactId>
+        <version>5.3.2-SNAPSHOT</version>
+    </parent>
+    <artifactId>shardingsphere-agent-log-api</artifactId>
+    <name>${project.artifactId}</name>
+    
+    <dependencies>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jul-to-slf4j</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git 
a/agent/log/log-api/src/main/java/org/apache/shardingsphere/agent/log/api/AgentLogger.java
 
b/agent/log/log-api/src/main/java/org/apache/shardingsphere/agent/log/api/AgentLogger.java
new file mode 100644
index 00000000000..904ea6f5eb4
--- /dev/null
+++ 
b/agent/log/log-api/src/main/java/org/apache/shardingsphere/agent/log/api/AgentLogger.java
@@ -0,0 +1,69 @@
+/*
+ * 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.shardingsphere.agent.log.api;
+
+/**
+ * Agent logger.
+ */
+public interface AgentLogger {
+    
+    /**
+     * Info.
+     *
+     * @param msg message
+     */
+    void info(String msg);
+    
+    /**
+     * Info.
+     *
+     * @param format format
+     * @param arguments arguments
+     */
+    void info(String format, Object... arguments);
+    
+    /**
+     * Error.
+     *
+     * @param format format
+     * @param arguments arguments
+     */
+    void error(String format, Object... arguments);
+    
+    /**
+     * Error.
+     *
+     * @param msg message
+     */
+    void error(String msg);
+    
+    /**
+     * Debug.
+     *
+     * @param format format
+     * @param arguments arguments
+     */
+    void debug(String format, Object... arguments);
+    
+    /**
+     * Debug.
+     *
+     * @param msg message
+     */
+    void debug(String msg);
+}
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
 
b/agent/log/log-api/src/main/java/org/apache/shardingsphere/agent/log/api/impl/NOPAgentLogger.java
similarity index 53%
copy from 
agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
copy to 
agent/log/log-api/src/main/java/org/apache/shardingsphere/agent/log/api/impl/NOPAgentLogger.java
index 010a49e8a93..4c31c5b578c 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
+++ 
b/agent/log/log-api/src/main/java/org/apache/shardingsphere/agent/log/api/impl/NOPAgentLogger.java
@@ -15,25 +15,42 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.log;
+package org.apache.shardingsphere.agent.log.api.impl;
 
-import org.apache.shardingsphere.agent.core.classloader.AgentExtraClassLoader;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.jar.JarFile;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
 
 /**
- * Agent logger class loader.
+ * NOP (no operation) agent logger.
  */
-public final class AgentLoggerClassLoader extends AgentExtraClassLoader {
+public final class NOPAgentLogger implements AgentLogger {
+    
+    @Override
+    public void info(final String msg) {
+        
+    }
+    
+    @Override
+    public void info(final String format, final Object... arguments) {
+        
+    }
+    
+    @Override
+    public void error(final String format, final Object... arguments) {
+        
+    }
+    
+    @Override
+    public void error(final String msg) {
+        
+    }
     
-    public AgentLoggerClassLoader(final Collection<JarFile> loggingJars, final 
File resourcePath) {
-        super(AgentLoggerFactory.class.getClassLoader().getParent(), 
loggingJars, Collections.singleton(resourcePath));
+    @Override
+    public void debug(final String format, final Object... arguments) {
+        
     }
     
-    public AgentLoggerClassLoader() {
-        super(AgentLoggerFactory.class.getClassLoader(), 
Collections.emptyList());
+    @Override
+    public void debug(final String msg) {
+        
     }
 }
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
 
b/agent/log/log-api/src/main/java/org/apache/shardingsphere/agent/log/spi/AgentLoggerFactorySPI.java
similarity index 54%
copy from 
agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
copy to 
agent/log/log-api/src/main/java/org/apache/shardingsphere/agent/log/spi/AgentLoggerFactorySPI.java
index 010a49e8a93..b82a3632fca 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
+++ 
b/agent/log/log-api/src/main/java/org/apache/shardingsphere/agent/log/spi/AgentLoggerFactorySPI.java
@@ -15,25 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.log;
+package org.apache.shardingsphere.agent.log.spi;
 
-import org.apache.shardingsphere.agent.core.classloader.AgentExtraClassLoader;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.jar.JarFile;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
 
 /**
- * Agent logger class loader.
+ * Agent logger factory.
  */
-public final class AgentLoggerClassLoader extends AgentExtraClassLoader {
+public interface AgentLoggerFactorySPI {
     
-    public AgentLoggerClassLoader(final Collection<JarFile> loggingJars, final 
File resourcePath) {
-        super(AgentLoggerFactory.class.getClassLoader().getParent(), 
loggingJars, Collections.singleton(resourcePath));
-    }
+    /**
+     * Get agent logger.
+     *
+     * @param clazz clazz
+     * @return agent logger
+     */
+    AgentLogger getAgentLogger(Class<?> clazz);
     
-    public AgentLoggerClassLoader() {
-        super(AgentLoggerFactory.class.getClassLoader(), 
Collections.emptyList());
-    }
+    /**
+     * Get agent logger.
+     *
+     * @param name name
+     * @return agent logger
+     */
+    AgentLogger getAgentLogger(String name);
 }
diff --git a/agent/log/log-to-slf4j/pom.xml b/agent/log/log-to-slf4j/pom.xml
new file mode 100644
index 00000000000..6381ff31a10
--- /dev/null
+++ b/agent/log/log-to-slf4j/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.shardingsphere</groupId>
+        <artifactId>shardingsphere-agent-log</artifactId>
+        <version>5.3.2-SNAPSHOT</version>
+    </parent>
+    <artifactId>shardingsphere-agent-log-to-slf4j</artifactId>
+    <name>${project.artifactId}</name>
+    
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-agent-log-api</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git 
a/agent/log/log-to-slf4j/src/main/java/org/apache/shardingsphere/agent/log/slf4j/SLF4JAgentLogger.java
 
b/agent/log/log-to-slf4j/src/main/java/org/apache/shardingsphere/agent/log/slf4j/SLF4JAgentLogger.java
new file mode 100644
index 00000000000..dff68335005
--- /dev/null
+++ 
b/agent/log/log-to-slf4j/src/main/java/org/apache/shardingsphere/agent/log/slf4j/SLF4JAgentLogger.java
@@ -0,0 +1,61 @@
+/*
+ * 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.shardingsphere.agent.log.slf4j;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
+import org.slf4j.Logger;
+
+/**
+ * SLF4J agent logger.
+ */
+@RequiredArgsConstructor
+public final class SLF4JAgentLogger implements AgentLogger {
+    
+    private final Logger logger;
+    
+    @Override
+    public void info(final String msg) {
+        logger.info(msg);
+    }
+    
+    @Override
+    public void info(final String format, final Object... arguments) {
+        logger.info(format, arguments);
+    }
+    
+    @Override
+    public void error(final String format, final Object... arguments) {
+        logger.error(format, arguments);
+    }
+    
+    @Override
+    public void error(final String msg) {
+        logger.error(msg);
+    }
+    
+    @Override
+    public void debug(final String format, final Object... arguments) {
+        logger.debug(format, arguments);
+    }
+    
+    @Override
+    public void debug(final String msg) {
+        logger.debug(msg);
+    }
+}
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
 
b/agent/log/log-to-slf4j/src/main/java/org/apache/shardingsphere/agent/log/slf4j/SLF4JAgentLoggerFactory.java
similarity index 51%
copy from 
agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
copy to 
agent/log/log-to-slf4j/src/main/java/org/apache/shardingsphere/agent/log/slf4j/SLF4JAgentLoggerFactory.java
index 010a49e8a93..d7c6502c7db 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
+++ 
b/agent/log/log-to-slf4j/src/main/java/org/apache/shardingsphere/agent/log/slf4j/SLF4JAgentLoggerFactory.java
@@ -15,25 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.log;
+package org.apache.shardingsphere.agent.log.slf4j;
 
-import org.apache.shardingsphere.agent.core.classloader.AgentExtraClassLoader;
+import org.apache.shardingsphere.agent.log.api.AgentLogger;
+import org.apache.shardingsphere.agent.log.spi.AgentLoggerFactorySPI;
+import org.slf4j.LoggerFactory;
 
-import java.io.File;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.jar.JarFile;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * Agent logger class loader.
+ * SLF4J agent logger factory.
  */
-public final class AgentLoggerClassLoader extends AgentExtraClassLoader {
+public final class SLF4JAgentLoggerFactory implements AgentLoggerFactorySPI {
     
-    public AgentLoggerClassLoader(final Collection<JarFile> loggingJars, final 
File resourcePath) {
-        super(AgentLoggerFactory.class.getClassLoader().getParent(), 
loggingJars, Collections.singleton(resourcePath));
+    private static final Map<String, AgentLogger> LOGGER_MAP = new 
ConcurrentHashMap<>();
+    
+    @Override
+    public AgentLogger getAgentLogger(final Class<?> clazz) {
+        return getAgentLogger(clazz.getName());
     }
     
-    public AgentLoggerClassLoader() {
-        super(AgentLoggerFactory.class.getClassLoader(), 
Collections.emptyList());
+    @Override
+    public AgentLogger getAgentLogger(final String name) {
+        return LOGGER_MAP.computeIfAbsent(name, key -> new 
SLF4JAgentLogger(LoggerFactory.getLogger(name)));
     }
 }
diff --git 
a/agent/log/log-to-slf4j/src/main/resources/META-INF/services/org.apache.shardingsphere.agent.log.spi.AgentLoggerFactorySPI
 
b/agent/log/log-to-slf4j/src/main/resources/META-INF/services/org.apache.shardingsphere.agent.log.spi.AgentLoggerFactorySPI
new file mode 100644
index 00000000000..da4b26b7542
--- /dev/null
+++ 
b/agent/log/log-to-slf4j/src/main/resources/META-INF/services/org.apache.shardingsphere.agent.log.spi.AgentLoggerFactorySPI
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.agent.log.slf4j.SLF4JAgentLoggerFactory
diff --git a/agent/log/pom.xml b/agent/log/pom.xml
new file mode 100644
index 00000000000..067b9a3fd84
--- /dev/null
+++ b/agent/log/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.shardingsphere</groupId>
+        <artifactId>shardingsphere-agent</artifactId>
+        <version>5.3.2-SNAPSHOT</version>
+    </parent>
+    <artifactId>shardingsphere-agent-log</artifactId>
+    <packaging>pom</packaging>
+    <name>${project.artifactId}</name>
+    
+    <modules>
+        <module>log-api</module>
+        <module>log-to-slf4j</module>
+    </modules>
+</project>
diff --git a/agent/pom.xml b/agent/pom.xml
index a66e7864252..5b89fa711b8 100644
--- a/agent/pom.xml
+++ b/agent/pom.xml
@@ -32,6 +32,7 @@
         <module>api</module>
         <module>core</module>
         <module>plugins</module>
+        <module>log</module>
     </modules>
     
     <properties>
diff --git a/distribution/agent/pom.xml b/distribution/agent/pom.xml
index 21b7d7a85c5..92fc080f1d8 100644
--- a/distribution/agent/pom.xml
+++ b/distribution/agent/pom.xml
@@ -64,6 +64,11 @@
             <artifactId>shardingsphere-agent-tracing-opentelemetry</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-agent-log-to-slf4j</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         
         <dependency>
             <groupId>ch.qos.logback</groupId>
diff --git 
a/distribution/agent/src/main/assembly/shardingsphere-agent-binary-distribution.xml
 
b/distribution/agent/src/main/assembly/shardingsphere-agent-binary-distribution.xml
index 54283f801c6..8e42293b270 100644
--- 
a/distribution/agent/src/main/assembly/shardingsphere-agent-binary-distribution.xml
+++ 
b/distribution/agent/src/main/assembly/shardingsphere-agent-binary-distribution.xml
@@ -99,6 +99,7 @@
             <includes>
                 <include>org.slf4j:slf4j-api</include>
                 <include>ch.qos.logback:*</include>
+                
<include>org.apache.shardingsphere:shardingsphere-agent-log-to-slf4j</include>
             </includes>
         </dependencySet>
     </dependencySets>

Reply via email to