最近在研究dubbox源码,看了很久理解的不多,就只弄懂了一点其中日志的处理,这里面用到了Adapter,factory 两种设计模式,
LoggerAdapter,LoggerFactory,Slf4jLoggerAdapter
下面贴源码,我把他整个弄出来放在一个java项目里面测试一下,但是没有能理解为什么在最后还包了一层FailSafeLogger
package com.test.log;
/**
* Created with IntelliJ IDEA.
* User: John Wei
* Date: 2016/3/26
* Time: 11:56
* To change this template use File | Settings | File Templates.
*/
public interface Logger {
/**
* 输出跟踪信息
*
* @param msg 信息内容
*/
public void trace(String msg);
/**
* 输出跟踪信息
*
* @param e 异常信息
*/
public void trace(Throwable e);
/**
* 输出跟踪信息
*
* @param msg 信息内容
* @param e 异常信息
*/
public void trace(String msg, Throwable e);
/**
* 输出调试信息
*
* @param msg 信息内容
*/
public void debug(String msg);
/**
* 输出调试信息
*
* @param e 异常信息
*/
public void debug(Throwable e);
/**
* 输出调试信息
*
* @param msg 信息内容
* @param e 异常信息
*/
public void debug(String msg, Throwable e);
/**
* 输出普通信息
*
* @param msg 信息内容
*/
public void info(String msg);
/**
* 输出普通信息
*
* @param e 异常信息
*/
public void info(Throwable e);
/**
* 输出普通信息
*
* @param msg 信息内容
* @param e 异常信息
*/
public void info(String msg, Throwable e);
/**
* 输出警告信息
*
* @param msg 信息内容
*/
public void warn(String msg);
/**
* 输出警告信息
*
* @param e 异常信息
*/
public void warn(Throwable e);
/**
* 输出警告信息
*
* @param msg 信息内容
* @param e 异常信息
*/
public void warn(String msg, Throwable e);
/**
* 输出错误信息
*
* @param msg 信息内容
*/
public void error(String msg);
/**
* 输出错误信息
*
* @param e 异常信息
*/
public void error(Throwable e);
/**
* 输出错误信息
*
* @param msg 信息内容
* @param e 异常信息
*/
public void error(String msg, Throwable e);
/**
* 跟踪信息是否开启
*
* @return 是否开启
*/
public boolean isTraceEnabled();
/**
* 调试信息是否开启
*
* @return 是否开启
*/
public boolean isDebugEnabled();
/**
* 普通信息是否开启
*
* @return 是否开启
*/
public boolean isInfoEnabled();
/**
* 警告信息是否开启
*
* @return 是否开启
*/
public boolean isWarnEnabled();
/**
* 错误信息是否开启
*
* @return 是否开启
*/
public boolean isErrorEnabled();
}
package com.test.log;
/**
* Created with IntelliJ IDEA.
* User: John Wei
* Date: 2016/3/26
* Time: 11:57
* To change this template use File | Settings | File Templates.
*/
public enum Level {
/**
* ALL
*/
ALL,
/**
* TRACE
*/
TRACE,
/**
* DEBUG
*/
DEBUG,
/**
* INFO
*/
INFO,
/**
* WARN
*/
WARN,
/**
* ERROR
*/
ERROR,
/**
* OFF
*/
OFF
}
package com.test.log;
import java.io.File;
/**
* Created with IntelliJ IDEA.
* User: John Wei
* Date: 2016/3/26
* Time: 11:55
* To change this template use File | Settings | File Templates.
*/
public interface LoggerAdapter {
/**
* 获取日志输出器
*
* @param key 分类键
* @return 日志输出器, 后验条件: 不返回null.
*/
Logger getLogger(Class<?> key);
/**
* 获取日志输出器
*
* @param key 分类键
* @return 日志输出器, 后验条件: 不返回null.
*/
Logger getLogger(String key);
/**
* 设置输出等级
*
* @param level 输出等级
*/
void setLevel(Level level);
/**
* 获取当前日志等级
*
* @return 当前日志等级
*/
Level getLevel();
/**
* 获取当前日志文件
*
* @return 当前日志文件
*/
File getFile();
/**
* 设置输出日志文件
*
* @param file 输出日志文件
*/
void setFile(File file);
}
package com.test.log;
import java.io.File;
/**
* Created with IntelliJ IDEA.
* User: John Wei
* Date: 2016/3/26
* Time: 12:58
* To change this template use File | Settings | File Templates.
*/
public class Slf4jLoggerAdapter implements LoggerAdapter {
public Logger getLogger(String key) {
return new Slf4jLogger(org.slf4j.LoggerFactory.getLogger(key));
}
public Logger getLogger(Class<?> key) {
return new Slf4jLogger(org.slf4j.LoggerFactory.getLogger(key));
}
private Level level;
private File file;
public void setLevel(Level level) {
this.level = level;
}
public Level getLevel() {
return level;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
}
package com.test.log;
import java.io.Serializable;
/**
* Created with IntelliJ IDEA.
* User: John Wei
* Date: 2016/3/26
* Time: 12:58
* To change this template use File | Settings | File Templates.
*/
public class Slf4jLogger implements Logger, Serializable {
private static final long serialVersionUID = 1L;
private final org.slf4j.Logger logger;
public Slf4jLogger(org.slf4j.Logger logger) {
this.logger = logger;
}
public void trace(String msg) {
logger.trace(msg);
}
public void trace(Throwable e) {
logger.trace(e.getMessage(), e);
}
public void trace(String msg, Throwable e) {
logger.trace(msg, e);
}
public void debug(String msg) {
logger.debug(msg);
}
public void debug(Throwable e) {
logger.debug(e.getMessage(), e);
}
public void debug(String msg, Throwable e) {
logger.debug(msg, e);
}
public void info(String msg) {
logger.info(msg);
}
public void info(Throwable e) {
logger.info(e.getMessage(), e);
}
public void info(String msg, Throwable e) {
logger.info(msg, e);
}
public void warn(String msg) {
logger.warn(msg);
}
public void warn(Throwable e) {
logger.warn(e.getMessage(), e);
}
public void warn(String msg, Throwable e) {
logger.warn(msg, e);
}
public void error(String msg) {
logger.error(msg);
}
public void error(Throwable e) {
logger.error(e.getMessage(), e);
}
public void error(String msg, Throwable e) {
logger.error(msg, e);
}
public boolean isTraceEnabled() {
return logger.isTraceEnabled();
}
public boolean isDebugEnabled() {
return logger.isDebugEnabled();
}
public boolean isInfoEnabled() {
return logger.isInfoEnabled();
}
public boolean isWarnEnabled() {
return logger.isWarnEnabled();
}
public boolean isErrorEnabled() {
return logger.isErrorEnabled();
}
}
package com.test.log;
import java.io.File;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* Created with IntelliJ IDEA.
* User: John Wei
* Date: 2016/3/26
* Time: 12:59
* To change this template use File | Settings | File Templates.
*/
public class LoggerFactory {
private LoggerFactory() {
}
private static volatile LoggerAdapter LOGGER_ADAPTER;
private static final ConcurrentMap<String, FailsafeLogger> LOGGERS = new ConcurrentHashMap<String, FailsafeLogger>();
// 查找常用的日志框架
static {
setLoggerAdapter(new Slf4jLoggerAdapter());
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 {
// try {
// setLoggerAdapter(new Log4jLoggerAdapter());
// } catch (Throwable e1) {
// try {
// setLoggerAdapter(new Slf4jLoggerAdapter());
// } catch (Throwable e2) {
// try {
// setLoggerAdapter(new JclLoggerAdapter());
// } catch (Throwable e3) {
// setLoggerAdapter(new JdkLoggerAdapter());
// }
// }
// }
}
}
// public static void setLoggerAdapter(String loggerAdapter) {
// if (loggerAdapter != null && loggerAdapter.length() > 0) {
// setLoggerAdapter(ExtensionLoader.getExtensionLoader(LoggerAdapter.class).getExtension(loggerAdapter));
// }
// }
/**
* 设置日志输出器供给器
*
* @param loggerAdapter
* 日志输出器供给器
*/
public static void setLoggerAdapter(LoggerAdapter loggerAdapter) {
if (loggerAdapter != null) {
Logger logger = loggerAdapter.getLogger(LoggerFactory.class.getName());
logger.info("using logger: " + loggerAdapter.getClass().getName());
LoggerFactory.LOGGER_ADAPTER = loggerAdapter;
for (Map.Entry<String, FailsafeLogger> entry : LOGGERS.entrySet()) {
entry.getValue().setLogger(LOGGER_ADAPTER.getLogger(entry.getKey()));
}
}
}
/**
* 获取日志输出器
*
* @param key
* 分类键
* @return 日志输出器, 后验条件: 不返回null.
*/
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;
}
/**
* 获取日志输出器
*
* @param key
* 分类键
* @return 日志输出器, 后验条件: 不返回null.
*/
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;
}
/**
* 动态设置输出日志级别
*
* @param level 日志级别
*/
public static void setLevel(Level level) {
LOGGER_ADAPTER.setLevel(level);
}
/**
* 获取日志级别
*
* @return 日志级别
*/
public static Level getLevel() {
return LOGGER_ADAPTER.getLevel();
}
/**
* 获取日志文件
*
* @return 日志文件
*/
public static File getFile() {
return LOGGER_ADAPTER.getFile();
}
}
package com.test.log;
/**
* Created with IntelliJ IDEA.
* User: John Wei
* Date: 2016/3/26
* Time: 13:00
* To change this template use File | Settings | File Templates.
*/
public class FailsafeLogger implements Logger {
private Logger logger;
public FailsafeLogger(Logger logger) {
this.logger = logger;
}
public Logger getLogger() {
return logger;
}
public void setLogger(Logger logger) {
this.logger = logger;
}
private String appendContextMessage(String msg) {
return " [DUBBO] " + msg + ", dubbo version:3 " + ", current host:33 " ;
}
public void trace(String msg, Throwable e) {
try {
logger.trace(appendContextMessage(msg), e);
} catch (Throwable t) {
}
}
public void trace(Throwable e) {
try {
logger.trace(e);
} catch (Throwable t) {
}
}
public void trace(String msg) {
try {
logger.trace(appendContextMessage(msg));
} catch (Throwable t) {
}
}
public void debug(String msg, Throwable e) {
try {
logger.debug(appendContextMessage(msg), e);
} catch (Throwable t) {
}
}
public void debug(Throwable e) {
try {
logger.debug(e);
} catch (Throwable t) {
}
}
public void debug(String msg) {
try {
logger.debug(appendContextMessage(msg));
} catch (Throwable t) {
}
}
public void info(String msg, Throwable e) {
try {
logger.info(appendContextMessage(msg), e);
} catch (Throwable t) {
}
}
public void info(String msg) {
try {
logger.info(appendContextMessage(msg));
} catch (Throwable t) {
}
}
public void warn(String msg, Throwable e) {
try {
logger.warn(appendContextMessage(msg), e);
} catch (Throwable t) {
}
}
public void warn(String msg) {
try {
logger.warn(appendContextMessage(msg));
} catch (Throwable t) {
}
}
public void error(String msg, Throwable e) {
try {
logger.error(appendContextMessage(msg), e);
} catch (Throwable t) {
}
}
public void error(String msg) {
try {
logger.error(appendContextMessage(msg));
} catch (Throwable t) {
}
}
public void error(Throwable e) {
try {
logger.error(e);
} catch (Throwable t) {
}
}
public void info(Throwable e) {
try {
logger.info(e);
} catch (Throwable t) {
}
}
public void warn(Throwable e) {
try {
logger.warn(e);
} catch (Throwable t) {
}
}
public boolean isTraceEnabled() {
try {
return logger.isTraceEnabled();
} catch (Throwable t) {
return false;
}
}
public boolean isDebugEnabled() {
try {
return logger.isDebugEnabled();
} catch (Throwable t) {
return false;
}
}
public boolean isInfoEnabled() {
try {
return logger.isInfoEnabled();
} catch (Throwable t) {
return false;
}
}
public boolean isWarnEnabled() {
try {
return logger.isWarnEnabled();
} catch (Throwable t) {
return false;
}
}
public boolean isErrorEnabled() {
try {
return logger.isErrorEnabled();
} catch (Throwable t) {
return false;
}
}
}
package com.test.log;
/**
* Created with IntelliJ IDEA.
* User: John Wei
* Date: 2016/3/26
* Time: 13:53
* To change this template use File | Settings | File Templates.
*/
public class testLoggPrint {
protected static final Logger logger = LoggerFactory.getLogger(testLoggPrint.class);
public static void main(String args[]) {
logger.info("test");
}
}