18.调试信息输出

概述

在URule Pro提供的所有类型的规则文件中,在它们的属性里都有一个名为“允许调试信息输出”的属性,我们需要做的就是添加这个属性同时设置属性值为“是”,这样规则在运行时默认就会向控制台打印出包含条件匹配信息、动作执行情况等所有日志信息,通过这些信息我们可以跟踪规则执行情况,在规则出现错误或与预期不一致时通过调试信息的输出就可快速定位问题所在。

下图展示的就是添加了“允许调试信息输出”的属性并设置为“是”后的效果。

在URule Pro中还提供了一个名为urule.debug的系统组属性,该属性值默认为true,这时所有调试信息默认都会直接在控制台上打印,当将产品部署到生产环境中时,我们需要将urule.debug属性设置为false,这样所有调试信息都不会再输出,这其中也包括URule规则集里提供的名为“打印内容到控制台”的动作,这样就可以快速完成项目上线,而不用担心项目中因有大量调试信息输出而需要重新修改规则属性的问题。如下图所示:

调试信息输出目的地配置

对于调试信息输出,默认是直接输出到控制台,在某些情况下,为了方便查看,我们可能需要将这些调试信息输出到一个具体的文件,对于这一点,URule Pro也提供了相应的支持。如果需要将调试信息输出到文件,我们需要将属性urule.debugToFile的值设置为true,该属性值默认为false,这样在urule.debug为true时只会输出到控制台;当urule.debugToFile属性设置为true时,URule会尝试将调试信息提供给所有实现了com.bstek.urule.debug.DebugWriter接口的实现类(不再将调试信息输出到控制台),由这个实现类来决定具体该输出到何处。

当urule.debugToFile属性设置为true时,表示会将调试信息写入到实现了DebugWriter接口的实现类,这时,我们在规则调用时需要在session.fireRules()或session.startProcess(...)方法后加上session.writeLogFile()方法,该方法的作用就是尝试执行将调试信息写入到DebugWriter接口的实现类,如果不调用session.writeLogFile()方法,将不会执行调试信息写入到DebugWriter接口的实现类操作。

以下为DebugWriter实现类源码(实现类需要配置到spring中成为一个标准bean,这样引擎才能发现并使用它)

package com.bstek.urule.debug;
import java.io.IOException;
import java.util.List;

/**
 * @author Jacky.gao
 * @since 2017年11月27日
 */
public interface DebugWriter {
    void write(List<MessageItem> items) throws IOException;
}

在URule Pro的core模块中,默认提供了一个输出到具体文件的DebugWriter接口的实现类,要启用这个实现类,我们只需要配置好urule.defaultHtmlFileDebugPath属性,该属性用于定义输出调试信息文件的目录,一旦定义了这个目录,那么会在这个目录下生成一个名为urule-debug.html的HTML文件,这样用浏览器打开就可以查看具体的调试信息了。

如果我们的规则是在一个包含urule-console-pro模块的项目中运行(比如仿真测试),那么在urule.debugToFile属性设置为true后,会发现运行规则后会在控制台打印“Console key : X”类似信息,这是因为在urule-console模块也提供了一个DebugWriter接口实现类,只是这个实现类可以将调试输出信息输出到一个URL,通过访问这个URL就可以看到指定key的控制台输出信息,查看调试信息的URL格式如下:

http://servername/urule/console?key=\[key值\]

在上面的URL中,key值就是控制台打印“Console key : X”中的"X"值,这个值是一个数字,每次执行都会进行累加,所以如果看不到控制台输出信息,只需要每次执行完规则后累加这个数字就可以通过上述URL查看输出的调试信息(通过访问console这个URL查看调试信息的有效期为3分钟,也就是规则执行完3分钟内可以查看,3分钟后会自动清除,以防止内存占用)。

最后,再次强调,如果要将项目部署到生产环境,一定要将urule.debug属性设置为false,否则因为有调试信息产生会影响系统性能,urule.debug属性设置为false后,所有的调试信息都将不再输出,包括“打印内容到控制台”的内置动作也不再执行。

results matching ""

    No results matching ""