CB3 - チュートリアル 第3章 - 3.11ログ出力

 3.11.1概要

  • このサンプルの目的
     このアプリケーション作成例を通して、以下について知ることができます。
    • サービスからログを出力する方法
    • ログに出力するメッセージを生成する方法

  • サンプルアプリケーションの内容
     メッセージプロパティからメッセージを取得し、ログを出力するバッチアプリケーションです。
     サンプルアプリケーションの概要を下図に示します。

     

     CB3ではログ出力に標準でlog4jを利用します。但し、CB3の実装上はlog4jに依存していないため、他のログ出力ユーティリティを利用することも可能です。
     また、CB3ではログに出力するためのメッセージを取得する機能を提供します。 メッセージ取得の機能はメッセージのIDを指定して、メッセージプロパティからメッセージを取得します。 このとき、メッセージに置換対象文字列を含めることもできます。 置換対象文字列はメッセージプロパティにメッセージを「{0}」のような形式で定義しておいて、メッセージを取得するときに動的にメッセージを置き換えます。
     取得したメッセージにはジョブプロセスID(ジョブ実行時に自動的に振られるID、[サービスID] + [ジョブ開始日時(年月日時分秒))、 サービスID(サービスプロバイダのbean名)、メッセージID(メッセージプロパティに定義したID)を付加します。

     このサンプルでは以下のファイルについて説明します。  
    • LogSample.java
       サービスのプログラムです。上図内の赤枠の部分に相当します。
    • LogSampleConstant.java
       ログ出力を行う際に必要なメッセージIDを文字列として定義した、定数クラスです。
    • logSample.properties
       メッセージを定義したプロパティファイルです。
    • 起動用バッチファイル - logsample.bat
       サービスを起動するためのバッチファイルです。

 3.11.2サービスの作成

  • LogSample.java

     01:public class LogSample extends CB3Service {
     02:
     03:    /**
     04:     * メッセージを出力しログを生成するメソッド
     05:     */
     06:    @Override
     07:    protected int doService(ServiceParameters arg0, RuntimeParameters arg1)
     08:    throws ServiceException {
     09:
     10:        Log log = LogFactory.getLog(LogSample.class);
     11:        // 独自に定義したメッセージID定義クラスからプロパティファイル名を取得し、
     12:        // LogMessageFactoryクラスを生成する
     13:        LogMessageFactory message = new LogMessageFactory(LogSampleConstant.CB3_SAMPLE_LOG_FILE);
     14:
     15:        String hello = "Hello";
     16:        String world = "World!!";
     17:
     18:        //ログメッセージを読み込み、infoログを出力する。getMessageは引数を複数指定できる。
     19:        log.info(message.getMessage(LogSampleConstant.CB3_SAMPLE_INFO, hello, world));
     20:        return ExitCodeConstant.SUCCESS;
     21:    }
     22:}
    


    13行目:
    メッセージの取得を行うためのjp.co.cybec.cb3.util.logging.LogMessageFactoryを生成しています。コンストラクタの引数には、メッセージプロパティ(このサンプルではlogSample.properties) のファイル名を引数に指定します。

    19行目:
    メッセージの取得とログの出力を行っています。メッセージを取得するためにはそのメッセージのIDを指定します。LogMessageFactoryオブジェクトのgetMassageメソッドに メッセージIDを指定(第一引数)してメッセージの取得を行っています。 logSample.propertiesには次のように定義されています。
    CB3.SAMPLE.INFOLOG =[{0} {1}]を出力しました。
    左辺(CB3.SAMPLE.INFOLOG)がメッセージのID、右辺がメッセージとなります。上記サンプルプログラムのgetMessageメソッドではさらに、 二つの引数(hello、world)を指定しています。メッセージ中の{0}及び{1}は置換対象文字列で、この二つの引数でそれぞれ置き換えられ一つの メッセージになります。置換対象文字列は任意の数({0}...{n})指定することができ、メッセージを取得する際には置換対象文字列の数に合わせて、 引数を指定することでメッセージを形成することができます。

 3.11.3設定ファイルの作成

  • logSample.properties
    下記はこのサンプルで使用しているメッセージです。

     01: CB3.SAMPLE.INFOLOG =[{0} {1}]を出力しました。
    

    メッセージの定義は上記のように「key=message」の形式で定義を行います。
    メッセージ中の{0}、{1}は置換対象文字列で任意の数指定することができます。置換対象文字列は上記のように「{n}」の形式で 定義を行い、0から始まる番号をつけます。

 3.11.4サービスの実行

  • logsample.bat
    下記バッチファイルはサービスを起動するためのバッチファイルです。

     01:@echo off
     02:
     03:setlocal
     04:
     05:call ./set_classpath_com.bat
     06:
     07:set CLASSPATH=%CB3_HOME%/resources/config/logsample;%CLASSPATH%
     08:
     09:java jp.co.cybec.cb3.container.provider.ServiceProviderImpl -ServiceName logsample
     10:
     11:pause
    

    上記バッチファイルを実行すると下記のように表示されます。

    [2008-08-21 18:51:23.278] INFO (LogSample.java:38) [doService] JobProcessID:[log
    sample20080821185121] ServiceID:[logsample] MessageID:[CB3.SAMPLE.INFOLOG] [Hell
    o World!!]を出力しました。
    続行するには何かキーを押してください . . .
    

    logsample.logを確認すると以下のようにログ出力されています。