第13章 ロギング

本章を読んで、 ビジネスプロセスマネージャが提供するロギング機能やロギング機能を活用できる様々な方法について学びましょう。
ロギングの目的は、 プロセス実行の履歴を記録することです。 各プロセス実行のランタイムデータが変更されると、 変更はログに保存されます。

注記

本章で説明するプロセスロギングソフトウェアロギングを混同しないようにしてください。ソフトウェアロギングは、ソフトウェアプログラムの実行を追跡します (通常、デバッグが目的です)。反対にプロセスロギングは、プロセスインスタンスの実行の追跡をします。
プロセスロギング情報を利用する多くの方法があります。 最も明確な方法は、プロセス実行の参加者によるプロセス履歴のコンサルティングです。
他のユースケースとして、ビジネスアクティビティ監視 (Business Activity Monitoring: BAM) があります。BAM は、ビジネスプロセスに関して役に立つ統計情報を見つけるために、プロセス実行ログのクエリや分析を行います。この情報は「真の」ビジネスプロセス管理を組織に実装する手掛かりとなります (真のビジネスプロセス管理とは、組織がプロセスを管理する方法、 プロセスが情報技術にサポートされる方法、これらの 2 つをお互いに反復プロセスで向上させる方法などです)。
元の状態に戻すためプロセスログを使用することもできます。 ログにはランタイム時の情報変更記録がすべて含まれているため、 プロセスを前の状態に戻すために逆順で実行することができます。

13.1. ログの作成

ビジネスプロセスマネージャモジュールはプロセス実行を実行する時にログを作成しますが、 ユーザーもプロセスログを挿入することができます (ログエントリは、 org.jbpm.logging.log.ProcessLog を継承する Java オブジェクトです)。 プロセスログエントリは、 ProcessInstance の任意拡張である LoggingInstance に追加されます。
ビジネスプロセスマネージャは、 グラフ実行ログ、 コンテキストログ、 タスク管理ログなど様々な種類のログを生成します。 inheritance tree をナビゲートできるため、 org.jbpm.logging.log.ProcessLog から開始するとよいでしょう。
LoggingInstance はすべてのログエントリを収集します。 ProcessInstance が保存されると、 データベースへフラッシュされます (ProcessInstancelogs フィールドは Hibernate へマップされていません。 これは、 各トランザクションでデータベースより読み取られるログを回避するためです)。
ProcessInstance は実行パスのコンテキストで作成されます。 そのため、 ProcessLogインデックスシーケンスジェネレータ ともなるそのトークンを参照します (後続のトランザクションによって作成されたログは順次的なシーケンス番号が付けられるため、 ログの読み出しに重要となります)。
この API メソッドを使用してプロセスログを追加します。
public class LoggingInstance extends ModuleInstance {
  ...
  public void addLog(ProcessLog processLog) {...}
  ...
}
これは情報ロギングの UML 図になります。
JBPM ロギング情報クラス図

図13.1 JBPM ロギング情報クラス図

CompositeLog は特別なログエントリです。 複数の子ログの親ログとなるため、 階層構造を適用する方法を提要します。 次のアプリケーションプログラミングインターフェースはログの挿入に使用されます。
public class LoggingInstance extends ModuleInstance {
  ...
  public void startCompositeLog(CompositeLog compositeLog) {...}
  public void endCompositeLog() {...}
  ...
}
階層構造の一貫性を保つため、 CompositeLog は常に try-finally-block で呼び出されなければなりません。 例は次の通りです。
startCompositeLog(new MyCompositeLog());
try {
  ...
} finally {
  endCompositeLog();
}