JDK日志框架之实例结合STAF浅析

开发 后端
JDK日志框架之实例结合STAF是什么呢?本文向你介绍了JDK日志框架中的STAF的概念以及其实现的基本情况。

JDK日志框架之实例结合STAF,STAF 日志服务概念的提出,这方面是什么情况呢?让我们首先从什么是STAF开始。

STAF(Software Testing Automation Framework)是一个自动化软件测试框架,它可以实现分布式的自动化软件测试管理。我们可以应用 STAF 库的 Java API 来做基于 STAF 框架的应用,同时 STAF 同时也提供了日志服务。其日志服务是用来记录自动化测试流程中的信息,方便在 24x7 的自动化测试中记录自动化测试的操作,便于发现潜在的自动化测试管理脚本的问题。

既然我们可以用 STAF 的 Java API 来做基于 STAF 的应用,我们也可以将JDK 的日志框架同 STAF 的日志服务接口结合起来。 STAF 的日志服务的 java 接口定义如清单 7 所示:

清单 7 STAFLog 类定义

  1. public class STAFLog   
  2. {   
  3. public STAFLog(String logType, String logName, STAFHandle handle);   
  4. public STAFResult log(int level, String msg)   
  5. // Log type constAnts   
  6. public static STAFResult log(STAFHandle theHandle, String logType,   
  7.  String logName, int level, String msg)   
  8. public String getName();   
  9. public String getLogType();   
  10. public int getMonitorMask();   
  11. ... //other methods   
  12. }  


从清单 7 我们可以看出,STAFLog 类提供了方法可以将日志信息存储到 STAF 的日志库中, 这个日志库既可以是本地的文件,也可以是另一个 STAF 服务器上的JDK日志库。这是通过本地 STAF 服务器的配置来决定的。而 STAFLog.log() 方法只用于记录日志信息。

将 STAF 日志服务的 java API 同JDK日志框架结合起来需要做如下步骤:

创建 STAF 日志 Handler 类

该类封装了 STAF 日志服务 API 的接口。同时 STAF 的 Java API 需要一个全局的 STAFHandle 对象,用来表示本地的 STAF 服务句柄。这个可以通过建立一个静态的 STAFHandle 对象即可。其代码如下所示,我们定义了一个 STAFHandler 类如清单 8 所示。

