こんにちは。平田です。
Droolsでは、ルールエンジンの内部的な挙動をログ出力する仕組みがあり、ルールを書くときによく使います。これをDrools 6 で使う手順を説明します。
マニュアルの4.2.4.5. KieRuntimeLogger によれば、kmodule.xmlでLoggerを組み込んだKieSessionを定義するか、APIでLoggerをセットアップします。これを参考に、以下の様なコードを書きます。
KieRuntimeLogger logger = KieServices.Factory.get().newConsoleLogger(ksession);
Loggerは、内部的にSLF4JにてINFOレベルでログ出力しているため、ロギングライブラリをセットアップする必要があります。私はLogbackを使いました。
まずMavenの依存性を追加し、
... <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.1</version> <scope>test</scope> </dependency>
Logbackを設定します。
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender" > <encoder> <pattern>%d{HH:mm:ss,SSS} %-5p [%c] \(%t\) %m%n</pattern> </encoder> </appender> <logger name="org.drools" level="info" /> <root level="info"> <appender-ref ref="CONSOLE" /> </root> </configuration>
これで監査ログが出るようになります。
05:57:23 INFO [org.drools.core.audit.WorkingMemoryConsoleLogger] (main) OBJECT ASSERTED value:com.natswell.yoyogi.infrastructure.rule.fact.OrderItemFact@2b136b1d factId: 1 05:57:23 INFO [org.drools.core.audit.WorkingMemoryConsoleLogger] (main) OBJECT ASSERTED value:com.natswell.yoyogi.domain.model.DiscountPolicyTest$1@b569bee factId: 2 05:57:23 INFO [org.drools.core.audit.WorkingMemoryConsoleLogger] (main) OBJECT ASSERTED value:com.natswell.yoyogi.domain.model.DiscountPolicyTest$1@548daae6 factId: 3 05:57:23 INFO [org.drools.core.audit.WorkingMemoryConsoleLogger] (main) ACTIVATION CREATED rule:割引キャンペーン activationId:割引キャンペーン [1, 4] declarations: $orderItemFact=com.natswell.yoyogi.infrastructure.rule.fact.OrderItemFact@2b136b1d(1); $totalDiscountRate=0.3(4) 05:57:23 INFO [org.drools.core.audit.WorkingMemoryConsoleLogger] (main) BEFORE ACTIVATION FIRED rule:割引キャンペーン activationId:割引キャンペーン [1, 4] declarations: $orderItemFact=com.natswell.yoyogi.infrastructure.rule.fact.OrderItemFact@2b136b1d(1); $totalDiscountRate=0.3(4)