ValenceはIBMiと同じように一部処理について出口プログラム(ExitProgram)が設定できます。出口プログラムはログイン時やアプリケーション立ち上げ時など様々な場面で使用可能です。今回はユーザーがアプリケーションを起動した際に独自にログを取る方法を紹介いたします。
出口プログラムについて
出口プログラムを設定できる箇所は20250708.0verの段階で15か所存在します。

それぞれの出口プログラムのテンプレートはValenceのライブラリ「QRPGLESRC」に用意されおり、それぞれの出口プログラムが呼び出されるタイミングとテンプレートは以下のようになっております。
| 出口プログラム | 呼び出しタイミング | テンプレート |
| Session login authentication | ログイン認証されたとき | EXEXITPGML |
| セッションログイン | ユーザーが正常ログインしたとき | EXEXITPGM |
| セッションログイン -ユーザーテンプレート上書き | ユーザーが初めてvalenceにログインするとき | EXEXITPGMU |
| セッションログアウト | ユーザーがログアウトかタイムアウトしたとき | EXEXITPGM |
| パスワード変更 | パスワードが変更されたとき | EXEXITPGM |
| 環境変更 | 環境が変更されたとき | EXEXITPGM |
| ポーリング | ポーリングされたとき | EXEXITPGMP |
| 新規CGIジョブの初期化 | 新規CGIジョブが初回使用されるとき | EXEXITPGM |
| VVCALLでの、アプリケーション初期化 | アプリケーションが初めて起動されたとき | EXEXITPGM |
| VVCALLでの、前処理 | VVCALLからプログラムが呼出される直前 | EXEXITPGM |
| VVCALLでの、後処理 | プログラムの呼出し完了後 | EXEXITPGM |
| VVMAIL、前処理中 | メール送信の前に、VVMAILで呼び出されるとき | EXEXITPGMM |
| 各クリーンアップまたはRCLACTGRP | vvUtility_cleanUp が呼び出されたとき | EXEXITPGM |
| アプリバッジ制御プログラム | アプリケーションのアイコンのバッジを制御する | EXEXITBDG |
| Fusion5250デバイス名の上書き | 起動した5250セッションのデバイス名を動的に設定する | EXEXITPGMF |
アプリケーション起動時のログ取得方法
今回はアプリケーション起動時にログ取得するために、テンプレート【EXEXITPGM】を使用します。
出口プログラムは通常のRPGのテンプレートとは異なり、Valenceのシステムライブラリに配置する必要があります。
例えば、VALENCE6Tのインスタンスで使用するならばVALENCE6Tライブラリに出口プログラムを配置します。

また、SQLでログファイルに書き込むためにコンパイルの変更が必要となるため、テンプレート【EXEXITPGM】の拡張子を「RPGLE」から「SQLRPGLE」に変更します。テンプレートコピーの際に拡張子の変更をしてください。

ログ取得のRPGプログラムは下記にようになっております。
予め作成したログファイルに各アプリケーション起動ごとにSQLで書き込むようになっております。
今回は例として「SSID」、「ログイン名」、「現在時刻」、「アプリ名」、「ログインモード(desktop or mobile)」をログとして取得し、ログファイルはVALDOCLIB/S15641という物理ファイルを作成し利用します。
**--------------------------------------------
** d specs
**--------------------------------------------
d exitDS e ds extname(vvDSexit1)
d sessionDS e ds extname(vvsessdata) qualified
d dataPtr2 s *
d outputData s 65535a varying up to len(500000)
d length s 10i 0
d curCCSID s 5i 0
/include qcpylesrc,vvDspec
**--------------------------------------------
** program start
**--------------------------------------------
d *n pi
d IOexitDS like(exitDS)
d dataPtr * (See VVCALL1)
d nowTime s Z
d sid s 64a varying
d loginname s 20a varying
d loginID s 4a
d appID s 4a
d appName s 30a
d mode s 30a varying
/free
exitDS=IOexitDS;
// use vvSessDS (passed in IOexitDS) to retrieve info regarding the session
sessionDS=vvSessDS;
// if you want to execute something in conjunction with the initial launch of an app...
if vvExitMode='VVCALL_INIT';
//SSIDの取得
sid = %char(sessionDS.vvsessID);
//ログイン名の取得
loginname = sessionDS.vvLoginID;
//時刻の取得
nowTime = %timestamp();
//ログインモード(desktop or mobile)の取得
mode = sessionDS.VVMODE;
//AppIDの取得
appID=vvCallPgm;
//AppIDからApp名を取得
exec sql
select VVAPPNAME INTO :appName
From VVAPPS
WHERE VVAPPID = :appID;
//ログ用のファイルに書き込む
exec sql
INSERT INTO VALDOCLIB/S15641 (USRID,SESID,APPNM,LOGDT,MODE)
VALUES(:loginname,:sid,:appName,:nowTime,:mode);
endif;
*inlr=*on;
vvExitMode='VVCALL_INIT';
テンプレート【EXEXITPGM】はvvExitModeでどの出口プログラムかを指定します。「VVCALL_INIT」は「VVCALLでの、アプリケーション初期化」の出口プログラムを指定しています。
プログラム完成後、「ポータル管理-設定」から出口プログラムに設定します。
出口プログラムに設定後はValenceの再起動が必要であるため、再起動を行います。

再起動後に、アプリケーション起動すると指定ファイルにログが書き込まれるようになります。

おわりに
今回はアプリケーション起動時にログを取得する出口プログラムを作成いたしました。出口プログラムは通常のRPGのテンプレートと異なり、システムライブラリへの配置や設定後の再起動等の注意点がございます。注意点に気を付けながら是非出口プログラムをご活用ください。