ページの先頭行へ戻る
Interstage Business Application Server アプリケーション開発ガイド
FUJITSU Software

19.4.1 サーバアプリケーションでの利用

サーバアプリケーションで汎用ログを出力するための開発方法を以下に示します。

ポイント

非同期アプリケーション連携実行基盤の業務処理開始アプリケーション、および同期アプリケーション連携実行基盤のクライアントアプリケーションの中でログを出力する場合は、フレームワークのApcoordinatorのアプリケーションとしてアプリケーションを作成する必要があります。
作成方法およびログの定義方法については、“フレームワークオンラインマニュアル”を参照してください。

管理名の設定

サーバアプリケーション内で使用する汎用ログの管理名を設定します。

ログを出力するサーバアプリケーションに任意の管理名を設定し、ログ出力を行うように作成してください。

アプリケーションが複数あり、それぞれのアプリケーションで定義を分ける場合は、異なる管理名を割り当ててください。

ひとつのアプリケーションの中で用途に応じて複数のログ定義を分ける場合は、ひとつのアプリケーションの中に複数の管理名を設定してください。

また、すべてのアプリケーションで共通定義でのログ運用を行う場合は、すべてのアプリケーションで共通の管理名を設定してください。

Java APIを利用して任意の文字列を出力する

サーバアプリケーションをアプリケーション連携実行基盤固有機能利用クラス(FrameworkApplication)を継承して作成します。
作成したサーバアプリケーション内で、ログを出力する手順は以下のとおりです。

  1. getApplicationContextメソッドにより、アプリケーション連携実行基盤コンテキストクラス(ApplicationContext)のオブジェクトを取得します。

  2. 取得したアプリケーション連携実行基盤コンテキストクラスの汎用ログ出力クラス取得メソッド(getLogComposer)を発行し、汎用ログ出力クラス(LogComposer)のオブジェクトを取得します。
    この際、ログ定義ファイルに定義した管理名をメソッドのパラメタとして渡します。

  3. 取得した汎用ログ出力クラスオブジェクト(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サーバアプリケーションから任意の文字列を出力する

作成したサーバアプリケーション内で、ログを出力する手順は以下のとおりです。

  1. apfw_log_open関数により、ログ環境を開設します。

  2. 取得したハンドルを利用して、各関数により汎用ログを出力します。

  3. 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サーバアプリケーションの記述例》

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サーバアプリケーションの記述例》

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関数を利用します。ログを出力するには、サーバアプリケーションの開発言語に応じて、以下の関数を利用します。

《ログ定義ファイルの記述例》

<?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サーバアプリケーションの記述例》

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".