調試信息輸出

在URule Pro提供的所有(yǒu)類型的規則文(wén)件中(zhōng),在它們的屬性裏都有(yǒu)一個名(míng)為(wèi)“允許調試信息輸出”的屬性,我們需要做的就是添加這個屬性同時設置屬性值為(wèi)“是”,這樣規則在運行時默認就會向控制台打印出包含條件匹配信息、動作(zuò)執行情況等所有(yǒu)日志(zhì)信息,通過這些信息我們可(kě)以跟蹤規則執行情況,在規則出現錯誤或與預期不一緻時通過調試信息的輸出就可(kě)快速定位問題所在。

下图展示的就是添加了“允許調試信息輸出”的屬性并設置為(wèi)“是”後的效果。

在URule Pro中(zhōng)還提供了一個名(míng)為(wèi)urule.debug的系統屬性,該屬性值默認為(wèi)true,這時所有(yǒu)調試信息默認都會直接在日志(zhì)中(zhōng)打印,當将産(chǎn)品部署到生産(chǎn)環境中(zhōng)時,我們需要将urule.debug屬性設置為(wèi)false,這樣所有(yǒu)調試信息都不會再輸出,這其中(zhōng)也包括URule規則集裏提供的名(míng)為(wèi)“打印内容到控制台”的動作(zuò),這樣就可(kě)以快速完成項目上線(xiàn),而不用(yòng)擔心項目中(zhōng)因有(yǒu)大量調試信息輸出而需要重新(xīn)修改規則屬性的問題。如下图所示:

在向導式規則集文(wén)件當中(zhōng),為(wèi)了更好的統一控制日志(zhì)開關,在設計器上方的配置按鈕菜單下提供了一個針對當前文(wén)件級的日志(zhì)開關控制的菜單項,如下图所示:

一旦我們配置了這個菜單項裏的日志(zhì)開關,那麽當前規則文(wén)件中(zhōng)沒有(yǒu)顯示配置是否允許日志(zhì)輸出的規則将采用(yòng)這裏配置的日志(zhì)開關屬性,如果單個規則中(zhōng)配置了日志(zhì)輸出屬性,那麽将覆蓋工(gōng)具(jù)欄中(zhōng)統一配置的日志(zhì)開關屬性。

日志(zhì)輸出目的地配置

在代碼中(zhōng)調用(yòng)規則時,如果也要在本地查看調試信息,那麽首先需要将urule.debug屬性設置為(wèi)true,接下來為(wèi)urule.defaultHtmlFileDebugPath屬性設置一個具(jù)體(tǐ)的已存在的目錄值即可(kě)。 設置好urule.defaultHtmlFileDebugPath屬性後,默認會向這個屬性對應的目錄中(zhōng)輸出以HTML格式的日志(zhì)文(wén)件(默認情況下urule.defaultHtmlFileDebugPath屬性值為(wèi)空,不會輸出任何日志(zhì)文(wén)件),輸出的HTML日志(zhì)文(wén)件采用(yòng)的是時間戳命名(míng)方式,在生産(chǎn)環境下建議清空urule.defaultHtmlFileDebugPath屬性,以免調試信息輸出對性能(néng)産(chǎn)生影響。

在使用(yòng)API調用(yòng)規則時需要在session.fireRules()或session.startProcess(...)方法後加上session.writeLogFile()方法,這樣才會執行日志(zhì)寫入操作(zuò)。

在某些情況下,為(wèi)了方便查看,我們可(kě)能(néng)需要将這些調試信息輸出到一個具(jù)體(tǐ)的文(wén)件,對于這一點,URule Pro也提供了相應的支持。 我們需要做的就是實現一個com.bstek.urule.runtime.log.LogWriter接口的實現類,并将其配置在Spring當中(zhōng),讓其成為(wèi)一個标準的Spring Bean,這個引擎就可(kě)以發現并在日志(zhì)輸出的時候調用(yòng),com.bstek.urule.runtime.log.LogWriter接口源碼如下:

package com.bstek.urule.runtime.log;

import java.io.IOException;
import java.util.List;

/**
 * @author Jacky.gao
 * @since 2018年12月11日
 */
public interface LogWriter {
    void write(List<Log> logs) throws IOException;
}

在這個LogWriter接口中(zhōng),要輸出的是一個Log接口,如果要實現自己的LogWriter實現類,那麽可(kě)以對這裏的Log接口進行叠代,下面是系統内置的默的輸出到控制台的ConsoleLogWriter類源碼,實際使用(yòng)時可(kě)以依照此代碼來叠代日志(zhì)信息。

package com.bstek.urule.console.servlet.console;

import java.io.IOException;
import java.util.List;

import com.bstek.urule.runtime.log.DataLog;
import com.bstek.urule.runtime.log.Log;
import com.bstek.urule.runtime.log.LogWriter;
import com.bstek.urule.runtime.log.UnitLog;

/**
 * @author Jacky.gao
 * @since 2017年11月28日
 */
public class ConsoleLogWriter implements LogWriter {

    @Override
    public void write(List<Log> logs) throws IOException {
        StringBuilder sb=new StringBuilder();
        buildLogs(sb, logs);
        System.out.println("Console key : "+key);
    }
    private void buildLogs(StringBuilder msg,List<Log> logs) {
        for(Log log:logs){
            if(log instanceof UnitLog) {
                msg.append("<div style=\"margin:8px;border:dashed 1px #cccccc\">");
                UnitLog unit=(UnitLog)log;
                List<Log> unitLogs=unit.getLogs();
                buildLogs(msg, unitLogs);
                msg.append("</div>");
            }else if(log instanceof DataLog) {
                DataLog dataLog=(DataLog)log;
                String htmlMsg=dataLog.getHtmlMsg();
                msg.append(htmlMsg);
            }
        }
    }
}

LogWriter接口實現後配置到Spring上下文(wén)環境裏,在代碼中(zhōng)調用(yòng)要生效同樣需要在session.fireRules()或session.startProcess(...)方法後加上session.writeLogFile()方法,否則将不會觸發執行。

上面介紹的通過配置urule.defaultHtmlFileDebugPath屬性就會在指定目錄生成日志(zhì)文(wén)件的操作(zuò),實際上就是系統提供的一個默認的LogWriter接口實現類,該實現類在運行前會判斷urule.defaultHtmlFileDebugPath屬性值是否為(wèi)空, 如果為(wèi)空,則不做任何操作(zuò),不為(wèi)空,那麽就認為(wèi)這個值是一個目錄,并嘗試在這個目錄中(zhōng)生成HTML格式的日志(zhì)文(wén)件。

最後,再次強調,如果要将項目部署到生産(chǎn)環境,一定要将urule.debug屬性設置為(wèi)false,否則因為(wèi)有(yǒu)調試信息産(chǎn)生會影響系統性能(néng),urule.debug屬性設置為(wèi)false後,所有(yǒu)的調試信息都将不再輸出,包括“打印内容到控制台”的内置動作(zuò)也不再執行。

results matching ""

    No results matching ""