清单 8 STAFHandler 类实现

  1. import java.util.logging.*;   
  2. import com.ibm.staf.wrapper.STAFLog;   
  3.  
  4. public class STAFHandler extends Handler {   
  5. private String logName;   
  6. private static STAFHandle stafHandle = null;   
  7. public STAFHandler(String name) {   
  8. configure();   
  9. logName = name;   
  10. }   
  11. public STAFHandler() {   
  12. configure();   
  13. }   
  14.  
  15. @Override   
  16. public void close() throws SecurityException {   
  17. if (stafHandle != null){   
  18. try {   
  19. stafHandle.unRegister();   
  20. } catch (STAFException e) {   
  21. //ignore   
  22. }   
  23. }   
  24. }   
  25.  
  26. @Override   
  27. public void flush() {   
  28. //nothing   
  29. }   
  30.  
  31. @Override   
  32. public void publish(LogRecord record) {   
  33. if (!isLoggable(record)) {   
  34. return;   
  35. }   
  36. String msg;   
  37. try {   
  38. msg = getFormatter().format(record);   
  39. } catch (Exception ex) {   
  40. reportError(null, ex, ErrorManager.FORMAT_FAILURE);   
  41. return;   
  42. }   
  43.  
  44. try {   
  45. STAFLog.log(stafHandle, STAFLog.MACHINE,   
  46. logName, record.getLevel().getName(), msg);   
  47. } catch (Exception ex) {   
  48. reportError(null, ex, ErrorManager.WRITE_FAILURE);   
  49. }   
  50.  
  51. ...  


在实现 STAFHandler 类时有以下几个要点:

1、由于 STAF API 的调用时需要一个 STAFHandle 的对象来代表本地的 STAF 服务,在该类中声明了一个全局变量用来存储 STAFHandle .

2、close 方法是用来清理系统资源的,上述代码的 close 方法中释放了全局变量 STAFHandle 对象。

3、publish 方法就是获得格式化后的消息后,直接调用 STAF 的日志 API 将日志发送到 STAF 服务中。

但到目前为止,我们还没有给 STAFHandler 类添加一个配置的代码,使之可以支持配置文件。下面我们定义了一个函数 configure,其代码如清单 9 所示。

清单 9 配置函数实现

  1. private void configure() {  
  2. if (stafHandle == null) {  
  3. try {  
  4. stafHandle = new STAFHandle("my application");  
  5. } catch (STAFException e) {  
  6. reportError("registe staf handle error", e, ErrorManager.OPEN_FAILURE);  
  7. }  
  8. }  
  9.  
  10. LogManager manager = LogManager.getLogManager();  
  11. String cname = getClass().getName();  
  12. //set staf log name  
  13. logName = manager.getProperty(cname + ".name");  
  14. if (logName == null)  
  15. logName = "demo.staflog";  
  16.  
  17. //set formatter  
  18. String sformatter = manager.getProperty(cname + ".formatter");  
  19. Formatter formatter = null;  
  20. if (sformatter != null) {  
  21. try {  
  22. formatter = (Formatter)Class.forName(sformatter).newInstance();  
  23. } catch (Exception e) {  
  24. //ignore  
  25. }  
  26. }  
  27.  
  28. setFormatter(formatter == null? new STAFFormatter() : formatter);  
  29.  
  30. //set level  
  31. String sLevel = manager.getProperty(cname + ".level");  
  32. Level level = null;  
  33. if (sLevel != null) {  
  34. try {  
  35. level = STAFLevel.parse(sLevel);  
  36. } catch (Exception e) {  
  37. //ignore  
  38. }  
  39. }  
  40. setLevel(level == null? STAFLevel.DEBUG : level);  
  41. }  


在实现配置文件支持的代码中,有以下几个要点:

1、STAF API 的初始化需要注册 STAFHandle 对象。而且该注册只能执行一次。我们根据全局变量 stafHandle 的值来决定是否注册该对象。

2、JDK的日志框架有一个全局的 singleton 管理类 STAFManager,该类用于管理日志类,并提供了读取日志配置文件的成员函数 getProperty 。在上述的代码中,我们通过 STAFManager.getProperty 方法,从日志配置文件中读取 STAFHandler 对象所设置的 Formatter 类名,然后通过反射生成一个新的 Formatter 对象,设置到 Handler 对象中。

3、对于日志级别也是通过 STAFManager.getProperty 方法。需要注意的是由于我们的日志级别是自定义的级别,所以 Level 对象是由我们自定义的 Level 类 STAFLevel 来生成的。

4、我们也能定义自己需要的属性。比如清单 9 中我们定义了一个 .name 属性,用来存储 STAF 日志名称,通过 getProperty 函数从配置文件中读取 .name 属性。

JDK日志框架之实例结合STAF的情况就介绍到这里,那么关于JDK日志框架之实例结合STAF的更多情况,我们要在学习过程中加以巩固提高。

【编辑推荐】

  1. Java虚拟机内部构成浅析
  2. 浅谈Java线程的生命周期
  3. 关于Java继承的一些复习
  4. 实现Java中对象比较的两个方法
  5. Java中两个特殊变量this和super 的使用
责任编辑:仲衡 来源: 新浪博客
相关推荐

2009-07-07 15:53:02

JDK日志

2009-07-07 14:00:25

JDK日志Handler

2009-07-07 13:45:52

JDK日志框架

2010-02-05 15:33:29

Android JDK

2009-07-07 16:13:39

JDK日志

2009-07-07 14:32:47

JDK日志Formatter

2009-07-07 16:39:40

JDK Observe

2011-07-07 17:06:03

SQL Server

2009-07-08 17:59:51

JDK JRE

2009-07-08 14:06:22

ClassLoaderJDK源码

2009-07-09 11:02:37

JDK5.0内置工具

2022-05-24 07:39:09

MySQL数据库日志

2009-07-27 14:29:31

ASP.NET编程弹窗报警提示

2009-09-14 16:46:15

LINQ to XML

2009-07-16 09:14:26

iBATIS DAO

2009-09-22 13:09:06

Hibernateorm框架

2009-07-08 17:02:11

JDK实现调用拦截器

2009-07-22 09:44:05

iBATIS Para

2009-08-27 13:30:11

C# interfac

2009-08-06 10:49:45

ASP.NET服务器控
点赞
收藏

51CTO技术栈公众号