`
weihong01267
  • 浏览: 51702 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Dubbo中Log处理的研究

 
阅读更多

最近在研究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-admin-2.6.0 源码文件" 是 Dubbo 项目中的一个组件,主要用于提供管理界面,帮助开发者监控和管理 Dubbo 服务。这个源码包包含了构建 dubbo-admin.war 文件所需的所有 Java 代码。 【描述】提到的 ...

    Dubbo支付系统源码.zip

    【Dubbo支付系统源码.zip】是一个包含使用Dubbo框架构建的支付系统源代码和相关数据库脚本的压缩包。...开发者可以通过研究源码,深入了解如何在实际项目中运用Dubbo和其他相关技术来构建高效、可靠的支付系统。

    JM-dubbo-plugins-2.7.1.zip

    《Dubbo插件详解:JM-dubbo-plugins-2.7.1》 在现代软件开发中,服务化已经成为一种常见的架构模式,而...通过深入研究这些插件,开发者可以更好地理解和利用Dubbo框架,优化微服务架构,提高系统的稳定性和性能。

    Dubbo分布式系统架构支付系统项目工程全套源码(含数据库).zip

    该压缩包文件“Dubbo分布式系统架构支付系统项目工程全套源码(含数据库).zip”提供了基于Dubbo构建的支付系统项目的完整源代码,其中包括了...通过研究这个源码,开发者可以深入理解分布式系统中的关键技术和最佳实践。

    分布式键值系统,供学习使用,不断完善中。截至目前:根据LSM论文

    开发者可以研究这些源码,了解如何实现分布式键值存储以及如何在实际项目中运用Dubbo进行服务治理。文件名"content_code"可能指的是包含了这些内容的具体代码文件。通过学习这些源码,开发者可以深入理解分布式系统...

    对java、scala等运行于jvm的程序进行实时日志采集、索引和可视化

    通过阅读和研究这些经过严格测试的源码,开发者可以提升自己的技能,更好地应对实际项目中的挑战。 在实际应用中,可能会有多个dubbo服务节点和多种类型的应用,这时我们需要考虑如何统一管理和分析所有日志。可以...

    个人博客系统,将原来的S2SH重构一下,改换为SSM框架.zip

    【标题】中的“个人博客系统,将原来的S2SH重构一下,改换为SSM框架.zip”揭示了本次讨论的核心内容。...通过研究这个项目,开发者可以深入了解SSM和Dubbo的使用,以及如何在实际项目中进行架构升级。

    java+基于Spring-boot和dubbox的API接口和后台管理系统.rar

    通过这个项目,我们可以深入理解Java Web开发的核心技术以及Spring Boot和Dubbo在实际应用中的工作原理。 1. **Spring Boot**: Spring Boot是Spring框架的一个扩展,它简化了创建独立的、生产级别的基于Spring的...

    基于Java的医院预约挂号系统.zip

    通过下载并研究此源码,开发者可以深入理解Java在构建大型Web应用中的应用。 Java是一种广泛使用的面向对象的编程语言,具有跨平台、安全性高、性能稳定等特点,特别适合开发复杂的分布式应用程序。在这个预约挂号...

    企业办公自动化系统java源码.zip

    本资料提供的“企业办公自动化系统java源码”是一个基于Java编程语言开发的系统,适用于学习、研究或二次开发。下面我们将深入探讨该系统的相关知识点。 首先,Java是一种跨平台的编程语言,具有面向对象、健壮性、...

    【Java项目开源源码】资源JAVA版商城系统源码

    通过对这个Java版商城系统的源码研究,开发者可以深入了解如何在实际项目中应用Java Web技术,同时也能掌握到如何构建大型、高并发的电商系统。这份开源源码对于初学者和有经验的开发者都是极好的学习材料。

    20套项目源码.zip

    这通常是开发者或教育者为了教学、学习或研究目的而提供的资源。在Java编程领域,项目源码是理解实际应用开发流程、设计模式和技术栈的重要途径。 描述中的“20套Java项目源码,助力学习”进一步强调了这些源码是为...

    java电商源码

    在电商系统中,MyBatis用于处理与数据库的交互,提高查询效率。 4. **Redis**:电商系统中常使用Redis作为缓存,以提高数据读取速度,减轻数据库压力。如商品详情、热门商品列表等频繁访问的数据会存储在Redis中。 ...

    spring-boot-demo_xkcoding.tar.gz

    该项目已成功集成 actuator(监控)、admin(可视化监控)、logback(日志)、aopLog(通过AOP记录web请求日志)、统一异常处理(json级别和页面级别)、freemarker(模板引擎)、thymeleaf(模板引擎)、Beetl(模板引擎)、Enjoy...

Global site tag (gtag.js) - Google Analytics