转载

通过一个日志框架为 IBM Operational Decision Manager 中的业务规则调试提供补充

简介

在 IBM ODM 中开发业务规则的流程涉及到开发人员与业务用户合作,基于业务词汇表和相应的执行对象模型 (XOM) 开发业务对象模型 (BOM)。然后他们帮助业务用户成功启动规则项目:为操作和决策表创建规则流、功能、复杂的规则、规则模板,通常还要创建初始规则集。在规则开发期间启用日志记录和跟踪,可帮助理解规则的执行情况。调试运行时错误和意料之外的结果,可将问题区域缩小到规则流中的一个规则工件或一组工件。但是,强烈建议在将规则部署到生产环境中时,删除在规则开发的初始阶段向规则添加的日志,以便在运行时不会在规则中混杂不必要的日志语句。

试用 Business Rules 服务

在业务策略变更时,花更少时间来记录和测试。 来自 Bluemix 的 Business Rules 服务 通过保持业务逻辑与应用程序逻辑分离,最大限度地减少代码更改。免费试用它!

本教程介绍在一个 IBM ODM 规则项目中的各种规则工件中启用日志功能的方法。“下载” 部分提供的代码示例示范了多种向规则项目添加日志的方法,比如使用虚拟 BOM 记录器类、Java 开发工具包 (JDK) XOM 记录器类和启用了日志的 Java XOM。可从本教程的 “下载” 部分下载code_sample.zip文件并解压它。本教程还将介绍如何在运行时通过 WebSphere Application Server 管理控制台更改日志级别。本文主要适用于 IBM ODM 业务规则开发人员。本教程中介绍的技术已在 IBM ODM V8.7.0 中测试过(应该适用于带有 Java V1.7 JDK 的 8.0.1 和 8.6 版)。

回页首

IBM ODM 中的调试和跟踪工具

在 IBM ODM 中,可使用 Rule Designer 来在一台应用服务器上运行的 Rule Execution Server 上远程调试规则项目中的问题。要了解如何在应用服务器上启用调试模式,向规则添加断点,以及从 Rule Designer 运行和单步调试它们,请参阅 IBM 知识中心上的 IBM ODM 文档中的 在应用服务器上执行远程调试 。

跟踪级别和选项也可通过 Rule Execution Server 控制台启用。在 WebSphere Application Server 上,执行单元的活动由 Rule Execution Server 使用 Java 记录器来记录。但是,Rule Execution Server 控制台日志不会捕获一些细节,比如一个输入参数中的数据,或者规则流或规则工件级别的其他细节。

开发了一组稳定的规则后,可使用 Decision Warehouse(Rule Execution Server 控制台中的一个工具)跟踪规则集的执行。Decision Warehouse 中提供的执行跟踪信息包含如何做出决策和执行规则的详细信息,包括执行规则流中的规则时采取的路径、规则集执行时间,以及输入和输出参数。然后可基于记录到 Decision Warehouse 数据库的跟踪信息生成度量业务绩效的报告。需要执行一些步骤才能使用默认的 Decision Warehouse,比如安装数据库,设置数据库资源,以及通过 Rule Designer 或 Rule Execution Server 启用规则集执行监视属性。有关 Decision Warehouse 的详细信息,请参阅 IBM 知识中心中的 IBM ODM 文档。Decision Warehouse 是在开发了一组稳定的规则后监视和记录规则集执行的标准方式。但是,在规则集仍在演变的规则开发早期阶段中,或者在需要一定程度的细节(比如上次成功执行的 Business Action Language (BAL) 或 ILOG Rule Language (IRL) 代码中的位置)的情形中,Decision Warehouse 可能不是最佳的监视和记录选择。

要捕获规则流或规则工件细节,以及跟踪规则流,可将 BAL print 语句和 IRL System.out.print* 语句添加到各种规则工件中。这些方法会向控制台日志中写入详细的跟踪输出。使用这种静态方法启用和禁用跟踪信息,涉及到使用注释或通过物理删除方式来删除这些打印语句。如不实际删除日志信息,无法使用此方法动态地控制这一操作,或者控制日志级别或跟踪日志目的地。可在业务规则项目中使用 JDK 日志 API 或 Apache Log4J 等日志框架来动态地控制 IBM ODM 中的日志记录和跟踪。它们提供了特性丰富、动态且灵活的日志记录机制。

