最近在研究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"); } }
扫描二维码关注公众号,回复:
364358 查看本文章