最近在研究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"); } }
相关推荐
【标题】"dubbo-admin-2.6.0 源码文件" 是 Dubbo 项目中的一个组件,主要用于提供管理界面,帮助开发者监控和管理 Dubbo 服务。这个源码包包含了构建 dubbo-admin.war 文件所需的所有 Java 代码。 【描述】提到的 ...
【Dubbo支付系统源码.zip】是一个包含使用Dubbo框架构建的支付系统源代码和相关数据库脚本的压缩包。...开发者可以通过研究源码,深入了解如何在实际项目中运用Dubbo和其他相关技术来构建高效、可靠的支付系统。
《Dubbo插件详解:JM-dubbo-plugins-2.7.1》 在现代软件开发中,服务化已经成为一种常见的架构模式,而...通过深入研究这些插件,开发者可以更好地理解和利用Dubbo框架,优化微服务架构,提高系统的稳定性和性能。
该压缩包文件“Dubbo分布式系统架构支付系统项目工程全套源码(含数据库).zip”提供了基于Dubbo构建的支付系统项目的完整源代码,其中包括了...通过研究这个源码,开发者可以深入理解分布式系统中的关键技术和最佳实践。
开发者可以研究这些源码,了解如何实现分布式键值存储以及如何在实际项目中运用Dubbo进行服务治理。文件名"content_code"可能指的是包含了这些内容的具体代码文件。通过学习这些源码,开发者可以深入理解分布式系统...
通过阅读和研究这些经过严格测试的源码,开发者可以提升自己的技能,更好地应对实际项目中的挑战。 在实际应用中,可能会有多个dubbo服务节点和多种类型的应用,这时我们需要考虑如何统一管理和分析所有日志。可以...
【标题】中的“个人博客系统,将原来的S2SH重构一下,改换为SSM框架.zip”揭示了本次讨论的核心内容。...通过研究这个项目,开发者可以深入了解SSM和Dubbo的使用,以及如何在实际项目中进行架构升级。
通过这个项目,我们可以深入理解Java Web开发的核心技术以及Spring Boot和Dubbo在实际应用中的工作原理。 1. **Spring Boot**: Spring Boot是Spring框架的一个扩展,它简化了创建独立的、生产级别的基于Spring的...
通过下载并研究此源码,开发者可以深入理解Java在构建大型Web应用中的应用。 Java是一种广泛使用的面向对象的编程语言,具有跨平台、安全性高、性能稳定等特点,特别适合开发复杂的分布式应用程序。在这个预约挂号...
本资料提供的“企业办公自动化系统java源码”是一个基于Java编程语言开发的系统,适用于学习、研究或二次开发。下面我们将深入探讨该系统的相关知识点。 首先,Java是一种跨平台的编程语言,具有面向对象、健壮性、...
通过对这个Java版商城系统的源码研究,开发者可以深入了解如何在实际项目中应用Java Web技术,同时也能掌握到如何构建大型、高并发的电商系统。这份开源源码对于初学者和有经验的开发者都是极好的学习材料。
这通常是开发者或教育者为了教学、学习或研究目的而提供的资源。在Java编程领域,项目源码是理解实际应用开发流程、设计模式和技术栈的重要途径。 描述中的“20套Java项目源码,助力学习”进一步强调了这些源码是为...
在电商系统中,MyBatis用于处理与数据库的交互,提高查询效率。 4. **Redis**:电商系统中常使用Redis作为缓存,以提高数据读取速度,减轻数据库压力。如商品详情、热门商品列表等频繁访问的数据会存储在Redis中。 ...
该项目已成功集成 actuator(监控)、admin(可视化监控)、logback(日志)、aopLog(通过AOP记录web请求日志)、统一异常处理(json级别和页面级别)、freemarker(模板引擎)、thymeleaf(模板引擎)、Beetl(模板引擎)、Enjoy...