サーバアプリケーションで汎用ログを出力するための開発方法を以下に示します。
ポイント
非同期アプリケーション連携実行基盤の業務処理開始アプリケーション、および同期アプリケーション連携実行基盤のクライアントアプリケーションの中でログを出力する場合は、フレームワークのApcoordinatorのアプリケーションとしてアプリケーションを作成する必要があります。
作成方法およびログの定義方法については、“フレームワークオンラインマニュアル”を参照してください。
■管理名の設定
サーバアプリケーション内で使用する汎用ログの管理名を設定します。
ログを出力するサーバアプリケーションに任意の管理名を設定し、ログ出力を行うように作成してください。
アプリケーションが複数あり、それぞれのアプリケーションで定義を分ける場合は、異なる管理名を割り当ててください。
ひとつのアプリケーションの中で用途に応じて複数のログ定義を分ける場合は、ひとつのアプリケーションの中に複数の管理名を設定してください。
また、すべてのアプリケーションで共通定義でのログ運用を行う場合は、すべてのアプリケーションで共通の管理名を設定してください。
■Java APIを利用して任意の文字列を出力する
サーバアプリケーションをアプリケーション連携実行基盤固有機能利用クラス(FrameworkApplication)を継承して作成します。
作成したサーバアプリケーション内で、ログを出力する手順は以下のとおりです。
getApplicationContextメソッドにより、アプリケーション連携実行基盤コンテキストクラス(ApplicationContext)のオブジェクトを取得します。
取得したアプリケーション連携実行基盤コンテキストクラスの汎用ログ出力クラス取得メソッド(getLogComposer)を発行し、汎用ログ出力クラス(LogComposer)のオブジェクトを取得します。
この際、ログ定義ファイルに定義した管理名をメソッドのパラメタとして渡します。
取得した汎用ログ出力クラスオブジェクト(LogComposer)の各メソッドを利用して汎用ログを出力します。
汎用ログ機能では、LogComposerクラスのほかにも、フォーマット付きメッセージログ用のクラスExtMessageComposerのほかに、性能ログ用のクラスExtTimeComposerや通信ログ用のクラスExtDataComposerが利用可能です。
それぞれのクラス、定義およびフォーマットの詳細については、“Interstage Business Application Server リファレンス”を参照してください。
以下に、サーバアプリケーションで汎用ログを出力する例を示します。
◆LogComposerクラスを用いて、ログ出力を行う場合
標準的なログを出力する場合にLogComposerクラスを用いてログの出力を行います。
以下に、LogComposerクラスを用いてログ出力を行う場合のログ定義ファイルとサーバアプリケーションの記述例を示します。
《ログ定義ファイルの記述例》
<?xml version="1.0" encoding="UTF-8" ?> <logConfig> <config> <version>7.1</version> </config> <logComposer name="Log1"> <output name="myStdOut" type="stdout"/> </logComposer> </logConfig> |
《サーバアプリケーションの記述例》
import com.fujitsu.interstage.apfw.application.ApplicationContext; import com.fujitsu.interstage.apfw.application.FrameworkApplication; import com.fujitsu.uji.log.LogComposer; /** * サンプルクラス */ public class MyApp extends FrameworkApplication { /** * サンプルメソッド */ public void method1() { // アプリケーション連携実行基盤コンテキストクラスから // ログ出力クラスを取得します ApplicationContext context = getApplicationContext(); LogComposer myLogger = context.getLogComposer("Log1"); if(myLogger != null){ // ログを出力します myLogger.println("someMethod start"); } else{ // ログ出力クラスのオブジェクトがnullのため、ログの出力ができません ・・・ } } } |
◆ExtMessageComposerクラスを用いて、ログ出力を行う場合
ログメッセージファイルで定義したメッセージを出力する場合に利用します。
以下に、ExtMessageComposerクラスを用いてログ出力を行う場合のログ定義ファイル、ログメッセージファイルとサーバアプリケーションの記述例を示します。
《ログ定義ファイルの記述例》
<?xml version="1.0" encoding="UTF-8" ?> <logConfig> <config> <version>7.1</version> </config> <logComposer name="Log1" class="com.fujitsu.uji.log.ext.ExtMessageComposer"> <output name="myStdOut" type="stdout"/> </logComposer> </logConfig> |
《ログメッセージファイルの記述例》
<?xml version="1.0" encoding="UTF-8" ?> <ujiResource> <config> <version>5.1</version> </config> <map id="1000"> <elem key="label.code">sys</elem> <elem key="label.name">mainsystem</elem> <elem key="label.subname">compo1</elem> <elem key="errorType">INFO</elem> <elem key="level">10</elem> <elem key="message">someMethod start</elem> </map> <map id="1001"> <elem key="label.code">sys</elem> <elem key="label.name">mainsystem</elem> <elem key="label.subname">compo1</elem> <elem key="errorType">INFO</elem> <elem key="level">10</elem> <elem key="message">someMethod end: status={0}</elem> </map> </ujiResource> |
《サーバアプリケーションの記述例》
import com.fujitsu.interstage.apfw.application.ApplicationContext; import com.fujitsu.interstage.apfw.application.FrameworkApplication; import com.fujitsu.uji.log.ext.ExtMessageComposer; /** * サンプルクラス */ public class MyApp extends FrameworkApplication { /** * サンプルメソッド */ public void method1() { // アプリケーション連携実行基盤コンテキストクラスから // ログ出力クラスを取得します ApplicationContext context = getApplicationContext(); ExtMessageComposer myLogger = (ExtMessageComposer)context.getLogComposer("Log1"); if(myLogger != null){ // ログを出力します myLogger.printMessage("1000"); ・・・ myLogger.printMessage("1001", new String{"OK"}); } else{ // ログ出力クラスのオブジェクトがnullのため、ログの出力ができません ・・・ } } } |
◆ExtDataComposerクラスを用いて、ログ出力を行う場合
アプリケーションで利用する情報(Java Bean)のプロパティをダンプ出力する場合に利用します。
以下に、ExtDataComposerクラスを用いてログ出力を行う場合のログ定義ファイルとサーバアプリケーションの記述例を示します。
《ログ定義ファイルの記述例》
<?xml version="1.0" encoding="UTF-8" ?> <logConfig> <config> <version>7.1</version> </config> <logComposer name="Log1" class="com.fujitsu.uji.log.ext.ExtDataComposer"> <output name="myStdOut" type="stdout"/> </logComposer> </logConfig> |
《サーバアプリケーションの記述例》
import java.util.HashMap; import com.fujitsu.interstage.apfw.application.ApplicationContext; import com.fujitsu.interstage.apfw.application.FrameworkApplication; import com.fujitsu.uji.log.ext.ExtDataComposer; /** * サンプルクラス */ public class MyApp extends FrameworkApplication { /** * サンプルメソッド */ public void method1() { // ExtDataComposerクラスに渡すデータを生成 HashMap map = new HashMap(); ・・・ // アプリケーション連携実行基盤コンテキストクラスから // ログ出力クラスを取得します ApplicationContext context = getApplicationContext(); ExtDataComposer myLogger = (ExtDataComposer)context.getLogComposer("Log1"); if(myLogger != null){ // ログを出力します myLogger.printData(5, "code", "name", "subname", "messageID", map); } else{ // ログ出力クラスのオブジェクトがnullのため、ログの出力ができません ・・・ } } } |
◆ExtTimeComposerクラスを用いて、ログ出力を行う場合
アプリケーションの処理時間を計測する場合に利用します。
以下に、ExtTimeComposerクラスを用いてログ出力を行う場合のログ定義ファイルとサーバアプリケーションの記述例を示します。
《ログ定義ファイルの記述例》
<?xml version="1.0" encoding="UTF-8" ?> <logConfig> <config> <version>7.1</version> </config> <logComposer name="Log1" class="com.fujitsu.uji.log.ext.ExtTimeComposer"> <output name="myStdOut" type="stdout"/> </logComposer> </logConfig> |
《サーバアプリケーションの記述例》
import com.fujitsu.interstage.apfw.application.ApplicationContext; import com.fujitsu.interstage.apfw.application.FrameworkApplication; import com.fujitsu.uji.log.ext.ExtTimeComposer; /** * サンプルクラス */ public class MyApp extends FrameworkApplication { /** * サンプルメソッド */ public void method1() { // ExtTimeComposerクラスに渡すデータを生成 long currentTime ; ・・・ // アプリケーション連携実行基盤コンテキストクラスから // ログ出力クラスを取得します ApplicationContext context = getApplicationContext(); ExtTimeComposer myLogger = (ExtTimeComposer)context.getLogComposer("Log1"); if(myLogger != null){ // 開始時刻を取得します currentTime = myLogger.start(); // 時間を計測する処理を記述します ・・・ // ログを出力します myLogger.printTime(currentTime, 5, "code", "name", "subname", "messageID"); } else{ // ログ出力クラスのオブジェクトがnullのため、ログの出力ができません ・・・ } } } |
■C言語またはCOBOLサーバアプリケーションから、任意の文字列を出力する
作成したサーバアプリケーション内で、ログを出力する手順は以下のとおりです。
apfw_log_open関数により、ログ環境を開設します。
取得したハンドルを利用して、各関数により汎用ログを出力します。
apfw_log_close関数により、ログ環境を閉鎖します。
注意
C言語APIは小文字で作成されているため、使用するアプリケーションがCOBOLの場合には、プログラムの先頭に“@OPTIONS ALPHAL(WORD)”を記述してください。
apfw_log_print関数の代わりにDISPLAY文を利用して、ログを出力することができます。DISPLAY文を利用する場合は、apfw_log_open関数、およびapfw_log_close関数の呼出し操作も不要になります。
DISPLAY文についての詳細は、“NetCOBOL ユーザーズガイド”または“NetCOBOL 使用手引書”を参照してください。
apfw_log_open関数で指定するログ管理名、およびDISLPAY文を利用してログを出力する場合に指定する管理名に、以下に示す標準ログの管理名を使用しないでください。
system
systemClient
performance
performanceClient
以下に、サーバアプリケーションで汎用ログを出力する例を示します。
◆apfw_log_print関数を用いて、ログ出力を行う場合
《ログ定義ファイルの記述例》
<?xml version="1.0" encoding="UTF-8" ?>
<logConfig>
<config>
<version>7.1</version>
</config>
<logComposer name="Log3">
<output name="file01" type="multi">
<param name="target" value="/opt/FJSVibs/conf/logserviceConf.xml"(注)/>
</output>
</logComposer>
</logConfig> |
注)Solaris、Linuxの場合のログ出力サービス定義ファイルの格納パスになります。
Windowsの格納パスは、“[Interstageのインストールディレクトリ]\BAS\etc\conf\logserviceConf.xml”になります。
《C言語サーバアプリケーションの記述例》
#include <stdio.h> #include <string.h> #include "apfwlog.h" /** * 関数 **/ void method1() { APFW_LOG_HANDLE handle = -1; char printText[32] = "TEST_MESSAGE"; /* 出力するログを格納 */ int result; /* ログの環境を開設 */ handle = apfw_log_open("Log3"); if(handle<0){ /* 環境の開設に失敗 */ return; } /* ログ出力 */ apfw_log_print(handle,1,printText); /* ログの環境の閉鎖 */ result = apfw_log_close(handle); if(result!=APFWLOGNORMAL){ /* 環境の閉鎖に失敗 */ } return; } |
《COBOLサーバアプリケーションの記述例》
64ビットOSの場合
000001 @OPTIONS ALPHAL(WORD) 000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. "METHOD1". 000030 DATA DIVISION. 000040 WORKING-STORAGE SECTION. 000050 01 HANDLE PIC S9(18) COMP-5. 000060 01 COBMSG PIC X(20). 000070 01 LEVEL PIC S9(9) COMP-5. 000080 LINKAGE SECTION. 000090 COPY APFW_EXCEPTION. 000100 01 RTN PIC S9(9) COMP-5. 000110 PROCEDURE DIVISION USING RTN 000120 APFW_EXCEPTION. 000130 MOVE "TEST_MESSAGE" & X"00" TO COBMSG. 000140 MOVE 1 TO LEVEL. 000150 000160 CALL "apfw_log_open" USING BY REFERENCE COMPOSERNAME 000170 RETURNING HANDLE. 000180 000190 CALL "apfw_log_print" USING BY VALUE HANDLE 000200 BY VALUE LEVEL 000210 BY REFERENCE COBMSG. 000220 000230 CALL "apfw_log_close" USING BY VALUE HANDLE 000240 RETURNING RTN. 000250 000260 END PROGRAM "METHOD1". |
◆apfw_log_printMessage関数、およびapfw_log_printMessages関数を用いて、ログ出力を行う場合
《ログ定義ファイルの記述例》
<?xml version="1.0" encoding="UTF-8" ?>
<logConfig>
<config>
<version>7.1</version>
</config>
<logComposer name="Log3" class="ExtMessageComposer">
<output name="file01" type="multi">
<param name="target" value="/opt/FJSVibs/conf/logserviceConf.xml"(注)/>
</output>
</logComposer>
</logConfig> |
注)Solaris、Linuxの場合のログ出力サービス定義ファイルの格納パスになります。
Windowsの格納パスは、“[Interstageのインストールディレクトリ]\BAS\etc\conf\logserviceConf.xml”になります。
《ログメッセージファイルの記述例》
<?xml version="1.0" encoding="UTF-8" ?> <ujiResource> <config> <version>5.1</version> </config> <map id="1000"> <elem key="label.code">sys</elem> <elem key="label.name">mainsystem</elem> <elem key="label.subname">compo1</elem> <elem key="errorType">INFO</elem> <elem key="level">10</elem> <elem key="message">someMethod start</elem> </map> <map id="1001"> <elem key="label.code">sys</elem> <elem key="label.name">mainsystem</elem> <elem key="label.subname">compo1</elem> <elem key="errorType">INFO</elem> <elem key="level">10</elem> <elem key="message">someMethod end: status={0}</elem> </map> </ujiResource> |
《C言語サーバアプリケーションの記述例》
#include <stdio.h> #include <string.h> #include "apfwlog.h" /** * 関数 **/ void method1() { APFW_LOG_HANDLE handle = -1; APFW_LOG_ARRAY aArgument; APFW_LOG_DATA *logdata; char printText[32] = "TEST_MESSAGE"; /* 出力するログを格納 */ int result; /* ログの環境を開設 */ handle = apfw_log_open("Log3"); if(handle<0){ /* 環境の開設に失敗 */ return; } /* ログ出力 */ apfw_log_printMessage(handle,"1000"); logdata=(APFW_LOG_DATA*)malloc(sizeof(APFW_LOG_DATA)); memset(logdata,0x00,sizeof(APFW_LOG_DATA)); logdata[0].data="OK"; memset(&aArgument,0x00,sizeof(APFW_LOG_ARRAY)); arguments.tMclog_data = logdata; arguments.data_num = 1; /* ログ出力 */ apfw_log_printMessages(handle,"1001",&aArgument); /* ログの環境の閉鎖 */ result = apfw_log_close(handle); if(result!=APFWLOGNORMAL){ /* 環境の閉鎖に失敗 */ } return; } |
《COBOLサーバアプリケーションの記述例》
64ビットOSの場合
000001 @OPTIONS ALPHAL(WORD) 000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. "METHOD1". 000030 DATA DIVISION. 000040 WORKING-STORAGE SECTION. 000050 01 HANDLE PIC S9(18) COMP-5. 000060 01 MSGID PIC X(20). 000070 01 ARGUMENTS. 000080 02 DATA_NUM PIC S9(9) COMP-5. 000090 02 FILLER PIC S9(9) COMP-5. 000100 02 ARRAY_DATA USAGE POINTER. 000110 01 MAINLOGDATA. 000120 02 LOG_DATA OCCURS 1. 000130 03 ADATA USAGE POINTER. 000140 01 STRDATA1 PIC X(20). 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 MOVE "Log3" & X"00" TO COMPOSERNAME. 000220 CALL "apfw_log_open" USING BY REFERENCE COMPOSERNAME 000230 RETURNING HANDLE. 000240 000250 MOVE "1000" & X"00" TO MSGID. 000260 CALL "apfw_log_printMessage" USING BY VALUE HANDLE 000270 BY REFERENCE MSGID. 000280 000290 MOVE "1001" & X"00" TO MSGID. 000300 MOVE 1 TO DATA_NUM OF ARGUMENTS. 000310 MODE "OK" & X"00" TO STRDATA1. 000320 MOVE FUNCTION ADDR( STRDATA1 ) TO ADATA OF LOG_DATA(1). 000330 MOVE FUNCTION ADDR( MAINLOGDATA ) TO ARRAY_DATA OF ARGUMENTS. 000340 CALL "apfw_log_printMessages" USING BY VALUE HANDLE 000350 BY REFERENCE MSGID 000360 BY REFERENCE ARGUMENTS. 000370 000380 CALL "apfw_log_close" USING BY VALUE HANDLE 000390 RETURNING RTN. 000400 END PROGRAM "METHOD1". |
◆apfw_log_startTime関数、apfw_log_printTime関数、およびapfw_log_printTimeRef関数を用いて、ログ出力を行う場合
アプリケーションの処理時間を計測する場合に利用します。計測の開始時間を取得するには、apfw_log_startTime関数を利用します。ログを出力するには、サーバアプリケーションの開発言語に応じて、以下の関数を利用します。
C言語サーバアプリケーションの場合
apfw_log_printTime関数
COBOLサーバアプリケーションの場合
64ビットOSの場合
apfw_log_printTime関数
《ログ定義ファイルの記述例》
<?xml version="1.0" encoding="UTF-8" ?> <logConfig> <config> <version>7.1</version> </config> <logComposer name="Log3" class="ExtTimeComposer"> <output name="file01" type="multi"> <param name="target" value="/opt/FJSVibs/conf/logserviceConf.xml"/> </output> </logComposer> </logConfig> |
注)Solaris、Linuxの場合のログ出力サービス定義ファイルの格納パスになります。
Windowsの格納パスは、“[Interstageのインストールディレクトリ]\BAS\etc\conf\logserviceConf.xml”になります。
《C言語サーバアプリケーションの記述例》
#include <stdio.h> #include <string.h> #include "apfwlog.h" /** * 関数 **/ void method1() { APFW_LOG_HANDLE handle = -1; char printText[32] = "TEST_MESSAGE"; /* 出力するログを格納 */ long long stime; int result; stime = apfw_log_startTime() /* ログの環境を開設 */ handle = apfw_log_open("Log3"); if(handle<0){ /* 環境の開設に失敗 */ return; } /* ログ出力 */ apfw_log_printTime(handle,stime,1, "lcode","lname","lsnmae","1002"); /* ログの環境の閉鎖 */ result = apfw_log_close(handle); if(result!=APFWLOGNORMAL){ /* 環境の閉鎖に失敗 */ } return; } |
《COBOLサーバアプリケーションの記述例》
64ビットOSの場合
000001 @OPTIONS ALPHAL(WORD) 000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. "METHOD1". 000030 DATA DIVISION. 000040 WORKING-STORAGE SECTION. 000050 01 HANDLE PIC S9(18) COMP-5. 000060 01 COBMSG PIC X(20). 000070 01 LEVEL PIC S9(9) COMP-5. 000080 01 STIME PIC 9(18) COMP-5. 000090 01 LCODE PIC X(20). 000100 01 LNAME PIC X(20). 000110 01 LSUBNAME PIC X(20). 000120 01 MSGID PIC X(20). 000130 LINKAGE SECTION. 000140 COPY APFW_EXCEPTION. 000150 01 RTN PIC S9(9) COMP-5. 000160 PROCEDURE DIVISION USING RTN 000170 APFW_EXCEPTION. 000180 MOVE "TEST_MESSAGE" & X"00" TO COBMSG. 000190 MOVE 1 TO LEVEL. 000200 MOVE "lcode" & X"00" TO LCODE. 000210 MOVE "lname" & X"00" TO LNAME. 000220 MOVE "lsname" & X"00" TO LSUBNAME. 000230 MOVE "1002" & X"00" TO MSGID. 000240 000250 CALL "apfw_log_startTime" RETURNING STIME. 000260 CALL "apfw_log_open" USING BY REFERENCE COMPOSERNAME 000270 RETURNING HANDLE. 000280 000290 CALL "apfw_log_printTime" USING BY VALUE HANDLE 000300 BY VALUE STIME 000310 BY VALUE LEVEL 000320 BY REFERENCE LCODE 000330 BY REFERENCE LNAME 000340 BY REFERENCE LSUBNAME 000350 BY REFERENCE MSGID. 000360 000370 CALL "apfw_log_close" USING BY VALUE HANDLE 000380 RETURNING RTN. 000390 END PROGRAM "METHOD1". |