类结构图如 图 2 所示。
图 2 Handler 类图
由该类图可见,Handler 抽象类提供了抽象接口:publish, flush 和 close 。这些接口提供了日志输出的基本功能。同时 Handler 类保 存了 Formatter,Filter 和 Level 对象用来控制日志输出。因此,编写自定义的 Handler 类需要如下步骤:
继承 Handler 抽象类
实现 publish,flush 和 close 方法。其中 publish 方法是用于发布一条日志记录。 flush 方法是清空内存缓冲区。 close 方法是当应 用程序关闭的时候,释放该 Handler 类所申请的资源(如文件,socket 等)
设置默认的 Formatter,Filter 和 Level 对象。必要的时候,可以在类的初始化时候读取配置文件来设置这些参数。
一个典型的自定义 Handler 类实现如清单 1 所示。
清单 1 自定义 Handler 类
public class MyHandler extends Handler {
private boolean doneHeader = false;
public MyHandler() {
setLevel(Level.INFO);
setFilter(null);
setFormatter(new SimpleFormatter());
}
_cnnew1@Override
public void close() throws SecurityException {
if (!doneHeader) {
output(getFormatter().getHead(this));
doneHeader = true;
}
output(getFormatter().getTail(this));
flush();
}
@Override
public void flush() {
// 清空缓冲区
}
@Override
public void publish(LogRecord record) {
if (!isLoggable(record)) {
return;
}
String msg = getFormatter().format(record);
try {
if (!doneHeader ) {
output(getFormatter().getHead(this));
doneHeader = true;
}
output(msg);
} catch (Exception ex) {
reportError(null, ex, ErrorManager.WRITE_FAILURE);
}
}
private void output(String message) {
// 实现日志输出
}
}
扩展JDK日志框架(3)
时间:2011-07-18 IBM 颜 林
这里 reportError 方法是将日志类中的错误信息输出到外界,这个是由 ErrorManager 类实现的,ErrorManager 类负责记录日志框架中 Handler 的错误,一般情况下是将该错误打印到控制台中。具体的每条日志消息被 JDK 日志框架封装成 LogRecord 对象,该类部分定义如 清 单 2 所示。
清单 2 LogRecord 类定义
public class LogRecord implements java.io.Serializable {
public String getLoggerName();
public void setLoggerName(String name);
public ResourceBundle getResourceBundle();
public void setResourceBundle(ResourceBundle bundle);
public Level getLevel();
public void setLevel(Level level);
public String getMessage();
public void setMessage(String message);
public Object[] getParameters();
public void setParameters(Object parameters[]);
public int getThreadID();
public void setThreadID(int threadID);
public long getMillis();
public void setMillis(long millis);
public Throwable getThrown();
public void setThrown(Throwable thrown);
...
}
由清单 2 可见,LogRecord 类包含了一个日志消息的级别、消息文本、时间、参数、线程等等所有的信息,这些都交给 Handler, Formatter 和 Filter 这些对象来处理。同时该类也是可序列化的,可以序列化到网络和文件 |