在IBM ODM中开发业务规则的过程涉及开发人员与业务用户一起从业务词汇表和相应的执行对象模型(XOM)开发业务对象模型(BOM)。 然后,他们通过引导规则项目来协助业务用户:创建规则流,功能,复杂规则,操作和决策表的规则模板,以及通常的初始规则集。 在规则开发过程中启用日志记录和跟踪可以帮助您了解规则的执行方式。 调试运行时错误和意外结果可以将问题区域缩小到规则流中的规则工件或一组工件。 但是,强烈建议在将规则部署到生产环境时,在规则开发的初始阶段删除添加到规则的日志记录,这样在运行时,规则就不会因不必要的日志记录语句而混乱。
本教程描述了在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 Execution Server上的规则项目中的问题。 要了解如何在应用程序服务器上启用调试模式,向规则添加断点并从Rule Designer中运行和逐步调试它们,请参阅IBM Knowledge Center上的IBM ODM文档中的在应用程序服务器上进行远程调试 。
也可以通过Rule Execution Server控制台启用跟踪级别和选项。 在WebSphere Application Server上,Rule Execution Server使用Java记录器记录执行单元的活动。 但是,Rule Execution Server控制台日志记录不会捕获详细信息,例如输入参数中的数据或规则流或规则工件级别的其他详细信息。
开发稳定的规则集后,可以使用Rule Execution Server控制台中提供的工具Decision Warehouse来跟踪规则集的执行。 可从Decision Warehouse获得的执行跟踪包含有关如何制定决策和执行规则的详细信息,包括在规则流中执行规则时采用的路径,规则集执行时间以及输入和输出参数。 然后可以从记录到Decision Warehouse数据库的跟踪中生成衡量业务绩效的报告。 使用默认的Decision Warehouse需要一些步骤,例如,通过Rule Designer或Rule Execution Server安装数据库,设置数据库资源以及启用规则集执行监视属性。 有关决策仓库的详细信息,请参阅IBM Knowledge Center中的IBM ODM文档。 在开发出稳定的规则集之后,决策仓库是监视和记录规则集执行的标准方法。 但是,在规则仍在发展中或需要一定程度的详细信息(例如在业务操作语言(BAL)或ILOG规则语言中定位)的情况下,决策仓库在规则开发的早期阶段可能不是最佳的监视和日志记录选择。 (IRL)代码最后成功执行。
为了捕获规则流或规则工件细节并跟踪规则流,可以将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映射到其相应的记录器和级别执行类。 然后,如果规则开发人员用作BAL元素,则规则开发人员可以根据需要对其进行口头化。
接下来,从JDK日志记录API中的logger和level类实现所需的日志记录方法。 Logger虚拟BOM表类中必须实现的关键方法是get*Logger(...)
方法之一。 这些方法通过将调用委托给java.util.Logging.Logger
类中的相应包装方法来返回现有或新Logger的实例。 图1说明了一个虚拟记录器和一个日志级别BOM类。
图1.虚拟BOM记录器和级别类
通过导入Java JDK API日志记录类来创建BOM。
添加日志记录框架的另一种方法是将相应的日志记录框架类导入为Java XOM类。 对于JDK Logging API,可以将JDK的java.util.logging
包中的Logger和Level类作为Java XOM类导入到规则项目中。
- 创建一个新的BOM条目,如图2所示。
图2.从XOM创建BOM条目
- 单击Browse XOM在BOM Entry窗口上浏览JDK XOM,如图3所示。由于JDK XOM中的类数量很大,因此加载各种XOM类以进行选择可能需要一段时间。
图3.为新的BOM条目选择JDK XOM
将日志记录添加到BOM或Java XOM类的成员
启用登录规则项目的规则工件的另一种方法是直接在BOM表类的成员或Java XOM类中使用日志记录框架。 您可以将日志记录添加到BOM表模型中的属性或仅用于记录消息的实用程序方法中。 有关其工作原理的演示,请下载示例代码。 从本教程的“下载”部分,下载code_sample.zip并将其解压缩。 创建Java XOM类的唯一目的是使用记录器记录消息。 该示例还包括RuleLogLevel类,该类扩展了java.util.logging.Level
并添加了一个称为ODMINFO
的自定义日志级别。
将日志添加到规则工件
在使日志记录框架可用之后,可以将其与规则项目的规则工件中的BAL和IRL语句一起使用。 由于可以在所有规则工件中使用同一记录器,因此请为Logger BOM类类型定义一个全局变量。 在规则项目的主规则流的起始节点中,通过调用记录器的getLogger
方法来初始化变量。 调用getLogger
成员时,请在分层名称空间中使用有意义的名称,例如包含规则项目名称的名称,该名称可用于标识记录器,例如: <Logger>.getLogger(ruleset.name)
。
初始化的记录器现在可以使用了。 但是,如前所述,当将规则部署到生产环境时,不应继承添加到规则的日志,这样可以避免不必要的日志语句使规则混乱。
可通过本教程下载的示例规则项目包含使用三种不同类型的记录器将记录添加到各种工件中的示例:1)虚拟BOM表记录器2)JDK XOM记录器和3)封装记录器的Java XOM类。 它还将日志记录直接添加到Customer
BOM类的taxCode
成员中。 图4显示了示例规则流,该示例流在起始节点的初始操作中初始化了这三个不同的记录器。 规则流中的每个规则任务都使用不同的记录器来演示其工作方式。
图4.在规则流的起始节点中初始化的记录器
在这三个规则任务中的每一个的初始和最终操作中,添加了来自三个不同记录器的entering
和exiting
记录方法。 以下示例显示了如何对规则任务1使用Java XOM类中的entering方法和使用自定义日志级别的日志方法。
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';
: 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.在规则流的起始节点中初始化的记录器
更改规则集的消息日志级别
日志记录级别控制记录器记录的信息的类型和数量。 该值可以在运行时更改,并且取决于在其上部署了Rule Execution Server或Decision Server的应用程序服务器。 在Rule Execution Server或Decision Server在应用程序服务器上运行的运行时环境中,您可以在应用程序服务器的管理控制台上控制日志记录。 要在Rule Execution Server或Decision Server在WebSphere Application Server上运行的环境中更改规则项目使用的记录器的日志记录级别,请执行以下步骤:
- 登录到管理控制台,然后选择“ 故障排除”>“日志和跟踪” 。
- 选择部署了Rule Execution Server或Decision Server的服务器,如图6所示。
图6. WebSphere Application Server中的“日志和跟踪设置”菜单
- 从“ 日志和跟踪> server1”选项页面中选择“ 更改日志详细信息级别” ,如图7所示。
图7.更改日志详细信息级别菜单选项
- 在“ 配置和运行时”选项卡上,更改可由规则集名称标识的规则项目组件名称的日志记录级别。 图8示出改变用于在规则中的项目所用的所有记录器的记录级别的一例
all
。图8.更改日志级别设置
- 保存更改的日志级别详细信息。 (可能需要重新启动服务器才能使更改生效。)图9显示了将日志记录级别更改为
all
后执行的规则集示例的日志记录输出。 注意附加entering, exiting
以及fine
和finer
细节从不同规则工件已记录的,包括一个从一个BOM属性记录一条消息:BOM到XOM映射。 请注意,如果您正在使用WebSphere Application Server,则通常在trace.log
输出文件(或其他位置,取决于配置设置)中找到此信息。图9.更改日志级别设置
结论
本教程介绍了如何使用记录器通过记录补充IBM ODM中可用的现有调试方法。 您了解了创建记录器的三种不同方法,以及可以使用记录器将跟踪消息添加到具有不同日志级别的规则项目的许多方法。 在开发和测试阶段添加日志时要特别注意,以避免不必要的日志消息使规则混乱。 最后,本教程遍历了代码示例,以展示如何动态更改日志级别,该级别控制要记录的消息的粒度。
致谢
作者要感谢Pierre Berlandier对本教程的技术评论以及宝贵的反馈。
翻译自: https://www.ibm.com/developerworks/bpm/bpmjournal/1503_delima/1503_delima.html