Apcoordinator ユーザーズガイド
目次 前ページ次ページ

第2部 Apcoordinatorコアの機能> 第4章 APIを使ったプログラミング> 4.2 アプリケーションログ

4.2.2 ログのキューイング(update)

アプリケーションログを出力する場合、ログの出力を行っている間にアプリケーションの処理が中断します。ログのキューイングを行うことで、アプリケーション処理の完了後適当なタイミングでログを出力することができます。この機能を使うことで、アプリケーションのレスポンスに影響なくログの出力を行うことができます。 Apcoordinatorのログ機構では、デフォルトでログのキューイングを有効にしています。

■キューの有効・無効

メッセージの順序をアプリケーション内で限定したい場合は、一時的にキューを無効にします。 メッセージがキューに溜まっている場合は、出力を待つことになります。

        LogComposer lc = context.getApplicationProfile().getLogComposer();
        synchronized(lc) {
            lc.disableQueue(true);
            lc.println(3, "重要なメッセージ");
            lc.enableQueue();
        }

あらかじめアプリケーションログで利用するキューを無効にすることが可能です。 初期化パラメタ"uji.log.enablecache"へfalseを指定するとキャッシュを無効にします。初期化パラメタは、ApplicationProfileクラス、または、DispatchContextクラスのgetLogComposer()メソッドで参照するLogComposerオブジェクトに有効です。 キューイングの有効・無効は初期化パラメタ、および、ログ定義ファイルでも設定することができます。ただし、disableQueueメソッドで設定されている場合は、そちらが優先されます。初期化パラメタについては初期化パラメタを参照してください。ログ定義ファイルについては定義ファイルを用いたログ出力を参照してください。以下はWebアプリケーションでweb.xmlファイルにログのキュー利用を無効とする定義の例です。

<web-app>
  <context-param>
    <param-name>uji.log.enablecache</param-name>
    <param-value>false</param-value>
  </context-param>
</web-app>

注意
ログのキューイングを有効にした場合、LogComposerインスタンスごとにキューが生成されます。このため、複数のインスタンスから同一の出力先へ出力する場合、各キューが出力するタイミングによって、ログ中に別のログが割り込んで出力される場合があります。この現象をログの混在といいます。
また、標準出力や標準エラー出力へ出力する場合、コンテナが出力するログやSystem.out.printlnメソッドなどのログ出力クラス以外からの出力を行なった場合にログの混在が発生する場合があります。
複数のLogComposerインスタンスから同一の出力先へ出力する場合は、ログの混在を回避するために、それぞれのLogComposerインスタンスに同一のLogSinkインスタンスを設定してください。
コンテナが出力するログとのログの混在を防ぐためには、出力先を標準出力ではなく個別のファイルなどを指定して、ログ出力クラスを使用して出力するようにしてください。

■キューサイズの設定

キューのサイズ(メッセージを蓄積できる数)を設定しておくことによって、ログメッセージによってメモリが枯渇することを防ぎます。この上限を超えてメッセージを出力しようとした場合、出力の実行により空きができるまで待たされます。デフォルトのキューサイズは1000です。

        lc.setQueueSize(1000);

■カスタマイズしたログ機構でのキュー設定

カスタマイズしたログ機構を使用する場合、ログ機構を取得した直後はキューは抑制されています。キューの開始を実行する必要があります。

public class SampleApplication extends com.fujitsu.uji.ApplicationProfile
{
    LogComposer newLogComposer() {
        LogComposer lc;
        lc = LogComposer.getFileOutputInstance("c:\\myapp\\mylog.txt", true,
                      new LineLogFormat("%d %m"));
        lc.setQueueSize(1000);
        lc.enableQueue();
        lc.setLogLevel(9);
        return lc;
    }
}


目次 前ページ次ページ

All Rights Reserved, Copyright © 富士通株式会社 2000-2005