Javaクライアントでは、ログの出力機能としてjava.util.logginパッケージを使用しています。
時間計測や、ビジネスルール実行結果ログなどを標準的に出力し、GUI画面、標準出力、ファイル出力を行う機能があります。
また、任意のFormatterクラスが指定できますので、独自フォーマットのログ出力も可能です。
補足Ver1.1.0より新規機能追加
設定は、Config(RunClient.wdg)にて行います。
340行付近の ログHandlerの設定 にて、<handlers> のタグにて囲まれている部分が対象の設定です。
<handlers><run> のタグに囲まれている部分が、実行モード=run の場合に参照される設定になり、
<handlers><test> のタグに囲まれている部分が、実行モード=test の場合に参照される設定になります。
これらのノード以下に設定されている、<handler> ノードがログ出力先を指定しているノードになります。
ログ出力先は以下から選択可能です。
- デスクトップ のトレースログ
jp.ne.mki.wedge.run.client.control.log.MemoryStringHandler
設定可能な子ノードは、以下になります。
- <formatter>
4.Formatterクラスの種類 を参考にしてください。
- <level>
3. 出力レベルの指定方法 を参考にしてください。
Formatterの設定、レベルの設定時にSecurityエラーが発生しないように作成されていますので、Applet,JWSでもSecurity設定無しで動作可能です。
- 標準出力
jp.ne.mki.wedge.run.client.control.log.ConsoleHandlerNoSecurityCheck
設定可能な子ノードは、以下になります。
- <formatter>
4.Formatterクラスの種類 を参考にしてください。
- <level>
3. 出力レベルの指定方法 を参考にしてください。
java.util.logging.ConsoleHandler と同等の機能になりますが、Formatterの設定、レベルの設定時にSecurityエラーが発生しないようにラッピングされていますので、Applet,JWSでもSecurity設定無しで動作可能です。
- ファイル出力
java.util.logging.FileHandler
設定可能な子ノードは、以下になります。
- <formatter>
4.Formatterクラスの種類 を参考にしてください。
- <encoding>
文字セットエンコーディングの名前
- <level>
3. 出力レベルの指定方法 を参考にしてください。
- <pattern>
ファイル名の指定
特殊文字が記述可能で "%t" システムの一時ディレクトリ 、"%h" user.home システムプロパティの値、
"%g" ログのローテーションを識別する生成番号 などが指定可能です。
詳しい仕様は java.util.logging.FileHandlerを参照して下さい。
- <limit>
ファイルに書き込むおよその最大量 (バイト数)
0を指定すると、無制限になります。
value属性に、最大量(数値)を指定して下さい。
- <count>
循環する出力ファイル数
limitが最大量に達したときに、循環する出力ファイル数になります。
value属性に、ファイル数(数値) を指定して下さい。
- <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>は出力レベルの設定になります。
これらの説明は以降のドキュメントを参照して下さい。
出力レベル(<level>のvalueの値)を設定することで出力するログを制限できます。
ログのレベルは以下の種類があり、SERVERE が重要度高い(致命的なエラー)で、FINESTが重要度低い(トレースログ) になります。
- SEVERE
致命的なエラー。実行エンジンからは設定することはありません
- WARNING
警告的なエラー。指定クラスが存在しない場合、ルールにてExceptionをキャッチしたときなどには ダイアログの表示とともに、WARNINGのログに出力します
- INFO
情報。実行エンジンからは起動時に実行Javaのバージョンなど
- CONFIG
情報。実行エンジンからは設定なし
- FINE
詳細情報。実行エンジンからは画面起動までの時間が出力されます。
- FINER
詳細情報。実行エンジンからは実行リスト単位での実行時間が出力されます。
- FINEST
詳細情報。実行エンジンからは ビジネスルールの単位での 詳細トレースが出力されます。
指定レベル以上のログが出力されるようになります。
例えば、ログレベルを、「FINER」にした場合、SEVERE ~ FINER までのログが出力されるようになります。
「FINER」だけのログを出力する・・・という事はできません。
標準で提供しているクラスは以下があります。
- jp.ne.mki.wedge.run.client.control.log.formatter.VfSimpleFormatter
最も単純なログを出力するFormatterです。
Ver1.0.3以前のフォーマット形式と同等の出力になります。
- jp.ne.mki.wedge.run.client.control.log.formatter.VfXmlFormatter
xml形式にてログを出力するFormatterです。
上記のFormatterでは JDK標準で付属している java.util.logging.SimpleFormatter などに比べてより多くの情報を出力
できるようになります。
Formatterクラスを作成し、Configに設定することにより、独自フォーマットにてログが出力可能になります。
Formatterクラスは、java.util.logging.Formatter を継承し実装していれば登録が可能です。
Formatterクラス作成の詳細情報はJDKドキュメントを参照して下さい。
フォーマットを行うメソッドは、
public String format(LogRecord record)
にて行いますが、このLogRecordが
VisualFrame用に拡張されたクラスが設定される場合があります。
以下のLogRecordの場合には拡張された情報を取得することによりより詳細なLogを出力することが可能です。
- ビジネスルール開始レコード
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()
ビジネスルール出力レコード取得
- ビジネスルール終了レコード
jp.ne.mki.wedge.run.client.control.log.EndRuleLogRecord
ビジネスルール終了時時にLoggingされるレコードになります。
取得情報拡張のため追加されたメソッドは以下になります。
- public String getResult()
結果戻り値の取得
- public long getTime()
ビジネスルール実行使用時間の取得
- public HashVector getInRecord()
ビジネスルール入力レコード取得
- public HashVector getOutRecord()
ビジネスルール出力レコード取得
- タイムログレコード
jp.ne.mki.wedge.run.client.control.log.TimeLogRecord
タイムをLoggingするレコードになります。
実行リスト単位の使用時間、画面表示の使用時間 のログに使用されています。
- public long getTime()
使用時間の取得
- public String getTargetName()
対象名称取得
- public String getEventName()
イベント名称取得
- 画面遷移時のデータ送受信のログレコード
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クラスに クラス名を指定します。