温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JDK日志框架之如何自定义日志Handler

发布时间:2021-12-13 17:40:29 来源:亿速云 阅读:116 作者:小新 栏目:编程语言

小编给大家分享一下JDK日志框架之如何自定义日志Handler,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

自定义日志 Handler

所有的 Handler 类都是继承自 java.util.logging.Handler 抽象类,该类结构图 如图  所示。

图- Handler 类图

JDK日志框架之如何自定义日志Handler

由该类图可见,Handler 抽象类提供了抽象接口:publish, flush 和 close .这些接口提供了日志输出的基本功能。同时 Handler 类保存了 Formatter,Filter 和 Level 对象用来控制日志输出。因此,编写自定义的Handler 类需要如下步骤:

1、继承 Handler 抽象类

2、实现 publish,flush 和 close 方法。其中publish 方法是用于发布一条日志记录。 flush 方法是清空内存缓冲区。 close 方法是当应用程序关闭的时候,释放该 Handler 类所申请的资源(如文件,socket 等)

3、设置默认的 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) {   // 实现日志输出  }   }


这里 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 这些对象来处理。同时该类也是可序列化的,可以序列化到网络和文件中。该类还可以和一个 ResourceBundle 对象绑定,实现消息字符串的本地化处理。

以上是“JDK日志框架之如何自定义日志Handler”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI