如何使用log4j的logger打印Drools的调试日志信息
1.导入需要的包
修改pom.xml文件,加入log4j、slf4j的坐标
<properties>
<log4j.version>1.2.17</log4j.version>
<slf4j.version>1.7.25</slf4j.version>
</properties>
<!-- log4j start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log4j end -->
2.配置文件log4j.properties
### 设置日志级别###
log4j.rootLogger = debug,stdout
#log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
#### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
#log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.D.File = E://logs/log.log
#log4j.appender.D.Append = true
#log4j.appender.D.Threshold = DEBUG
#log4j.appender.D.layout = org.apache.log4j.PatternLayout
#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#
#### 输出ERROR 级别以上的日志到=E://logs/error.log ###
#log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.E.File =E://logs/error.log
#log4j.appender.E.Append = true
#log4j.appender.E.Threshold = ERROR
#log4j.appender.E.layout = org.apache.log4j.PatternLayout
#log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
配置文件的位置:
main目录下resources下的log4j.properties,默认位置,不要更改。
3.测试代码
代码中需要通过kiesession设置一个全局变量logger
kieSession.setGlobal("logger",logger);
drl文件如下:
在文件顶端加入 global org.slf4j.Logger logger,规则文件中就可以直接用logger来输出日志了。
```Plain Text package demo
import com.lt.drools.entity.Order; global org.slf4j.Logger logger
rule "大于等于3件减180元" when order.setOriginalPrice($order.getOriginalPrice()-180); logger.debug("触发规则:"+drools.getRule().getName());
end
具体测试代码:
```java
private static Logger logger = LoggerFactory.getLogger(TestDroolsDemo.class);
/**
* 测试Drools 的logger
*/
@Test
public void test3(){
KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
//会话对象,用于和规则引擎交互
KieSession kieSession = kieClasspathContainer.newKieSession();
kieSession.setGlobal("logger",logger);//设置全局变量
//构造订单对象,设置原始价格,由规则引擎根据优惠规则计算优惠后的价格
Order order = new Order();
order.setOriginalPrice(680);
order.setGoodsNum(3);
//将数据提供给规则引擎,order
kieSession.insert(order);
System.out.println("优惠后的价格1:"+order.getDiscountPrice());//应该是0,因为还没有执行规则
//激活规则引擎,如果规则匹配成功则执行规则
kieSession.fireAllRules();
System.out.println("优惠后的价格2:"+order.getDiscountPrice());//通过fireAllRules规则才开始执行
//关闭会话
kieSession.dispose();
}
执行后输出:
用log4j的方法来输出drools的匹配信息,可以避免使用工具类出现的问题。