サーバアプリケーションで高信頼性ログを出力するための開発方法を以下に示します。
ポイント
非同期アプリケーション連携実行基盤の業務処理開始アプリケーション、および同期アプリケーション連携実行基盤のクライアントアプリケーションの中でログを出力する場合は、フレームワークのApcoordinatorのアプリケーションとしてアプリケーションを作成する必要があります。
作成方法およびログ出力先の定義方法については、“フレームワークオンラインマニュアル”を参照してください。
■管理名の設定
サーバアプリケーション内で使用する高信頼性ログの管理名を設定します。
ログを出力するサーバアプリケーションに任意の管理名を設定し、ログ出力を行うように作成してください。
アプリケーションが複数あり、それぞれのアプリケーションで定義を分ける場合は、異なる管理名を割り当ててください。
ひとつのアプリケーションの中で用途に応じて複数のログ定義を分ける場合は、ひとつのアプリケーションの中に複数の管理名を設定してください。
また、すべてのアプリケーションで共通定義でのログ運用を行う場合は、すべてのアプリケーションで共通の管理名を設定してください。
■Java APIを利用して任意の文字列を出力する
サーバアプリケーションをアプリケーション連携実行基盤固有機能利用クラス(FrameworkApplication)を継承して作成します。
作成したサーバアプリケーション内で、高信頼性ログを出力する手順は以下のとおりです。
getApplicationContextメソッドにより、アプリケーション連携実行基盤コンテキストクラス(ApplicationContext)のオブジェクトを取得します。
取得したアプリケーション連携実行基盤コンテキストクラスの高信頼性ログ出力クラス取得メソッド(getULogComposer)を発行し、高信頼性ログ出力クラスのオブジェクト(ULogComposer)を取得します。
この際、ログ定義ファイルに定義した管理名をメソッドのパラメタとして渡します。
取得した高信頼性ログ出力クラスオブジェクト(ULogComposer)のメソッドを利用してログを出力します。
ポイント
ULogComposerを使用してログ書込みを行った場合、printlnメソッドで指定したログ(ユーザログレコード)以外に、トランザクション情報レコードが書き込まれます。トランザクション情報レコードは、そのトランザクションでユーザログレコードの出力を行ったあとに、トランザクションが完了した場合に出力されます。
トランザクションは、コミットまたはロールバックといった完了操作が行われた場合、または、コネクションが切断された場合に完了します。トランザクションの完了操作により、業務データベースの操作をトランザクション情報レコードに記録することが可能です。業務データベースと同じコネクションを用いた場合は、業務データベースのトランザクションに連動した情報が出力できます。
なお、トランザクションの完了をせずにコネクションが切断された場合には暗黙のロールバックが発行されたものと見なしロールバック完了のトランザクション情報レコードが出力されます。
トランザクション情報レコードの構造やその具体的な利用方法については、“Interstage Business Application Server 運用ガイド(高信頼性ログ編)”の“ユーザログテーブルの運用”を参照してください。
ユーザログレコードは以下のどれかのタイミングで確定されます。
ULogComposerオブジェクトのsyncメソッドまたはcloseメソッドが呼び出されたとき。
ULogComposerオブジェクトの取得に使用したConnectionオブジェクトのcommitメソッド、rollbackメソッドまたはcloseメソッドが呼び出されたとき。
トランザクションが完了しないでコネクションが切断されたとき。
getULogComposer(高信頼性ログ出力クラス取得メソッド)およびgetApplicationContext(ApplicationContextオブジェクト取得メソッド)については、“Interstage Business Application Server リファレンス”を参照してください。
以下に、高信頼性ログを出力する場合のログ定義ファイルとサーバアプリケーションの記述例を示します。
《ログ定義ファイルの記述例》
<?xml version="1.0" encoding="UTF-8"?> <logConfig> <config> <version>7.1</version> </config> <ulog name="ULog1" class="my.sample.MyULogComposer"> <param name="schema" value="MYSCHEMA"/> <!-- スキーマ名 --> <param name="table" value="ULOG01"/> <!-- 表名 --> </ulog> </logConfig> |
《サーバアプリケーションの記述例》
import java.sql.Connection; import com.fujitsu.interstage.apfw.application.ApplicationContext; import com.fujitsu.interstage.apfw.application.FrameworkApplication; import com.fujitsu.uji.ulog.ULogComposer; /** * サンプルクラス */ public class MyApp extends FrameworkApplication { /** * サンプルメソッド */ public void method1() { // JNDI環境の設定 Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory"); env.put(Context.PROVIDER_URL, "SYM:// ・・・ "); InitialContext ctx = null; DataSource ds = null; Connection connection = null; try { ctx = new InitialContext(env); ds = (DataSource)ctx.lookup("jdbc/ ・・・ "); connection = ds.getConnection(); // アプリケーション連携実行基盤コンテキストクラスから // 高信頼性ログ出力クラスを取得します ApplicationContext context = getApplicationContext(); ULogComposer myLogger = context.getULogComposer("ULog1", connection); if(myLogger != null){ // 指定のコネクションを利用してデータベースへ出力します myLogger.println(null, null, "someMethod start"); } else{ // 高信頼性ログ出力クラスのオブジェクトがnullのため、 // ログの出力ができません ・・・ } // 高信頼性ログの出力を終了する場合に、クローズをします myLogger.close(); // コネクションをクローズします。 connection.close() } catch(Exception exp) { // 例外の処理を行います。 ・・・ } } } |
注意
高信頼性ログを利用する場合、データベースリソースの取得はSymfowareのJDBCネーミングサービスを使用してください。
データベースリソースの登録はsymjddefdsコマンドまたはデータベースリソース登録ツールを使用します。詳細は“Interstage Business Application Server セットアップガイド”の“SymfowareのJDBC環境の設定”を参照してください。
データベースリソースの取得はJNDI環境を指定したInitialContextから行います。JNDI APIを使用して下記の形式で指定します。
Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY,<factory_class_name>); env.put(Context.PROVIDER_URL,<provider_url>); InitialContext ctx = new InitialContext(env); |
<factory_class_name>
サービスプロバイダのクラス名にcom.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactoryを指定します。省略することはできません。
<provider_url>
サービスプロバイダがネーミングサービスにアクセスするためのURLを指定します。省略することはできません。
記述形式は以下のとおりです。
SYM://<host>[:<port_no>]
<host>
ネーミングサービスが動作しているサーバのホスト名またはIPアドレスを指定します。省略することはできません。
<port_no>
ネーミングサービスに接続する際のポート番号を指定します。
省略した場合、10326になります。
C言語またはCOBOLサーバアプリケーションから、任意の文字列を出力する
作成したサーバアプリケーション内で、高信頼性ログを出力する手順は以下のとおりです。
apfw_log_uopen関数により、高信頼性ログの環境を開設します。
取得したハンドルを利用して、apfw_log_uprintText関数により高信頼性ログを出力します。
apfw_log_uclose関数により、高信頼性ログの環境を閉鎖します。
注意
データベースアクセス管理機能と同じコネクションを利用する場合は、アプリケーションでコネクションやトランザクションに関する操作を行わないでください。アプリケーションで、コネクションの操作やトランザクションの操作を行った場合の動作については、保証できません。
ポイント
C言語 APIを呼び出す前に、あらかじめデータベースと接続する必要があります。データベースとの接続は、SQL文で実行します。
また、呼び出し後に、コミット、およびデータベースとの切断をする必要があります。コミット、およびデータベースとの切断は、SQL文で実行します。
なお、トランザクション情報レコードの構造やその具体的な利用方法については、“Interstage Business Application Server 運用ガイド(高信頼性ログ編)”の“ユーザログテーブルの運用”を参照してください。
使用するアプリケーションがCOBOLの場合、C言語APIは小文字で作成しているため、プログラムの先頭に“@OPTIONS ALPHAL(WORD)”を記述してください。
apfw_log_uopen(高信頼性ログの環境を開設)、apfw_log_uprintText(高信頼性ログ出力)、およびapfw_log_uclose(高信頼性ログの環境を閉鎖)については、“Interstage Business Application Server リファレンス”を参照してください。
以下に、高信頼性ログを出力する場合の、ログ定義ファイルとサーバアプリケーションの記述例を示します。
《ログ定義ファイルの記述例》
<?xml version="1.0" encoding="UTF-8"?> <logConfig> <config> <version>7.1</version> </config> <ulog name="ULog1"> <param name="schema" value="MYSCHEMA"/> <!-- スキーマ名 --> <param name="table" value="ULOG01"/> <!-- 表名 --> </ulog> </logConfig> |
《C言語サーバアプリケーションの記述例》
#include <stdio.h> #include <string.h> #include "apfwlog.h" #include "sqlrdbei.h" /** * 関数 **/ void method1() { EXEC SQL BEGIN DECLARE SECTION; char SQLSTATE[6]; char SQLMSG[256]; VARCHAR server_name[32]; /* サーバ名を格納 */ VARCHAR user_name[32]; /* ユーザIDを格納 */ VARCHAR db_name[32]; /* データベース名を格納 */ EXEC SQL END DECLARE SECTION; APFW_LOG_HANDLE handle = -1; char printText[32] = "TEST_MESSAGE"; /* 出力するログを格納 */ char c_serverName[32] = "TEST_SERVER"; /* サーバ名を格納 */ char c_userName[32] = "USER/PASSWORD"; /* ユーザID/パスワードを格納 */ char c_dbName[32] = "TEST_DB"; /* データベース名を格納 */ int result; /* サーバ名を設定します。 */ strcpy(server_name.sqlvar,c_serverName); server_name.sqllen = strlen(c_serverName); /* ユーザID/パスワードを設定します。 */ strcpy(user_name.sqlvar,c_userName); user_name.sqllen = strlen(c_userName); /* データベース名を設定します。 */ strcpy(db_name.sqlvar,c_dbName); db_name.sqllen = strlen(c_dbName); /* データベースと接続します。 */ EXEC SQL CONNECT TO :server_name AS :db_name USER :user_name; if(strcmp(SQLSTATE,"00000")!=0){ /* 接続失敗 */ return; } /* 高信頼性ログの環境を開設 */ handle = apfw_log_uopen("ULog1",SQL_U_CURRENT_CON); if(handle<0){ /* 環境の開設に失敗 */ EXEC SQL DISCONNECT CURRENT; return; } /* データベースへ出力 */ result = apfw_log_uprintText(handle,NULL,NULL,printText); if(result!=APFWLOGNORMAL){ /* 出力失敗 */ } /* 高信頼性ログの環境の閉鎖 */ result = apfw_log_uclose(handle); if(result!=APFWLOGNORMAL){ /* 環境の閉鎖に失敗 */ } /* コミット処理 */ EXEC SQL COMMIT WORK; /* データベースと切断します。 */ EXEC SQL DISCONNECT CURRENT; return; } |
《COBOLサーバアプリケーションの記述例》
64ビットOSの場合
000001 @OPTIONS ALPHAL(WORD) 000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. "METHOD1". 000030 DATA DIVISION. 000040 WORKING-STORAGE SECTION. 000050 01 COMPOSERNAME PIC X(20). 000060 01 HANDLE PIC S9(18) COMP-5. 000070 01 CONNECTNAME PIC X(20). 000080 01 RET PIC S9(9) COMP-5. 000090 01 TEXT_MSG PIC X(32). 000100 01 TEXT_VALUE PIC S9(9) COMP-5. 000110 EXEC SQL BEGIN DECLARE SECTION END-EXEC. 000120 01 SQLSTATE PIC X(5). 000130 01 SQLMSG PIC X(128). 000140 EXEC SQL END DECLARE SECTION END-EXEC. 000150 LINKAGE SECTION. 000160 COPY APFW_EXCEPTION. 000170 01 RTN PIC S9(9) COMP-5. 000180 PROCEDURE DIVISION USING RTN 000190 APFW_EXCEPTION. 000200 000210*===================================================== 000220* データベースに接続します 000230*===================================================== 000240 EXEC SQL CONNECT TO 'TEST_SERVER' AS 'TEST_DB' USER ' USER/PASSWORD' END-EXEC. 000250 IF SQLSTATE NOT = "00000" THEN 000260 DISPLAY "CONNETCT NG" 000270 DISPLAY SQLSTATE 000280 DISPLAY SQLMSG 000290 END-IF. 000300 000310*===================================================== 000320* 高信頼性ログの環境を開設します 000330*===================================================== 000340 MOVE "ULog01" & X"00" TO COMPOSERNAME. 000350 MOVE "TEST_DB" & X"00" TO CONNECTNAME. 000360 CALL "apfw_log_uopen" USING BY REFERENCE COMPOSERNAME 000370 BY REFERENCE CONNECTNAME 000380 RETURNING HANDLE. 000390 IF HANDLE < 0 000400 DISPLAY "apfw_log_uopen error" 000410 END-IF. 000420 000430*===================================================== 000440* データベースへ出力します 000450*===================================================== 000460 MOVE "TEST_MESSAGE" & X"00" TO TEXT_MSG. 000470 MOVE 0 TO TEXT_VALUE. 000480 CALL "apfw_log_uprintText" USING BY VALUE HANDLE 000490 BY VALUE TEXT_VALUE 000500 BY VALUE TEXT_VALUE 000510 BY REFERENCE TEXT_MSG 000520 RETURNING RET. 000530 IF RET NOT = 0 000540 DISPLAY "apfw_log_printText error" 000550 END-IF. 000560 000570*==================================================== 000580* 高信頼性ログの環境を閉鎖します 000590*==================================================== 000600 CALL "apfw_log_uclose" USING BY VALUE HANDLE 000610 RETURNING RET. 000620 IF RET NOT = 0 000630 DISPLAY "apfw_log_uclose error" 000640 END-IF. 000650 000660*===================================================== 000670* コミットします 000680*===================================================== 000690 EXEC SQL COMMIT WORK END-EXEC. 000700 000710*===================================================== 000720* データベースとの接続を切断します 000730*===================================================== 000740 EXEC SQL DISCONNECT CURRENT END-EXEC. 000750 000760 END PROGRAM "METHOD1". |