`
wuyuhou
  • 浏览: 13909 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

简单的日志框架

阅读更多
/**
 * 日志记录器接口
 *
 * @author yourname (mailto:yourname@primeton.com)
 */
public interface ILogger {

	boolean isDebugEnabled();

	boolean isInfoEnabled();

	boolean isWarnEnabled();

	boolean isErrorEnabled();


	void debug(Object message);

	void debug(Object message, Object[] params);

	void debug(Throwable t);

	void debug(Object message, Throwable t);

	void debug(Object message, Object[] params, Throwable t);


	void info(Object message);

	void info(Object message, Object[] params);

	void info(Throwable t);

	void info(Object message, Throwable t);

	void info(Object message, Object[] params, Throwable t);


	void warn(Object message);

	void warn(Object message, Object[] params);

	void warn(Throwable t);

	void warn(Object message, Throwable t);

	void warn(Object message, Object[] params, Throwable t);


	void error(Object message);

	void error(Object message, Object[] params);

	void error(Throwable t);

	void error(Object message, Throwable t);

	void error(Object message, Object[] params, Throwable t);
}

/**
 * 日志工厂
 *
 * @author yourname (mailto:yourname@primeton.com)
 */
public class DebugLoggerFactory {

	private static LoggerFactoryPlugin logFactory = new LoggerFactoryPlugin(null);

	public static void setLoggerProvider(ILoggerProvider provider) {
		synchronized (DebugLoggerFactory.class) {
			logFactory = new LoggerFactoryPlugin(provider);
		}
	}
	
	/**
	 * 动态刷新
	 *
	 */
	public static void refresh() {
		logFactory.refresh();
	}

	/**
	 * 取得日志记录器
	 *
	 * @param clazz
	 * @return 日志记录器
	 */
	public static ILogger getLogger(Class clazz) {
		return logFactory.getLogger(clazz);
	}

	/**
	 * 取得日志记录器
	 *
	 * @param loggerName 日志名称
	 * @return 日志记录器
	 */
	public static ILogger getLogger(String loggerName) {
		return logFactory.getLogger(loggerName);
	}
}

/**
 * 日志提供商
 *
 * @author yourname (mailto:yourname@primeton.com)
 */
public interface ILoggerProvider {

	/**
	 * 取得日志实例
	 *
	 * @param loggerName 日志名称
	 * @return 日志实例
	 */
	ILogger createLogger(String loggerName);
}

/**
 * 日志抽象实现
 *
 * @author yourname (mailto:yourname@primeton.com)
 */
public abstract class AbstractLogger implements ILogger {

	public void debug(Object message) {
		if (message != null && message instanceof Throwable) {
			debug(null, null, (Throwable)message);
			return;
		}
		debug(message, null, null);
	}

	public void debug(Object message, Object[] params) {
		debug(message, params, null);
	}

	public void debug(Throwable t) {
		debug(null, null, t);
	}

	public void debug(Object message, Throwable t) {
		debug(message, null, t);
	}

	public void debug(Object message, Object[] params, Throwable t) {
		if (isDebugEnabled()) {
			doDebug(formatMessage(message, params), t);
		}
	}

	abstract protected void doDebug(String message, Throwable t);

	public void info(Object message) {
		if (message != null && message instanceof Throwable) {
			info(null, null, (Throwable)message);
			return;
		}
		info(message, null, null);
	}

	public void info(Object message, Object[] params) {
		info(message, params, null);
	}

	public void info(Throwable t) {
		info(null, null, t);
	}

	public void info(Object message, Throwable t) {
		info(message, null, t);
	}

	public void info(Object message, Object[] params, Throwable t) {
		if (isInfoEnabled()) {
			doInfo(formatMessage(message, params), t);
		}
	}

	abstract protected void doInfo(String message, Throwable t);

	public void warn(Object message) {
		if (message != null && message instanceof Throwable) {
			warn(null, null, (Throwable)message);
			return;
		}
		warn(message, null, null);
	}

	public void warn(Object message, Object[] params) {
		warn(message, params, null);
	}

	public void warn(Throwable t) {
		warn(null, null, t);
	}

	public void warn(Object message, Throwable t) {
		warn(message, null, t);
	}

	public void warn(Object message, Object[] params, Throwable t) {
		if (isWarnEnabled()) {
			doWarn(formatMessage(message, params), t);
		}
	}

	abstract protected void doWarn(String message, Throwable t);

	public void error(Object message) {
		if (message != null && message instanceof Throwable) {
			error(null, null, (Throwable)message);
			return;
		}
		error(message, null, null);
	}

	public void error(Object message, Object[] params) {
		error(message, params, null);
	}

	public void error(Throwable t) {
		error(null, null, t);
	}

	public void error(Object message, Throwable t) {
		error(message, null, t);
	}

	public void error(Object message, Object[] params, Throwable t) {
		if (isErrorEnabled()) {
			doError(formatMessage(message, params), t);
		}
	}

	abstract protected void doError(String message, Throwable t);
	
	protected String formatMessage(Object message, Object[] params) {
		StringBuilder buf = new StringBuilder();		
		if (message != null) {
			if (message instanceof String) {
				String msg = (String) message;
				if (msg.trim().length() > 0) {
					if (params != null && params.length > 0) {
						message = new MessageFormat(msg).format(params);
					}
				}
			}
			buf.append(message);
		}
		return buf.toString();
	}
}

/**
 * 日志工厂实现
 *
 * @author Administrator
 *
 */
public class LoggerFactoryPlugin {
	
	private ILoggerProvider _provider = null;
	
	private WeakHashMap<String, LoggerWrapper> logWeakMap = new WeakHashMap<String, LoggerWrapper>();
	
	private Object lock = new Object();

	public LoggerFactoryPlugin(ILoggerProvider provider) {
		this._provider = provider;
	}
	
	/**
	 * 刷新
	 *
	 */
	public void refresh() {
		for (Entry<String, LoggerWrapper> entry : logWeakMap.entrySet()) {
			entry.getValue().logger = doGetLogger(entry.getKey()).logger;
		}
	}
	
	/**
	 * 取得日志记录器
	 *
	 * @param clazz
	 * @return 日志记录器
	 */
	public ILogger getLogger(Class clazz) {
		return getLogger(clazz == null ? "null" : clazz.getName());
	}

	/**
	 * 取得日志记录器
	 *
	 * @param loggerName 日志名称
	 * @return 日志记录器
	 */
	public ILogger getLogger(String loggerName) {
		if (loggerName == null) {
			loggerName = "null";
		}
		LoggerWrapper log = doGetLogger(loggerName);
		synchronized(lock) {
			logWeakMap.put(loggerName, log);
		}		
		return log;
	}
	
	private LoggerWrapper doGetLogger(String loggerName) {
		
		ILogger log = _provider != null ? _provider.createLogger(loggerName) : null;
		if (!(log instanceof LoggerWrapper)) {
			log = new LoggerWrapper(loggerName, log);
		}
		return (LoggerWrapper)log;
	}
}

/**
 * 日志包裹(防止记录日志时抛出异常)
 *
 * @author yourname (mailto:yourname@primeton.com)
 */
public class LoggerWrapper extends AbstractLogger {

	ILogger logger = null;

	@SuppressWarnings("unused")
	private String name = null;

	public LoggerWrapper(String name, ILogger logger) {
		this.name = name;
		if (logger == null) {
			return;
		}
		if (logger instanceof LoggerWrapper) {
			this.logger = ((LoggerWrapper)logger).logger;
		} else {
			this.logger = logger;
		}
	}

	public boolean isDebugEnabled() {
		if (logger == null) {
			return true;
		}
		try {
			return logger.isDebugEnabled();
		} catch (Throwable t) {
			return false;
		}
	}

	public boolean isInfoEnabled() {
		if (logger == null) {
			return true;
		}
		try {
			return logger.isInfoEnabled();
		} catch (Throwable t) {
			return false;
		}
	}

	public boolean isWarnEnabled() {
		if (logger == null) {
			return true;
		}
		try {
			return logger.isWarnEnabled();
		} catch (Throwable t) {
			return false;
		}
	}

	public boolean isErrorEnabled() {
		if (logger == null) {
			return true;
		}
		try {
			return logger.isErrorEnabled();
		} catch (Throwable t) {
			return false;
		}
	}

	protected void doDebug(String message, Throwable t) {
		try {
			logger.debug(message, t);
		} catch (Throwable e) {
			try {
				System.out.println(convert("DEBUG", message, t));
			} catch (Throwable ignore) {

			}
		}
	}

	protected void doInfo(String message, Throwable t) {

		try {
			logger.info(message, t);
		} catch (Throwable e) {
			try {
				System.out.println(convert(" INFO", message, t));
			} catch (Throwable ignore) {

			}
		}
	}

	protected void doWarn(String message, Throwable t) {
		try {
			logger.warn(message, t);
		} catch (Throwable e) {
			try {
				System.err.println(convert(" WARN", message, t));
			} catch (Throwable ignore) {

			}
		}
	}

	protected void doError(String message, Throwable t) {
		try {
			logger.error(message, t);
		} catch (Throwable e) {
			try {
				System.err.println(convert("ERROR", message, t));
			} catch (Throwable ignore) {

			}
		}
	}

	private String convert(String level, Object message, Throwable t) {
		StringBuilder buf = new StringBuilder();
		buf.append("[").append(format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")).append("]");
		buf.append("[").append(level).append("]");
//		if (name != null && name.trim().length() > 0) {
//			buf.append("[").append(name).append("]");
//		}
		buf.append("[").append(message).append("]");

		if (t != null) {
			String error_msg = t.getMessage();
			if (error_msg != null) {
				buf.append("[").append(error_msg).append("]");
			}

			buf.append("\n");
			StringWriter sw = new StringWriter();
			t.printStackTrace(new PrintWriter(sw));
			buf.append(sw.toString());
		}
		return buf.toString();
	}

	private static String format(long time, String pattern) {
		SimpleDateFormat dateFormat = new SimpleDateFormat();
		dateFormat.applyPattern(pattern);
		return dateFormat.format(new Date(time));
	}

}
分享到:
评论

相关推荐

    【Java 小型简单日志框架】

    一个简单的日志框架,很早写的,五一闲了两天,修一修注释一下拿出来共享。。。。。。 注意: 该日志框架五脏不全。。。。。 改进意见: 1.可以在配置文件中添加日志输出格式,然后在代码中读取该格式用以控制输出...

    采用jdk实现的日志框架

    在IT行业中,日志框架是不可或缺的工具,它主要用于记录应用程序运行时的详细信息,帮助开发者在调试、问题排查和性能优化过程中获取关键数据。"采用JDK实现的日志框架"是一个基于Java Development Kit(JDK)1.4中...

    Java日志框架整合详情

    Java日志框架是Java开发中不可或缺的一部分,它用于记录应用程序运行过程中的各种信息,帮助开发者在出现问题时进行调试和分析。日志框架的选择和整合对于一个项目来说至关重要,因为它不仅影响到开发效率,还直接...

    Go-简单的Go日志框架

    本文将深入探讨“Go简单的Go日志框架”,这个框架提供了一个基础的日志处理结构,但并不直接处理日志的输出,而是依赖于特定的驱动器(driver)来实现日志的具体输出。 在Go语言的标准库中,`log`包提供了一个基本...

    Android-它是完全基于Kotlin开发的Android日志框架提供极简的日志风格

    本文将深入探讨一个基于Kotlin的Android日志框架,该框架以其简洁的日志风格和高效的日志管理为特点。标题所提及的"Android-它是完全基于Kotlin开发的Android日志框架提供极简的日志风格",表明这是一个专为Kotlin...

    Android-AndroidApp崩溃日志上传框架

    该框架的使用非常简单,只需要少量的代码配置即可实现崩溃信息的捕获和发送。这通常涉及到以下几个步骤: 1. **集成框架**:首先,你需要在项目的构建脚本(如Gradle)中引入这个框架的依赖库,确保在编译时能正确...

    基于Java日志框架的Java日志学习项目设计源码

    Java提供了多种日志框架供开发者使用,如Java原生的日志框架(JUL)、Apache的Log4j、Logback和Log4j2等。这些框架各具特点,适用于不同的场景和需求。 在介绍的“基于Java日志框架的Java日志学习项目设计源码”中...

    自己实现简单的日志记录框架

    日志记录明明很简单的东西,被log4j搞得复杂了,个人很不喜欢那么冗余的东西,于是自己构思了一晚上,花了一上午时间写了这个简单的日志记录系统,姑且称为一个简单框架吧。

    谈谈你了解的springboot日志框架

    - **jUL (Java Util Logging)**:Java标准库自带的日志框架,虽然简单,但功能相对有限。 - **log4j**:经典的日志框架,具有丰富的功能和社区支持,但已逐渐被log4j2取代。 - **log4j2**:log4j的升级版,改进了...

    Java中日志框架的工作原理与实现

    SLF4J同样是一个日志门面,它为不同的日志框架提供了一个简单的抽象层。SLF4J的目标是让开发者能够在不同的环境中使用相同的日志记录代码,而在部署时可以灵活地切换到不同的日志实现。SLF4J在设计上注重简洁和易用...

    .Net轻量级简单日志组件

    .Net轻量级简单日志组件 日志组件位于System.Database.dll中,项目引用命名空间(System.Logger)即可,日志组件提供五种级别的日志记录(DEBUG|INFO|WARN|ERROR|FATAL),最低DEBUG,最高FATAL,当配置的级别大于等于...

    java的Logback日志框架jar包

    3. **slf4j-api-1.7.26.jar**: SLF4J是一个为各种日志框架提供简单统一的接口,使得最终用户能够在部署时插入所需的日志框架。SLF4J API提供了日志记录的基本方法,如`info()`, `debug()`, `error()`等,而具体的...

    log4cplus开源的C++日志框架

    **log4cplus** 是一个基于C++的开源日志框架,它的设计灵感来源于Java社区中的log4j,旨在提供一种高效、灵活且易于使用的日志记录解决方案。这个框架允许开发者在C++程序中方便地记录调试信息,帮助追踪代码问题、...

    Android-XLog一个简易的日志打印框架

    **Android-XLog简易日志打印框架详解** 在Android应用开发中,日志打印是一个不可或缺的环节,它能帮助开发者在调试、排错时快速定位问题。`XLog`是一个轻量级的日志打印框架,其设计目标是提供简单易用且功能强大...

    android日志框架jar包。log4j android版

    Log4j是一个广泛使用的Java日志框架,在服务器端和桌面应用中非常常见。不过,Log4j原生并不直接支持Android平台,因为它依赖于一些Android系统不包含的库。但有一些开发者社区提供了对Android的适配版本,让Log4j...

    log4j日志框架

    **Log4j日志框架详解** Log4j是Apache组织开发的一个开源的日志记录框架,广泛应用于Java应用程序中。作为一款强大的日志处理工具,它提供了灵活的日志配置,允许开发者根据需求调整日志级别、格式和输出位置,极大...

    C++谷歌日志框架源码

    C++谷歌日志框架,全称为Google Glog,是一个开源的日志系统,广泛应用于C++项目中,尤其在大规模分布式系统中,它提供了强大的错误处理和日志记录功能。Glog是基于Google的log服务,它不仅实现了基本的日志记录,还...

    日志框架总结JUL、Log4j、Log4j2、Logback以及门面技术

    - **简介**:是Jakarta项目的组成部分,提供了一个简单的API来调用不同的日志框架。 - **使用**:通过JCL API,可以在不改动代码的情况下切换底层的日志实现。 - **SLF4j (Simple Logging Facade for Java)** -...

    android 开源日志框架

    在Android开发中,日志框架扮演着至关重要的角色,它帮助开发者记录应用程序运行时的各种信息,包括错误、警告、调试信息等,以便于排查问题、优化性能和理解应用的行为。本话题将深入探讨两个开源的日志框架:`...

    C#实现一个简单实用的TXT文本操作及日志框架详解

    C#实现一个简单实用的TXT文本操作及日志框架详解 本文主要介绍了如何使用C#实现一个简单实用的TXT文本操作及日志框架。该框架实现了文本写入及读取、日志写入指定文件夹或默认文件夹、日志数量控制、单个日志大小...

Global site tag (gtag.js) - Google Analytics