扩展JDK日志框架

上传人:积*** 文档编号:124750547 上传时间:2022-07-25 格式:DOC 页数:11 大小:75KB
返回 下载 相关 举报
扩展JDK日志框架_第1页
第1页 / 共11页
扩展JDK日志框架_第2页
第2页 / 共11页
扩展JDK日志框架_第3页
第3页 / 共11页
点击查看更多>>
资源描述
日记记录对于软件的维护特别是对于已部署到运营环境之后的软件调试均有着重要的意义。本文简介了 JDK 的日记框架,以及如何根据不同需求自定义日记解决、消息格式化、消息级别等组件。最后论述了如何运用 JDK 日记框架的扩展能力将 Java 程序可以通过 STAF(Software Testing Automation Framework,一种自动化测试框架)日记服务来进行监视。 自 Java 1.4 开始,JDK 涉及了一种崭新的日记框架包 java.util.logging,该日记框架设计精良,和 JDK 紧密结合,控制灵活,使用简朴。日记记录对于软件的维护特别是对于已部署到运营环境之后的软件调试均有着重要的意义。在实际的项目中,往往还需要比该框架所提供的更为复杂的日记功能。对于这种需求,JDK 日记框架具有足够的可扩展能力,可以自定义不同需求的日记解决、消息格式化、日记消息级别等组件。在下面的内容中,本文将简介了如何扩展 JDK 日记框架,自定义日记解决方式。并就一种实际的例子来简介如何结合 JDK 日记框架和 STAF(Software Testing Automation Framework,一种自动化测试框架)日记服务来对 Java 程序进行监视。 JDK 日记框架简介 JDK 的日记框架即 java.util.logging 包。对于一种软件的日记系统而言,一方面必须得有一种日记对象,该对象负责记录日记信息。同步该信息可以输出到不同的位置,例如控制台,文献甚至网络中。对于信息的格式,则可以根据不同的需求,可以输出成一般文本,XML 或者 HTML 的格式。同步还需要对日记信息进行不同级别的分类,这样的好处是可以过滤冗余信息,只保存核心的日记。对于一种日记框架而言,日记对象必须是可配备的,它可以按照配备来输出到指定的目的,同步按照配备来决定输出的格式和决定何种级别以上的日记才干输出。配备的形式还可以是多种多样的,既能是代码的形式,也能是配备文献的形式。特别是配备文献的形式,对于一种已经部署到运营环境中的软件而言,可以非常以便的变化日记配备而无需变化其源代码。 JDK 日记框架提供了上述的所有功能。它重要涉及如下几种部件:Logger:日记记录对象。用于记录日记信息。Handler:用于解决日记信息的输出。在 Handler 类中,可以决定日记是输出到文献中还是控制台中。Filter: 用于过滤日记。在 Filter 类中,可以根据日记级别或者某种条件来决定与否输出该日记。这样达到清除冗余信息的目的。Formatter:用于格式化日记信息。该类可以将日记文本格式化成 XML 或者 HTML 的格式,这完全依赖于具体的实现。Level:用于表达日记的级别。 JDK 日记框架默认有如下级别 : SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINEST 。 对于程序而言,它的 Logger 对象一方面会判断日记的级别与否满足输出级别的规定,然后将满足级别规定的日记消息交给所配备的 Handler 对象来解决,如果日记对象配备了一种 Filter 对象,那么 Filter 对象将会对日记信息做一次过滤。 Handler 对象接受到日记消息后,根据其所配备的格式化类 Formatter 来变化日记的格式,根据所配备的 Filter 对象和 Level 对象来再次过滤日记信息,最后输出到该种 Handler 对象所指定的输出位置中,该输出位置可以是控制台,文献,网络 socket 甚至是内存缓冲区。其架构模型如 图 1 所示。图 1 JDK 日记框架 JDK 提供了如下几种默认支持的 Handler 类:ConsoleHandler: 输出日记到控制台中FileHandler:输出日记到指定文献中MemoryHandler:输出日记到内存缓冲区中,当一定的条件满足的时候(如某种核心字的日记信息)再将缓冲区中的日记输出SocketHandler: 输出日记到网络 socket 中StreamHandler: 输出日记到输入输出流对象中 同步 JDK 日记框架也不失其灵活性,你可以定制自己所需要的 Handler,将日记按照自定义的需求输出到不同的位置,同步 Formatter,Level 类都可以自定义扩展,下面就具体论述如何自定义扩展这些组件。 自定义日记 Handler 所有的 Handler 类都是继承自 java.util.logging.Handler 抽象类,该类构造图如 图 2 所示。图 2 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.2.3.4. public class MyHandler extends Handler 5.6. private boolean doneHeader = false;7.8.9.10. public MyHandler() 11.12. setLevel(Level.INFO);13.14. setFilter(null);15.16. setFormatter(new SimpleFormatter();17.18. 19.20.21.22. _cnnew1Override23.24. public void close() throws SecurityException 25.26. if (!doneHeader) 27.28. output(getFormatter().getHead(this);29.30. doneHeader = true;31.32. 33.34. output(getFormatter().getTail(this);35.36. flush();37.38. 39.40.41.42. Override43.44. public void flush() 45.46. / 清空缓冲区47.48. 49.50.51.52. Override53.54. public void publish(LogRecord record) 55.56. if (!isLoggable(record) 57.58. return;59.60. 61.62. String msg = getFormatter().format(record);63.64.65.66. try 67.68. if (!doneHeader ) 69.70. output(getFormatter().getHead(this);71.72. doneHeader = true;73.74. 75.76. output(msg);77.78. catch (Exception ex) 79.80. reportError(null, ex, ErrorManager.WRITE_FAILURE);81.82. 83.84. 85.86.87.88. private void output(String message) 89.90. / 实现日记输出91.92. 93.94. 95. 复制代码96.复制代码这里 reportError 措施是将日记类中的错误信息输出到外界,这个是由 ErrorManager 类实现的,ErrorManager 类负责记录日记框架中 Handler 的错误,一般状况下是将该错误打印到控制台中。具体的每条日记消息被 JDK 日记框架封装成 LogRecord 对象,该类部分定义如 清单 2 所示。 清单 2 LogRecord 类定义1.2.3.4. public class LogRecord implements java.io.Serializable 5.6. public String getLoggerName();7.8. public void setLoggerName(String name);9.10. public ResourceBundle getResourceBundle();11.12. public void setResourceBundle(ResourceBundle bundle);13.14. public Level getLevel();15.16. public void setLevel(Level level);17.18. public String getMessage();19.20. public void setMessage(String message);21.22. public Object getParameters();23.24. public void setParameters(Object parameters);25.26. public int getThreadID();27.28. public void setThreadID(int threadID);29.30. public long getMillis();31.32. public void setMillis(long millis);33.34. public Throwable getThrown();35.36. public void setThrown(Throwable thrown);37.38. .39.40. 41. 复制代码42.复制代码由清单 2 可见,LogRecord 类涉及了一种日记消息的级别、消息文本、时间、参数、线程等等所有的信息,这些都交给 Handler,Formatter 和 Filter 这些对象来解决。同步该类也是可序列化的,可以序列化到网络和文献中。该类还可以和一种 ResourceBundle 对象绑定,实现消息字符串的本地化解决。 本节描述了一种典型的自定义的 Handler 类的实现。在本文背面部分将会有一种实际的例子来简介如何实现一种 STAF 日记解决类。 自定义日记 Formatter 日记可以被格式化为一定格式的文本,也可以成为 XML 或者 HTML 这样原则的格式。这取决于 Formatter 类的具体实现。 Formatter 抽象类提供了 format 成员函数用于扩展。一种典型的自定义 Formatter 类实现如清单 3 所示: 清单 3 LogRecord 类定义1.2.3.4. public class MyFormatter extends Formatter 5.6. private final String lineSeparator = System.getProperty(line.separator);7.8. Override9.10. public String format(LogRecord record) 11.12. StringBuffer sb = new StringBuffer();13.14. String message = formatMessage(record);15.16. sb.append(record.getLevel().getLocalizedName();17.18. sb.append(message);19.20. sb.append(lineSeparator);21.22. if (record.getThrown() != null) 23.24. try 25.26. StringWriter sw = new StringWriter();27.28. PrintWriter pw = new PrintWriter(sw);29.30. record.getThrown().printStackTrace(pw);31.32. pw.close();33.34. sb.append(sw.toString();35.36. catch (Exception ex) 37.38. 39.40. 41.42. return sb.toString();43.44. 45.46. 47. 复制代码48.复制代码其中 formatMessage 措施提供了默认的将日记记录本地化和格式化的措施。它还能支持 java.text 风格的文本格式化,这只需要在调用 Logger 对象的 setMessage 措施设定 java.text 风格的格式字符串,同步通过 setParameters 措施设立参数,这样 formatMessage 将会根据所设立的 java.text 风格的格式字符串来格式化日记消息。总之,formatMessage 措施以便了子类格式化字符串。使子类只需要定义输出文本的格式而无需考虑本地化等问题。 自定义日记消息级别 JDK 日记框架默认提供了 SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINEST 这几种日记级别。如果我们需要定义更多的日记级别,只需要继承 java.util.logging.Level 类,然后将自定义的级别作为静态成员变量声明即可。一种典型的自定义的消息类如清单 4 所示。清单 4 自定义 Level
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!