アプリケーションログを出力する場合、ログの出力を行っている間にアプリケーションの処理が中断します。ログのキューイングを行うことで、アプリケーション処理の完了後適当なタイミングでログを出力することができます。この機能を使うことで、アプリケーションのレスポンスに影響なくログの出力を行うことができます。 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メソッドで設定されている場合は、そちらが優先されます。初期化パラメタについては“13.3 初期化パラメタ”を参照してください。ログ定義ファイルについては定義ファイルを用いたログ出力を参照してください。以下はWebアプリケーションでweb.xmlファイルにログのキュー利用を無効とする定義の例です。
<web-app xmlns=http://java.sun.com/xml/ns/j2ee xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd version="2.4"> <context-param> <param-name>uji.log.enablecache</param-name> <param-value>false</param-value> </context-param> </web-app>
注意
ログのキューイングを有効にした場合、LogComposerインスタンスごとにキューが生成されます。これに伴って、次の2点に注意してください。
複数のインスタンスから同一の出力先へ出力する場合、各キューが出力するタイミングによって、ログ中に別のログが割り込んで出力される場合があります。この現象をログの混在といいます。
また、標準出力や標準エラー出力へ出力する場合、コンテナが出力するログやSystem.out.printlnメソッドなどのログ出力クラス以外からの出力を行なった場合にログの混在が発生する場合があります。
複数のLogComposerインスタンスから同一の出力先へ出力する場合は、ログの混在を回避するために、それぞれのLogComposerインスタンスに同一のLogSinkインスタンスを設定してください。
コンテナが出力するログとのログの混在を防ぐためには、出力先を標準出力ではなく個別のファイルなどを指定して、ログ出力クラスを使用して出力するようにしてください。
LogComposerのインスタンス1つにつき、スレッドが1つ生成されます。LogComposerのインスタンスを大量に生成するとJVMのスレッド数の制限を超える場合がありますので注意してください。
ログのキューイングを無効にした場合でも、プロセスを停止するまでApcoordinatorはログファイルをクローズしません。
このため、ログのファイル出力のタイミングはシステムに依存します。
キューサイズの設定
キューのサイズ(メッセージを蓄積できる数)を設定しておくことによって、ログメッセージによってメモリが枯渇することを防ぎます。この上限を超えてメッセージを出力しようとした場合、出力の実行により空きができるまで待たされます。デフォルトのキューサイズは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; } }