/**
* 日志记录器接口
*
* @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));
}
}
分享到:
相关推荐
一个简单的日志框架,很早写的,五一闲了两天,修一修注释一下拿出来共享。。。。。。 注意: 该日志框架五脏不全。。。。。 改进意见: 1.可以在配置文件中添加日志输出格式,然后在代码中读取该格式用以控制输出...
在IT行业中,日志框架是不可或缺的工具,它主要用于记录应用程序运行时的详细信息,帮助开发者在调试、问题排查和性能优化过程中获取关键数据。"采用JDK实现的日志框架"是一个基于Java Development Kit(JDK)1.4中...
Java日志框架是Java开发中不可或缺的一部分,它用于记录应用程序运行过程中的各种信息,帮助开发者在出现问题时进行调试和分析。日志框架的选择和整合对于一个项目来说至关重要,因为它不仅影响到开发效率,还直接...
本文将深入探讨“Go简单的Go日志框架”,这个框架提供了一个基础的日志处理结构,但并不直接处理日志的输出,而是依赖于特定的驱动器(driver)来实现日志的具体输出。 在Go语言的标准库中,`log`包提供了一个基本...
本文将深入探讨一个基于Kotlin的Android日志框架,该框架以其简洁的日志风格和高效的日志管理为特点。标题所提及的"Android-它是完全基于Kotlin开发的Android日志框架提供极简的日志风格",表明这是一个专为Kotlin...
该框架的使用非常简单,只需要少量的代码配置即可实现崩溃信息的捕获和发送。这通常涉及到以下几个步骤: 1. **集成框架**:首先,你需要在项目的构建脚本(如Gradle)中引入这个框架的依赖库,确保在编译时能正确...
Java提供了多种日志框架供开发者使用,如Java原生的日志框架(JUL)、Apache的Log4j、Logback和Log4j2等。这些框架各具特点,适用于不同的场景和需求。 在介绍的“基于Java日志框架的Java日志学习项目设计源码”中...
日志记录明明很简单的东西,被log4j搞得复杂了,个人很不喜欢那么冗余的东西,于是自己构思了一晚上,花了一上午时间写了这个简单的日志记录系统,姑且称为一个简单框架吧。
- **jUL (Java Util Logging)**:Java标准库自带的日志框架,虽然简单,但功能相对有限。 - **log4j**:经典的日志框架,具有丰富的功能和社区支持,但已逐渐被log4j2取代。 - **log4j2**:log4j的升级版,改进了...
SLF4J同样是一个日志门面,它为不同的日志框架提供了一个简单的抽象层。SLF4J的目标是让开发者能够在不同的环境中使用相同的日志记录代码,而在部署时可以灵活地切换到不同的日志实现。SLF4J在设计上注重简洁和易用...
.Net轻量级简单日志组件 日志组件位于System.Database.dll中,项目引用命名空间(System.Logger)即可,日志组件提供五种级别的日志记录(DEBUG|INFO|WARN|ERROR|FATAL),最低DEBUG,最高FATAL,当配置的级别大于等于...
3. **slf4j-api-1.7.26.jar**: SLF4J是一个为各种日志框架提供简单统一的接口,使得最终用户能够在部署时插入所需的日志框架。SLF4J API提供了日志记录的基本方法,如`info()`, `debug()`, `error()`等,而具体的...
**log4cplus** 是一个基于C++的开源日志框架,它的设计灵感来源于Java社区中的log4j,旨在提供一种高效、灵活且易于使用的日志记录解决方案。这个框架允许开发者在C++程序中方便地记录调试信息,帮助追踪代码问题、...
**Android-XLog简易日志打印框架详解** 在Android应用开发中,日志打印是一个不可或缺的环节,它能帮助开发者在调试、排错时快速定位问题。`XLog`是一个轻量级的日志打印框架,其设计目标是提供简单易用且功能强大...
Log4j是一个广泛使用的Java日志框架,在服务器端和桌面应用中非常常见。不过,Log4j原生并不直接支持Android平台,因为它依赖于一些Android系统不包含的库。但有一些开发者社区提供了对Android的适配版本,让Log4j...
**Log4j日志框架详解** Log4j是Apache组织开发的一个开源的日志记录框架,广泛应用于Java应用程序中。作为一款强大的日志处理工具,它提供了灵活的日志配置,允许开发者根据需求调整日志级别、格式和输出位置,极大...
C++谷歌日志框架,全称为Google Glog,是一个开源的日志系统,广泛应用于C++项目中,尤其在大规模分布式系统中,它提供了强大的错误处理和日志记录功能。Glog是基于Google的log服务,它不仅实现了基本的日志记录,还...
- **简介**:是Jakarta项目的组成部分,提供了一个简单的API来调用不同的日志框架。 - **使用**:通过JCL API,可以在不改动代码的情况下切换底层的日志实现。 - **SLF4j (Simple Logging Facade for Java)** -...
在Android开发中,日志框架扮演着至关重要的角色,它帮助开发者记录应用程序运行时的各种信息,包括错误、警告、调试信息等,以便于排查问题、优化性能和理解应用的行为。本话题将深入探讨两个开源的日志框架:`...
C#实现一个简单实用的TXT文本操作及日志框架详解 本文主要介绍了如何使用C#实现一个简单实用的TXT文本操作及日志框架。该框架实现了文本写入及读取、日志写入指定文件夹或默认文件夹、日志数量控制、单个日志大小...