Skip to content

Commit

Permalink
Enhancement/logger factory (#3389)
Browse files Browse the repository at this point in the history
* polishing LoggerFactory
* polishing code using map.computeIfAbsent
* fix ci failure
* remove unnecessary break in switch
* call overloaded method
* update as requested
* add unit test
  • Loading branch information
kezhenxu94 authored and ralf0131 committed Jan 31, 2019
1 parent 35f1914 commit 342f37a
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import org.apache.dubbo.common.logger.support.FailsafeLogger;

import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
Expand All @@ -34,40 +36,43 @@
*/
public class LoggerFactory {

private static final ConcurrentMap<String, FailsafeLogger> LOGGERS = new ConcurrentHashMap<String, FailsafeLogger>();
private static final ConcurrentMap<String, FailsafeLogger> LOGGERS = new ConcurrentHashMap<>();
private static volatile LoggerAdapter LOGGER_ADAPTER;

// search common-used logging frameworks
static {
String logger = System.getProperty("dubbo.application.logger");
if ("slf4j".equals(logger)) {
setLoggerAdapter(new Slf4jLoggerAdapter());
} else if ("jcl".equals(logger)) {
setLoggerAdapter(new JclLoggerAdapter());
} else if ("log4j".equals(logger)) {
setLoggerAdapter(new Log4jLoggerAdapter());
} else if ("jdk".equals(logger)) {
setLoggerAdapter(new JdkLoggerAdapter());
} else if ("log4j2".equals(logger)) {
setLoggerAdapter(new Log4j2LoggerAdapter());
} else {
try {
String logger = System.getProperty("dubbo.application.logger", "");
switch (logger) {
case "slf4j":
setLoggerAdapter(new Slf4jLoggerAdapter());
break;
case "jcl":
setLoggerAdapter(new JclLoggerAdapter());
break;
case "log4j":
setLoggerAdapter(new Log4jLoggerAdapter());
} catch (Throwable e1) {
try {
setLoggerAdapter(new Slf4jLoggerAdapter());
} catch (Throwable e2) {
break;
case "jdk":
setLoggerAdapter(new JdkLoggerAdapter());
break;
case "log4j2":
setLoggerAdapter(new Log4j2LoggerAdapter());
break;
default:
List<Class<? extends LoggerAdapter>> candidates = Arrays.asList(
Log4jLoggerAdapter.class,
Slf4jLoggerAdapter.class,
Log4j2LoggerAdapter.class,
JclLoggerAdapter.class,
JdkLoggerAdapter.class
);
for (Class<? extends LoggerAdapter> clazz : candidates) {
try {
setLoggerAdapter(new Log4j2LoggerAdapter());
} catch (Throwable e3) {
try {
setLoggerAdapter(new JclLoggerAdapter());
} catch (Throwable e4) {
setLoggerAdapter(new JdkLoggerAdapter());
}
setLoggerAdapter(clazz.newInstance());
break;
} catch (Throwable ignored) {
}
}
}
}
}

Expand Down Expand Up @@ -103,12 +108,7 @@ public static void setLoggerAdapter(LoggerAdapter loggerAdapter) {
* @return logger
*/
public static Logger getLogger(Class<?> key) {
FailsafeLogger logger = LOGGERS.get(key.getName());
if (logger == null) {
LOGGERS.putIfAbsent(key.getName(), new FailsafeLogger(LOGGER_ADAPTER.getLogger(key)));
logger = LOGGERS.get(key.getName());
}
return logger;
return LOGGERS.computeIfAbsent(key.getName(), name -> new FailsafeLogger(LOGGER_ADAPTER.getLogger(name)));
}

/**
Expand All @@ -118,12 +118,7 @@ public static Logger getLogger(Class<?> key) {
* @return logger provider
*/
public static Logger getLogger(String key) {
FailsafeLogger logger = LOGGERS.get(key);
if (logger == null) {
LOGGERS.putIfAbsent(key, new FailsafeLogger(LOGGER_ADAPTER.getLogger(key)));
logger = LOGGERS.get(key);
}
return logger;
return LOGGERS.computeIfAbsent(key, k -> new FailsafeLogger(LOGGER_ADAPTER.getLogger(k)));
}

/**
Expand Down Expand Up @@ -153,4 +148,4 @@ public static File getFile() {
return LOGGER_ADAPTER.getFile();
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,12 @@ public void testGetLogger() {

assertThat(logger1, is(logger2));
}
}

@Test
public void shouldReturnSameLogger() {
Logger logger1 = LoggerFactory.getLogger(this.getClass().getName());
Logger logger2 = LoggerFactory.getLogger(this.getClass().getName());

assertThat(logger1, is(logger2));
}
}

0 comments on commit 342f37a

Please sign in to comment.