回页首

在规则项目中使用记录器启用日志

JDK 日志 API 和其他日志框架无法直接用在 IBM ODM 规则项目中的规则工件中的 BAL 和 IRL 语句中。以下各节介绍使用这些日志框架来记录规则工件中的消息的不同方式。

创建虚拟记录器和日志级别类

创建一个虚拟日志级别和记录器类,其中包装了可用在 BOM 中的 java.util.logging.Level JDK 日志 API 类。要在 BOM 中使用自定义日志级别,需创建一个封装了 java.util.logging.Level 记录器级别类的虚拟记录器级别类。这些虚拟类中的成员必须从 JDK 日志 API 映射到它们相应的记录器和日志级别执行类。如果新创建的虚拟 BOM 类要用作 BAL 元素,规则开发人员然后可动词化这些类。

接下来,从 JDK 日志 API 中的记录器和日志级别类映射到预期的日志方法。必须在记录器虚拟 BOM 类中实现的关键方法是一个 get*Logger(...) 方法。这些方法通过委派对 java.util.Logging.Logger 类中包装的相应方法的调用,返回一个现有的或新的记录器的实例。图 1 演示了一个虚拟的记录器和日志级别 BOM 类。

图 1. 虚拟 BOM 记录器和日志级别类

通过一个日志框架为 IBM Operational Decision Manager 中的业务规则调试提供补充

导入 Java JDK API 日志类来创建 BOM

添加日志框架的另一种方式是导入相应的日志框架类作为 Java XOM 类。对于 JDK 日志 API,来自 JDK 的 java.util.logging 包的记录器和日志级别类可作为 Java XOM 类导入到规则项目中。

  1. 创建一个新 BOM 条目,如图 2 所示。

    图 2. 从 XOM 创建一个 BOM 条目

    通过一个日志框架为 IBM Operational Decision Manager 中的业务规则调试提供补充
  2. 单击 Browse XOM 找到 BOM Entry 窗口中的 JDK XOM,如图 3 所示。因为 JDK XOM 中的类的数量很大,所以加载各种 XOM 类来进行选择可能会花一些时间。

    图 3. 为新 BOM 条目选择 JDK XOM

    通过一个日志框架为 IBM Operational Decision Manager 中的业务规则调试提供补充

向一个 BOM 或 Java XOM 类的成员添加日志功能

在规则项目的规则工件中启用日志的另一种方式是,直接在一个 BOM 类或 Java XOM 类的成员中使用日志框架。可向 BOM 模型中包含的属性或仅用于日志消息的实用程序方法添加日志功能。要查看此工作原理的演示,请下载示例代码。可从本教程的 “下载” 部分下载code_sample.zip文件并解压它。其中创建了一个 Java XOM 类,它的唯一用途是使用记录器来记录消息。该示例还包含一个 RuleLogLevel 类,该类扩展 java.util.logging.Level 并添加一个名为 ODMINFO 的自定义日志级别。

回页首

向规则工件添加日志功能

日志框架可用后,可将它用于规则项目的规则工件中的 BAL 和 IRL 语句。因为同一个记录器可用于所有规则工件,所以为记录器 BOM 类类型定义单个全局变量。在规则项目的主要规则流的开始节点中,调用记录器的 getLogger 方法来初始化该变量。调用 getLogger 成员时,在分层命名空间中使用一个有意义的名称,比如一个包含规则项目名称且可用于标识记录器的名称,例如: <Logger>.getLogger(ruleset.name)

初始化后的记录器现在已可使用。但是,前面已经提到,在将规则部署到生产环境时,添加到规则的日志功能不应保留,这可避免在规则中混杂不必要的日志语句。

可从本教程下载的示例规则项目包含使用 3 种不同类型的记录器向各种工件添加日志功能的例子:1) 虚拟 BOM 记录器 2) JDK XOM 记录器和 3) 封装了记录器的 Java XOM 类。其中还将日志功能直接添加到 Customer BOM 类的 taxCode 成员。图 4 显示了在开始节点的初始操作中初始化这 3 个不同的记录器的示例规则流。规则流中的每个规则任务使用一个不同的记录器来演示它们的工作原理。

图 4. 规则流的开始节点中初始化的记录器

