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

albumenj pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.2 by this push:
     new 247eeb39a5 Enhance logger adapter to use a configured logger (#10952)
247eeb39a5 is described below

commit 247eeb39a5eedae2b9f37d1ed032da3497672e6f
Author: Albumen Kevin <[email protected]>
AuthorDate: Sat Nov 26 10:39:34 2022 +0800

    Enhance logger adapter to use a configured logger (#10952)
---
 dubbo-common/pom.xml                               |  2 +
 .../dubbo/common/json/impl/FastJson2Impl.java      |  2 +-
 .../apache/dubbo/common/logger/LoggerAdapter.java  | 10 +++
 .../apache/dubbo/common/logger/LoggerFactory.java  | 72 +++++++++++++++-------
 .../dubbo/common/logger/jcl/JclLoggerAdapter.java  |  2 +-
 .../dubbo/common/logger/jdk/JdkLoggerAdapter.java  | 15 ++++-
 .../common/logger/log4j/Log4jLoggerAdapter.java    | 31 +++++++++-
 .../common/logger/log4j2/Log4j2LoggerAdapter.java  |  8 ++-
 .../common/logger/slf4j/Slf4jLoggerAdapter.java    | 13 +++-
 dubbo-container/dubbo-container-spring/pom.xml     | 10 +++
 10 files changed, 135 insertions(+), 30 deletions(-)

diff --git a/dubbo-common/pom.xml b/dubbo-common/pom.xml
index a122539922..d8c60c7f74 100644
--- a/dubbo-common/pom.xml
+++ b/dubbo-common/pom.xml
@@ -40,10 +40,12 @@
         <dependency>
             <groupId>commons-logging</groupId>
             <artifactId>commons-logging</artifactId>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>log4j</groupId>
             <artifactId>log4j</artifactId>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.logging.log4j</groupId>
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/json/impl/FastJson2Impl.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/json/impl/FastJson2Impl.java
index 24147dc32a..cabf75d004 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/json/impl/FastJson2Impl.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/json/impl/FastJson2Impl.java
@@ -30,7 +30,7 @@ public class FastJson2Impl extends AbstractJSONImpl {
         try {
             Class<?> aClass = ClassUtils.forName("com.alibaba.fastjson2.JSON");
             return aClass != null;
-        } catch (Throwable t) {
+        } catch (Exception t) {
             return false;
         }
     }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerAdapter.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerAdapter.java
index fc644e5ad4..6c668592d3 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerAdapter.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerAdapter.java
@@ -70,4 +70,14 @@ public interface LoggerAdapter {
      * @param file logging file
      */
     void setFile(File file);
+
+    /**
+     * Return is the current logger has been configured.
+     * Used to check if logger is available to use.
+     *
+     * @return true if the current logger has been configured
+     */
+    default boolean isConfigured() {
+        return true;
+    }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerFactory.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerFactory.java
index 91c0e60020..56b2ddb74c 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerFactory.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerFactory.java
@@ -41,25 +41,25 @@ public class LoggerFactory {
 
     private static final ConcurrentMap<String, FailsafeLogger> LOGGERS = new 
ConcurrentHashMap<>();
     private static final ConcurrentMap<String, FailsafeErrorTypeAwareLogger> 
ERROR_TYPE_AWARE_LOGGERS = new ConcurrentHashMap<>();
-    private static volatile LoggerAdapter LOGGER_ADAPTER;
+    private static volatile LoggerAdapter loggerAdapter;
 
     // search common-used logging frameworks
     static {
         String logger = System.getProperty("dubbo.application.logger", "");
         switch (logger) {
-            case "slf4j":
+            case Slf4jLoggerAdapter.NAME:
                 setLoggerAdapter(new Slf4jLoggerAdapter());
                 break;
-            case "jcl":
+            case JclLoggerAdapter.NAME:
                 setLoggerAdapter(new JclLoggerAdapter());
                 break;
-            case "log4j":
+            case Log4jLoggerAdapter.NAME:
                 setLoggerAdapter(new Log4jLoggerAdapter());
                 break;
-            case "jdk":
+            case JdkLoggerAdapter.NAME:
                 setLoggerAdapter(new JdkLoggerAdapter());
                 break;
-            case "log4j2":
+            case Log4j2LoggerAdapter.NAME:
                 setLoggerAdapter(new Log4j2LoggerAdapter());
                 break;
             default:
@@ -70,15 +70,44 @@ public class LoggerFactory {
                     JclLoggerAdapter.class,
                     JdkLoggerAdapter.class
                 );
+                boolean found = false;
+                // try to use the first available adapter
                 for (Class<? extends LoggerAdapter> clazz : candidates) {
                     try {
-                        LoggerAdapter loggerAdapter = clazz.newInstance();
+                        LoggerAdapter loggerAdapter = 
clazz.getConstructor().newInstance();
+                        loggerAdapter.getLogger(LoggerFactory.class);
+                        if (loggerAdapter.isConfigured()) {
+                            setLoggerAdapter(loggerAdapter);
+                            found = true;
+                            break;
+                        }
+                    } catch (Exception | LinkageError ignored) {
+                        // ignore
+                    }
+                }
+                if (found) {
+                    break;
+                }
+
+                System.err.println("Dubbo: Unable to find a proper configured 
logger to log out.");
+                for (Class<? extends LoggerAdapter> clazz : candidates) {
+                    try {
+                        LoggerAdapter loggerAdapter = 
clazz.getConstructor().newInstance();
                         loggerAdapter.getLogger(LoggerFactory.class);
                         setLoggerAdapter(loggerAdapter);
+                        found = true;
                         break;
                     } catch (Throwable ignored) {
+                        // ignore
                     }
                 }
+                if (found) {
+                    System.err.println("Dubbo: Using default logger: " + 
loggerAdapter.getClass().getName() + ". " +
+                        "If you cannot see any log, please configure 
-Ddubbo.application.logger property to your preferred logging framework.");
+                } else {
+                    System.err.println("Dubbo: Unable to find any available 
logger adapter to log out. Dubbo logs will be ignored. " +
+                        "Please configure -Ddubbo.application.logger property 
and add corresponding logging library to classpath.");
+                }
         }
     }
 
@@ -98,13 +127,13 @@ public class LoggerFactory {
      */
     public static void setLoggerAdapter(LoggerAdapter loggerAdapter) {
         if (loggerAdapter != null) {
-            if (loggerAdapter == LOGGER_ADAPTER) {
+            if (loggerAdapter == LoggerFactory.loggerAdapter) {
                 return;
             }
             loggerAdapter.getLogger(LoggerFactory.class.getName());
-            LoggerFactory.LOGGER_ADAPTER = loggerAdapter;
+            LoggerFactory.loggerAdapter = loggerAdapter;
             for (Map.Entry<String, FailsafeLogger> entry : LOGGERS.entrySet()) 
{
-                
entry.getValue().setLogger(LOGGER_ADAPTER.getLogger(entry.getKey()));
+                
entry.getValue().setLogger(LoggerFactory.loggerAdapter.getLogger(entry.getKey()));
             }
         }
     }
@@ -116,7 +145,7 @@ public class LoggerFactory {
      * @return logger
      */
     public static Logger getLogger(Class<?> key) {
-        return LOGGERS.computeIfAbsent(key.getName(), name -> new 
FailsafeLogger(LOGGER_ADAPTER.getLogger(name)));
+        return LOGGERS.computeIfAbsent(key.getName(), name -> new 
FailsafeLogger(loggerAdapter.getLogger(name)));
     }
 
     /**
@@ -126,7 +155,7 @@ public class LoggerFactory {
      * @return logger provider
      */
     public static Logger getLogger(String key) {
-        return LOGGERS.computeIfAbsent(key, k -> new 
FailsafeLogger(LOGGER_ADAPTER.getLogger(k)));
+        return LOGGERS.computeIfAbsent(key, k -> new 
FailsafeLogger(loggerAdapter.getLogger(k)));
     }
 
     /**
@@ -136,7 +165,7 @@ public class LoggerFactory {
      * @return error type aware logger
      */
     public static ErrorTypeAwareLogger getErrorTypeAwareLogger(Class<?> key) {
-        return ERROR_TYPE_AWARE_LOGGERS.computeIfAbsent(key.getName(), name -> 
new FailsafeErrorTypeAwareLogger(LOGGER_ADAPTER.getLogger(name)));
+        return ERROR_TYPE_AWARE_LOGGERS.computeIfAbsent(key.getName(), name -> 
new FailsafeErrorTypeAwareLogger(loggerAdapter.getLogger(name)));
     }
 
     /**
@@ -146,7 +175,7 @@ public class LoggerFactory {
      * @return error type aware logger
      */
     public static ErrorTypeAwareLogger getErrorTypeAwareLogger(String key) {
-        return ERROR_TYPE_AWARE_LOGGERS.computeIfAbsent(key, k -> new 
FailsafeErrorTypeAwareLogger(LOGGER_ADAPTER.getLogger(k)));
+        return ERROR_TYPE_AWARE_LOGGERS.computeIfAbsent(key, k -> new 
FailsafeErrorTypeAwareLogger(loggerAdapter.getLogger(k)));
     }
 
     /**
@@ -155,7 +184,7 @@ public class LoggerFactory {
      * @return logging level
      */
     public static Level getLevel() {
-        return LOGGER_ADAPTER.getLevel();
+        return loggerAdapter.getLevel();
     }
 
     /**
@@ -164,7 +193,7 @@ public class LoggerFactory {
      * @param level logging level
      */
     public static void setLevel(Level level) {
-        LOGGER_ADAPTER.setLevel(level);
+        loggerAdapter.setLevel(level);
     }
 
     /**
@@ -173,7 +202,7 @@ public class LoggerFactory {
      * @return current logging file
      */
     public static File getFile() {
-        return LOGGER_ADAPTER.getFile();
+        return loggerAdapter.getFile();
     }
 
     /**
@@ -191,10 +220,11 @@ public class LoggerFactory {
         List<String> result = new LinkedList<>();
         for (Map.Entry<Class<? extends LoggerAdapter>, String> entry : 
candidates.entrySet()) {
             try {
-                LoggerAdapter loggerAdapter = entry.getKey().newInstance();
+                LoggerAdapter loggerAdapter = 
entry.getKey().getConstructor().newInstance();
                 loggerAdapter.getLogger(LoggerFactory.class);
                 result.add(entry.getValue());
-            } catch (Throwable ignored) {
+            } catch (Exception ignored) {
+                // ignored
             }
         }
         return result;
@@ -213,9 +243,9 @@ public class LoggerFactory {
         candidates.put(JclLoggerAdapter.class, "jcl");
         candidates.put(JdkLoggerAdapter.class, "jdk");
 
-        String name = candidates.get(LOGGER_ADAPTER.getClass());
+        String name = candidates.get(loggerAdapter.getClass());
         if (name == null) {
-            name = LOGGER_ADAPTER.getClass().getSimpleName();
+            name = loggerAdapter.getClass().getSimpleName();
         }
         return name;
     }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLoggerAdapter.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLoggerAdapter.java
index 959a5136df..1751c602e9 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLoggerAdapter.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLoggerAdapter.java
@@ -25,7 +25,7 @@ import org.apache.commons.logging.LogFactory;
 import java.io.File;
 
 public class JclLoggerAdapter implements LoggerAdapter {
-
+    public static final String NAME = "jcl";
     private Level level;
     private File file;
 
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jdk/JdkLoggerAdapter.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jdk/JdkLoggerAdapter.java
index 19041304b1..43f32b1728 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jdk/JdkLoggerAdapter.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jdk/JdkLoggerAdapter.java
@@ -29,19 +29,23 @@ import java.util.logging.LogManager;
 
 public class JdkLoggerAdapter implements LoggerAdapter {
 
+    public static final String NAME = "jdk";
     private static final String GLOBAL_LOGGER_NAME = "global";
 
     private File file;
 
+    private boolean propertiesLoaded = false;
+
     public JdkLoggerAdapter() {
         try {
             InputStream in = 
Thread.currentThread().getContextClassLoader().getResourceAsStream("logging.properties");
             if (in != null) {
                 LogManager.getLogManager().readConfiguration(in);
+                propertiesLoaded = true;
             } else {
                 System.err.println("No such logging.properties in classpath 
for jdk logging config!");
             }
-        } catch (Throwable t) {
+        } catch (Exception t) {
             System.err.println("Failed to load logging.properties in classpath 
for jdk logging config, cause: " + t.getMessage());
         }
         try {
@@ -56,7 +60,8 @@ public class JdkLoggerAdapter implements LoggerAdapter {
                     }
                 }
             }
-        } catch (Throwable t) {
+        } catch (Exception ignored) {
+            // ignore
         }
     }
 
@@ -133,7 +138,11 @@ public class JdkLoggerAdapter implements LoggerAdapter {
 
     @Override
     public void setFile(File file) {
-
+        // ignore
     }
 
+    @Override
+    public boolean isConfigured() {
+        return propertiesLoaded;
+    }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/log4j/Log4jLoggerAdapter.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/log4j/Log4jLoggerAdapter.java
index 5febaf2501..fad4605fa5 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/log4j/Log4jLoggerAdapter.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/log4j/Log4jLoggerAdapter.java
@@ -29,6 +29,7 @@ import java.util.Enumeration;
 
 public class Log4jLoggerAdapter implements LoggerAdapter {
 
+    public static final String NAME = "log4j";
     private File file;
 
     @SuppressWarnings("unchecked")
@@ -49,7 +50,8 @@ public class Log4jLoggerAdapter implements LoggerAdapter {
                     }
                 }
             }
-        } catch (Throwable t) {
+        } catch (Exception t) {
+            // ignore
         }
     }
 
@@ -126,7 +128,32 @@ public class Log4jLoggerAdapter implements LoggerAdapter {
 
     @Override
     public void setFile(File file) {
-
+        // ignore
     }
 
+    @Override
+    public boolean isConfigured() {
+        boolean hasAppender = false;
+        try {
+            org.apache.log4j.Logger logger = LogManager.getRootLogger();
+            if (logger != null) {
+                Enumeration<Appender> appenders = logger.getAllAppenders();
+                if (appenders != null) {
+                    while (appenders.hasMoreElements()) {
+                        hasAppender = true;
+                        Appender appender = appenders.nextElement();
+                        if (appender instanceof FileAppender) {
+                            FileAppender fileAppender = (FileAppender) 
appender;
+                            String filename = fileAppender.getFile();
+                            file = new File(filename);
+                            break;
+                        }
+                    }
+                }
+            }
+        } catch (Exception t) {
+            // ignore
+        }
+        return hasAppender;
+    }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/log4j2/Log4j2LoggerAdapter.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/log4j2/Log4j2LoggerAdapter.java
index 76f29dd73e..0a74a63739 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/log4j2/Log4j2LoggerAdapter.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/log4j2/Log4j2LoggerAdapter.java
@@ -25,11 +25,11 @@ import org.apache.logging.log4j.LogManager;
 import java.io.File;
 
 public class Log4j2LoggerAdapter implements LoggerAdapter {
+    public static final String NAME = "log4j2";
 
     private Level level;
 
     public Log4j2LoggerAdapter() {
-
     }
 
     private static org.apache.logging.log4j.Level toLog4j2Level(Level level) {
@@ -103,5 +103,11 @@ public class Log4j2LoggerAdapter implements LoggerAdapter {
 
     @Override
     public void setFile(File file) {
+        // ignore
+    }
+
+    @Override
+    public boolean isConfigured() {
+        return true;
     }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/slf4j/Slf4jLoggerAdapter.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/slf4j/Slf4jLoggerAdapter.java
index c28c8d8ef0..1f56242dda 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/slf4j/Slf4jLoggerAdapter.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/slf4j/Slf4jLoggerAdapter.java
@@ -19,11 +19,12 @@ package org.apache.dubbo.common.logger.slf4j;
 import org.apache.dubbo.common.logger.Level;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerAdapter;
+import org.apache.dubbo.common.utils.ClassUtils;
 
 import java.io.File;
 
 public class Slf4jLoggerAdapter implements LoggerAdapter {
-
+    public static final String NAME = "slf4j";
     private Level level;
     private File file;
 
@@ -57,4 +58,14 @@ public class Slf4jLoggerAdapter implements LoggerAdapter {
         this.file = file;
     }
 
+    @Override
+    public boolean isConfigured() {
+        try {
+            ClassUtils.forName("org.slf4j.impl.StaticLoggerBinder");
+            return true;
+        } catch (ClassNotFoundException ignore) {
+            // ignore
+        }
+        return false;
+    }
 }
diff --git a/dubbo-container/dubbo-container-spring/pom.xml 
b/dubbo-container/dubbo-container-spring/pom.xml
index ea11ebfe63..880f041e32 100644
--- a/dubbo-container/dubbo-container-spring/pom.xml
+++ b/dubbo-container/dubbo-container-spring/pom.xml
@@ -39,5 +39,15 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>

Reply via email to