JDK日志框架之自定义日志Handler浅析

开发 后端
JDK日志框架之自定义日志Handler,表现了JDK日志框架不失其灵活性,可以定制自己所需要的Handler,将JDK日志按照自定义的需求输出到不同的位置,同时可以自定义扩展,下面就详细叙述如何自定义扩展这些组件。

自定义日志 Handler

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

图- Handler 类图

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 类

  1. public class MyHandler extends Handler {   
  2. private bOOlean doneHeader = false;   
  3.  
  4. public MyHandler() {   
  5. setLevel(Level.INFO);   
  6. setFilter(null);   
  7. setFormatter(new SimpleFormatter());   
  8. }   
  9.  
  10. _cnnew1@Override   
  11. public void close() throws SecurityException {   
  12. if (!doneHeader) {   
  13. output(getFormatter().getHead(this));   
  14. doneHeader = true;   
  15. }   
  16. output(getFormatter().getTail(this));   
  17. flush();   
  18. }   
  19.  
  20. @Override   
  21. public void flush() {   
  22. // 清空缓冲区  
  23. }   
  24.  
  25. @Override   
  26. public void publish(LogRecord record) {   
  27. if (!isLoggable(record)) {   
  28. return;   
  29. }   
  30. String msg = getFormatter().format(record);   
  31.  
  32. try {   
  33. if (!doneHeader ) {   
  34. output(getFormatter().getHead(this));   
  35. doneHeader = true;   
  36. }   
  37. output(msg);   
  38. } catch (Exception ex) {   
  39. reportError(null, ex, ErrorManager.WRITE_FAILURE);   
  40. }   
  41. }   
  42.  
  43. private void output(String message) {   
  44. // 实现日志输出  
  45. }   
  46. }  


这里 reportError 方法是将日志类中的错误信息输出到外界,这个是由 ErrorManager 类实现的,ErrorManager 类负责记录日志框架中Handler 的错误,一般情况下是将该错误打印到控制台中。具体的每条日志消息被JDK日志框架封装成 LogRecord 对象,该类部分定义如 清单 2 所示。

清单 2 LogRecord 类定义

  1. public class LogRecord implements java.io.Serializable {   
  2. public String getLoggerName();   
  3. public void setLoggerName(String name);   
  4. public ResourceBundle getResourceBundle();   
  5. public void setResourceBundle(ResourceBundle bundle);   
  6. public Level getLevel();   
  7. public void setLevel(Level level);   
  8. public String getMessage();   
  9. public void setMessage(String message);   
  10. public Object[] getParameters();   
  11. public void setParameters(Object parameters[]);   
  12. public int getThreadID();   
  13. public void setThreadID(int threadID);   
  14. public long getMillis();   
  15. public void setMillis(long millis);   
  16. public Throwable getThrown();   
  17. public void setThrown(Throwable thrown);   
  18. ...   
  19. }  


由清单 2 可见,LogRecord 类包含了一个日志消息的级别、消息文本、时间、参数、线程等等所有的信息,这些都交给 Handler,Formatter 和 Filter 这些对象来处理。同时该类也是可序列化的,可以序列化到网络和文件中。该类还可以和一个 ResourceBundle 对象绑定,实现消息字符串的本地化处理。

本文描述了一个典型的自定义的Handler 类的实现。那么现在你对JDK日志框架之自定义日志Handler是不是更加有感觉了呢?

【编辑推荐】

  1. Java虚拟机内部构成浅析
  2. Java中两个特殊变量this和super 的使用
  3. 3.6.3 this关键字和构造方法的调用
  4. 5.7.8 null和this关键字
  5. Java学习笔记-JSF
责任编辑:仲衡 来源: chinaitlab
相关推荐

2009-07-07 14:32:47

JDK日志Formatter

2009-07-07 15:53:02

JDK日志

2009-07-07 15:14:56

JDK日志STAF

2009-07-07 13:45:52

JDK日志框架

2010-02-05 15:33:29

Android JDK

2020-11-25 09:10:39

Golang GinW

2023-07-28 09:26:43

GolangZap

2009-08-05 18:01:20

C#自定义异常处理

2009-07-07 16:13:39

JDK日志

2009-06-17 16:00:03

Hibernate自定

2009-08-06 09:18:01

ASP.NET自定义控ASP.NET控件开发

2011-06-20 16:54:40

Qt Widget model

2021-02-18 07:46:07

日志框架

2022-05-24 07:39:09

MySQL数据库日志

2009-08-06 17:13:56

ASP.NET自定义控

2009-07-28 09:32:41

ASP.NET自定义控

2009-08-10 14:16:59

ASP.NET自定义控

2009-08-06 17:52:45

ASP.NET控件开发自定义控件

2009-07-20 13:47:08

iBATIS.NET字

2009-06-25 14:53:35

自定义UI组件JSF框架
点赞
收藏

51CTO技术栈公众号