通过一个日志框架为 IBM Operational Decision Manager 中的业务规则调试提供补充

在每个规则任务的初始和最终操作中,添加了来自 3 个不同的记录器的 enteringexiting 日志记录方法。下面的例子展示了如何使用来自 Java XOM 类的 entering 方法和一个为 Rule Task 1 使用自定义日志级别的 log 方法。

点击查看代码清单

关闭 [x]

jxomlogger.entering(currentTask.package.name, currentTask.name); jxomlogger.log(RuleLogLevel.ODMINFO, "Using custom log level, before executing rules in task " + currentTask.name);

下面的例子展示了如何使用来自 JDK XOM 类的动词化的 fine 方法,该方法用作 BAL 语句来记录规则流中结束节点的最终操作中的详细消息: log the fine message "END:Ruleflow" to 'the JDK XOM Logger';

回页首

检查规则工件记录的消息

在一个 WebSphere Application Server 环境中,默认控制台记录器将消息记录到 System.out.log 文件和一个 trace.log 文件。图 5 演示了在执行附加的示例规则项目时生成的日志输出。在这个例子中,Rule Execution Server 在 WebSphere Application Server 上运行,日志级别设置为 INFO 。可以在 System.out.log 代码段中看到,记录器的名称包含规则项目名称和不同的日志级别。还可以看到,日志输出中显示了自定义日志级别消息 SEVERE + 10

图 5. 规则流的开始节点中初始化的记录器

通过一个日志框架为 IBM Operational Decision Manager 中的业务规则调试提供补充

回页首

更改规则集的消息日志级别

日志级别控制记录器记录的信息的类型和数量。此值可在运行时依据部署 Rule Execution Server 或 Decision Server 的应用服务器而更改。在 Rule Execution Server 或 Decision Server 在应用服务器上运行的运行时环境中,可在应用服务器的管理控制台上控制日志级别。要在 Rule Execution Server 或 Decision Server 在 WebSphere Application Server 上运行的环境中更改规则项目所使用的记录器的日志级别,可执行以下步骤:

  1. 登录到管理控制台并选择 Troubleshooting > Logs and trace
  2. 选择部署了 Rule Execution Server 或 Decision Server 的服务器,如图 6 所示。

    图 6. WebSphere Application Server 中的日志和跟踪设置菜单

    通过一个日志框架为 IBM Operational Decision Manager 中的业务规则调试提供补充
  3. Logging and tracing > server1 选项页面选择 Change log details level ,如图 7 所示。

    图 7. 更改日志细节级别的菜单选项

    通过一个日志框架为 IBM Operational Decision Manager 中的业务规则调试提供补充
  4. ConfigurationRuntime 选项卡上,更改可由规则集名称标识的规则项目组件名称的日志级别。图 8 显示了一个将规则项目中使用的所有记录器的日志级别更改为 all 的示例。

    图 8. 更改日志级别设置

    通过一个日志框架为 IBM Operational Decision Manager 中的业务规则调试提供补充
  5. 保存更改的日志级别细节。(服务器可能需要重新启动,更改才能生效。)图 9 显示了在日志级别被改为 all 后执行的一个示例规则集的日志输出。可以注意到从不同的规则工件记录了额外的 entering、exitingfinefiner 细节,包括从 BOM 属性记录的消息:BOM 到 XOM 的映射。请注意,如果使用 WebSphere Application Server,此信息通常可在 trace.log 输出文件(或另一个位置,取决于您的配置设置)中找到。

    图 9. 更改日志级别设置

    通过一个日志框架为 IBM Operational Decision Manager 中的业务规则调试提供补充

回页首

结束语

本教程介绍了如何通过使用记录器记录日志,为 IBM ODM 中提供的现有调试方法提供补充。您学习了创建记录器的 3 种不同方式,以及使用记录器来向规则项目添加不同日志级别的跟踪消息的许多方式。在开发和测试阶段中添加日志功能时要特别注意,以避免在规则中混杂不必要的日志消息。最后,本教程还通过代码示例展示了如何动态地更改控制日志消息的粒度的日志级别。

致谢

感谢 Pierre Berlandier 对本文提供技术评审和宝贵的反馈。

回页首

下载

描述 名字 大小
代码示例 code_sample.zip 44KB
正文到此结束
Loading...