ログ使用方法

Javaクライアントでは、ログの出力機能としてjava.util.logginパッケージを使用しています。
時間計測や、ビジネスルール実行結果ログなどを標準的に出力し、GUI画面、標準出力、ファイル出力を行う機能があります。
また、任意のFormatterクラスが指定できますので、独自フォーマットのログ出力も可能です。

補足補足
Ver1.1.0より新規機能追加

1. 設定場所

設定は、Config(RunClient.wdg)にて行います。
340行付近の ログHandlerの設定 にて、<handlers> のタグにて囲まれている部分が対象の設定です。
<handlers><run> のタグに囲まれている部分が、実行モード=run の場合に参照される設定になり、 <handlers><test> のタグに囲まれている部分が、実行モード=test の場合に参照される設定になります。
これらのノード以下に設定されている、<handler> ノードがログ出力先を指定しているノードになります。

 

2. 出力先の指定方法

ログ出力先は以下から選択可能です。

  1. デスクトップ のトレースログ
    jp.ne.mki.wedge.run.client.control.log.MemoryStringHandler
    設定可能な子ノードは、以下になります。
    1. <formatter>
      4.Formatterクラスの種類 を参考にしてください。
    2. <level>
      3. 出力レベルの指定方法 を参考にしてください。

    Formatterの設定、レベルの設定時にSecurityエラーが発生しないように作成されていますので、Applet,JWSでもSecurity設定無しで動作可能です。
  2. 標準出力
    jp.ne.mki.wedge.run.client.control.log.ConsoleHandlerNoSecurityCheck
    設定可能な子ノードは、以下になります。
    1. <formatter>
      4.Formatterクラスの種類 を参考にしてください。
    2. <level>
      3. 出力レベルの指定方法 を参考にしてください。

    java.util.logging.ConsoleHandler と同等の機能になりますが、Formatterの設定、レベルの設定時にSecurityエラーが発生しないようにラッピングされていますので、Applet,JWSでもSecurity設定無しで動作可能です。
  3. ファイル出力
    java.util.logging.FileHandler
    設定可能な子ノードは、以下になります。
    1. <formatter>
      4.Formatterクラスの種類 を参考にしてください。
    2. <encoding>
      文字セットエンコーディングの名前
    3. <level>
      3. 出力レベルの指定方法 を参考にしてください。
    4. <pattern>
      ファイル名の指定
      特殊文字が記述可能で "%t" システムの一時ディレクトリ 、"%h" user.home システムプロパティの値、 "%g" ログのローテーションを識別する生成番号 などが指定可能です。
      詳しい仕様は java.util.logging.FileHandlerを参照して下さい。
    5. <limit>
      ファイルに書き込むおよその最大量 (バイト数)
      0を指定すると、無制限になります。
      value属性に、最大量(数値)を指定して下さい。
    6. <count>
      循環する出力ファイル数
      limitが最大量に達したときに、循環する出力ファイル数になります。
      value属性に、ファイル数(数値) を指定して下さい。
    7. <append>
      任意の既存のファイルに追加するかどうかを指定
      value="true" もしくは value="false" と指定して下さい。

    pattern,limit,count,append ノードの指定がないとき もしくは 不正な値を入れられた時 はデフォルト値(JDKインストールディレクトリ\jre\lib\logging.properties に設定されている値)になります。
    ローカルアクセスを行う為、Applet,JWSで起動時にはSecurityを許可する必要があります。
    LoggingPermittion : permission java.util.logging.LoggingPermission "control";
    Fileアクセス:permission java.io.FilePermission "<<ALL FILES>>", "read,write";
    ファイル名に"%h"を使用する場合:permission java.util.PropertyPermission "user.home","read,write";
    encodingの指定が無い場合:permission java.util.PropertyPermission "file.encoding","read";
    を指定する必要があります。アプリケーションにて上記のようにローカルアクセスが発生する場合には「署名」を行う使用方法が一般的です。
    詳しくはJDKのドキュメントを参照して下さい。参考情報:署名、ポリシーファイル設定方法

出力したいものを、<handlers>以下に <handler> ノードにて追加します。
例えば、テストモードにて デスクトップ のトレースログ と ファイル出力 を行う場合には以下の設定になります。

・・・(省略)・・・
<test>
<handler class="jp.ne.mki.wedge.run.client.control.log.MemoryStringHandler">
 <formatter class="jp.ne.mki.wedge.run.client.control.log.formatter.VfSimpleFormatter" />
 <level value="ALL" />
</handler>

<handler class="java.util.logging.FileHandler">
 <formatter class="jp.ne.mki.wedge.run.client.control.log.formatter.VfXmlFormatter" />
 <level value="FINEST" />
</handler>
</test>
・・・(省略)・・・
		
補足補足
<formatter> ノードはFormatterクラスの指定、<level>は出力レベルの設定になります。 これらの説明は以降のドキュメントを参照して下さい。

 

3. 出力レベルの指定方法

出力レベル(<level>のvalueの値)を設定することで出力するログを制限できます。
ログのレベルは以下の種類があり、SERVERE が重要度高い(致命的なエラー)で、FINESTが重要度低い(トレースログ) になります。

  1. SEVERE
    致命的なエラー。実行エンジンからは設定することはありません
  2. WARNING
    警告的なエラー。指定クラスが存在しない場合、ルールにてExceptionをキャッチしたときなどには ダイアログの表示とともに、WARNINGのログに出力します
  3. INFO
    情報。実行エンジンからは起動時に実行Javaのバージョンなど
  4. CONFIG
    情報。実行エンジンからは設定なし
  5. FINE
    詳細情報。実行エンジンからは画面起動までの時間が出力されます。
  6. FINER
    詳細情報。実行エンジンからは実行リスト単位での実行時間が出力されます。
  7. FINEST
    詳細情報。実行エンジンからは ビジネスルールの単位での 詳細トレースが出力されます。

