第13章 ロギング
この章では、Business Process Manager のロギング機能と、その機能を利用するさまざまな方法について説明します。
ロギングの目的は、プロセス実行の履歴を記録することです。各プロセス実行のランタイムデータが変更されると、変更がログに保存されます。
注記
この章で説明する プロセスロギング は、ソフトウェアロギング と混同しないよう注意してください。ソフトウェアロギングは、ソフトウェアプログラムの実行を (通常はデバッグ目的で) トレースします。プロセスロギングは、対照的に、プロセスインスタンスの実行を追跡します。
プロセスのログ情報が役立つ場面は数多くあります。これらの中で最も明白なのは、プロセス実行参加者によるプロセス履歴の参照です。
もう 1 つのユースケースは、ビジネスアクティビティーモニタリング (BAM) のユースケースです。これを使用すると、プロセス実行のログを照会または分析し、ビジネスプロセスに関する有用な統計情報を見つけることができます。この情報は、組織で "実際" のビジネスプロセス管理を実装する際の鍵となります。(実際のビジネスプロセス管理とは、組織がそのプロセスを管理する方法、情報技術によるプロセスのサポート方法、および反復的なプロセスでこれら 2 つを使用して相互に改善する方法に関係します。)
プロセスログは、"元に戻す" 操作の実装にも使用できます。ログには、ランタイムのすべての情報変更に関するレコードが含まれているため、変更を逆の順序で "再生" することで、プロセスを前の状態に戻すことができます。
13.1. ログの作成 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Business Process Manager モジュールは、プロセスの実行時にログを生成します。ただし、ユーザーはプロセスログを挿入することもできます。(ログエントリーは、
org.jbpm.logging.log.ProcessLog
から継承する Java オブジェクトです。) プロセスログのエントリーは、ProcessInstance
のオプションの拡張である LoggingInstance
に追加されます。
Business Process Manager は、グラフ実行ログ、コンテキストログ、タスク管理ログなど、さまざまな種類のログを生成します。
org.jbpm.logging.log.ProcessLog
から始めることをお勧めします。これを使用して、継承ツリー
の下層に移動することができるためです。
LoggingInstance
は、すべてのログエントリーを収集します。ProcessInstance
が保存されると、ログエントリーはここからデータベースにフラッシュされます。(ProcessInstance
の logs フィールドは Hibernate にマッピングされていません。これは、各トランザクションでデータベースから取得されるこれらのログを回避するためです。)
各
ProcessInstance
は実行パスのコンテキストで作成されるため、ProcessLog
はそのトークンを参照します。トークンは、インデックスシーケンスジェネレーター としても機能します。(これにより後続のトランザクションで生成されるログに連続したシーケンス番号が付けられるため、これはログの取得にとって重要です。)
次の API メソッドを使用して、プロセスログを追加します。
public class LoggingInstance extends ModuleInstance { ... public void addLog(ProcessLog processLog) {...} ... }
public class LoggingInstance extends ModuleInstance {
...
public void addLog(ProcessLog processLog) {...}
...
}
以下は、情報ログの UML 図です。
図13.1 jBPM のログ情報のクラス図
CompositeLog は特殊なケースです。これは、多数の子の親ログとして機能するため、階層構造を適用する手段を提供します。ログの挿入には、次のアプリケーションプログラミングインターフェイスを使用します。
階層構造が一貫していることを確認するために、
CompositeLog
は常に try-finally-block
で呼び出す必要があります。以下はその例です。
13.2. ログ設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
特定のデプロイメントにとってログが重要でない場合は、
jbpm.cfg.xml
設定ファイルのセクション jbpm-context からロギングの行を削除します。
<service name='logging' factory='org.jbpm.logging.db.DbLoggingServiceFactory' />
<service name='logging'
factory='org.jbpm.logging.db.DbLoggingServiceFactory' />
ログをフィルタリングするには、
LoggingService
のカスタム実装を記述します (これは DbLoggingService
のサブクラスです)。その後、ロギング用のカスタム ServiceFactory
を作成し、それを factory
属性で指定します。
13.3. ログの取得 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
プロセスインスタンスのログは、常にデータベースクエリーを介して取得する必要があります。
LoggingSession
を介してこれを実現するには、2 つの方法があります。
最初の方法は、プロセスインスタンスのすべてのログを取得する方法です。これらのログは、マップ内のトークンごとにグループ化されます。このマップは、
ProcessLog
のリストをプロセスインスタンス内のすべてのトークンに関連付けます。リストには、作成された順序と同じ順序で ProcessLogs
が含まれます。
public class LoggingSession { ... public Map findLogsByProcessInstance(long processInstanceId) {...} ... }
public class LoggingSession {
...
public Map findLogsByProcessInstance(long processInstanceId) {...}
...
}
2 番目の方法は、特定のトークンのログを取得する方法です。リストには、作成された順序と同じ順序で
ProcessLogs
が含まれます。
public class LoggingSession { public List findLogsByToken(long tokenId) {...} ... }
public class LoggingSession {
public List findLogsByToken(long tokenId) {...}
...
}
この章では、jBPM のロギングの仕組みとロギングのさまざまな用途の概要を説明しました。