指定レベル以上のログが出力されるようになります。
例えば、ログレベルを、「FINER」にした場合、SEVERE ~ FINER までのログが出力されるようになります。
「FINER」だけのログを出力する・・・という事はできません。

 

4. Formatterクラスの種類

標準で提供しているクラスは以下があります。

  1. jp.ne.mki.wedge.run.client.control.log.formatter.VfSimpleFormatter
    最も単純なログを出力するFormatterです。
    Ver1.0.3以前のフォーマット形式と同等の出力になります。
  2. jp.ne.mki.wedge.run.client.control.log.formatter.VfXmlFormatter
    xml形式にてログを出力するFormatterです。

上記のFormatterでは JDK標準で付属している java.util.logging.SimpleFormatter などに比べてより多くの情報を出力 できるようになります。

 

5. 独自Formatterクラス作成方法

Formatterクラスを作成し、Configに設定することにより、独自フォーマットにてログが出力可能になります。
Formatterクラスは、java.util.logging.Formatter を継承し実装していれば登録が可能です。
Formatterクラス作成の詳細情報はJDKドキュメントを参照して下さい。

フォーマットを行うメソッドは、

public String format(LogRecord record)
にて行いますが、このLogRecordがVisualFrame用に拡張されたクラスが設定される場合があります。
以下のLogRecordの場合には拡張された情報を取得することによりより詳細なLogを出力することが可能です。

  1. ビジネスルール開始レコード
    jp.ne.mki.wedge.run.client.control.log.StartRuleLogRecord
    ビジネスルール開始時にLoggingされるレコードになります。
    取得情報拡張のため追加されたメソッドは以下になります。
    • public RuleEngineInterface getRuleObject()
      ビジネスルールオブジェクト取得
    • public String getPhysicalName()
      ビジネスルール物理名称取得
    • public String getLogicallName()
      ビジネスルール論理名称取得
    • public String getTiming()
      ビジネスルール実行タイミング取得
      Before,Afterなど
    • public String getTarget()
      ビジネスルール実行対象の取得
      Item,Frameなど
    • public String getFramePName()
      画面物理名取得
    • public String getFrameLName()
      画面論理名取得
    • public String getRuleType()
      ビジネスルール種類取得
    • public HashVector getInRecord()
      ビジネスルール入力レコード取得
    • public HashVector getOutRecord()
      ビジネスルール出力レコード取得

  2. ビジネスルール終了レコード
    jp.ne.mki.wedge.run.client.control.log.EndRuleLogRecord
    ビジネスルール終了時時にLoggingされるレコードになります。
    取得情報拡張のため追加されたメソッドは以下になります。
    • public String getResult()
      結果戻り値の取得
    • public long getTime()
      ビジネスルール実行使用時間の取得
    • public HashVector getInRecord()
      ビジネスルール入力レコード取得
    • public HashVector getOutRecord()
      ビジネスルール出力レコード取得

  3. タイムログレコード
    jp.ne.mki.wedge.run.client.control.log.TimeLogRecord
    タイムをLoggingするレコードになります。
    実行リスト単位の使用時間、画面表示の使用時間 のログに使用されています。
    • public long getTime()
      使用時間の取得
    • public String getTargetName()
      対象名称取得
    • public String getEventName()
      イベント名称取得

  4. 画面遷移時のデータ送受信のログレコード
    jp.ne.mki.wedge.run.client.control.log.FrameTransLogRecord
    タ 画面遷移時のデータ送受信情報をLoggingするレコードになります。
    実行リスト単位の使用時間、画面表示の使用時間 のログに使用されています。
    • public Object[] getTransData(int index)
      送受信情報取得
      object[0] 元アイテムオブジェクト
      object[1] 先アイテムオブジェクト
      object[2] 送信データ文字列
      object[3] 受信対象インデックス
      object[4] 受信対象が全ての場合は true
    • public int getSize()
      送受信ログの個数

Formatterの作成例

import java.util.logging.LogRecord;
import java.util.logging.SimpleFormatter;

import jp.ne.mki.wedge.run.client.control.log.StartRuleLogRecord;
import jp.ne.mki.wedge.run.client.control.log.EndRuleLogRecord;
import jp.ne.mki.wedge.run.client.control.log.FrameTransLogRecord;

public class SampleFormatter extends SimpleFormatter {

public String format(LogRecord record) {
	StringBuffer sb = new StringBuffer();
	// ビジネスルール開始レコードの時
	if(record instanceof StartRuleLogRecord){
		StartRuleLogRecord rule = (StartRuleLogRecord)record;
		sb.append("ルール 実行開始 (").append(rule.getPhysicalName()).append(")");
	}
	//ビジネスルール終了レコードの時
	else if(record instanceof EndRuleLogRecord){
		EndRuleLogRecord rule = (EndRuleLogRecord)record;
		sb.append("ルール 実行終了 (").append(rule.getPhysicalName()).append(")");
	}
	//画面遷移レコード
	else if(record instanceof FrameTransLogRecord){
		FrameTransLogRecord trans = (FrameTransLogRecord)record;
		sb.append("-- 画面データ遷移 ").append(trans.getSize()).append(" 数 処理");
	}
	// Throwable付きの場合にはSimpleFomatterそのままのメッセージ出力
	else if(record.getThrown() != null){
		sb.append(super.format(record));
	}
	else{
		String message = formatMessage(record);
		sb.append(message);
		sb.append("\n");			
	}
	return sb.toString();
}
}

作成した Formatter は RunClient実行時のクラスパスに設定し、ConfigのFormatterクラスに クラス名を指定します。