BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Integration > AI トピック > アダプタの開発 > ロギング ツールキットの使い方 |
アダプタの開発
|
ロギング ツールキットの使い方
ロギングは、アダプタ コンポーネントに不可欠な機能です。一般的にアダプタは、複数のアプリケーションの統合に使用され、データの処理時にエンド ユーザとは対話しません。フロントエンド コンポーネントの動作とは異なり、エラーや警告状況が発生した場合も、処理を停止して、エンドユーザの応答を待つことはありません。
ADK では、ロギング フレームワークを実装することにより、アダプタ アクティビティのログを記録できます。このフレームワークによって、インターナショナライズされたメッセージおよびローカライズされたメッセージを、複数の出力先に記録できます。また、メッセージのカテゴリ、優先度、フォーマット、および送り先の指定に使用できる一連のコンフィグレーション パラメータが用意されています。
この章の内容は以下のとおりです。
ロギング ツールキット
ADK が提供するロギング ツールを使用すると、インターナショナライズされたメッセージを複数の出力先にログとして記録できます。このロギング ツールキットにより、Apache Log4j オープン ソース プロジェクトの機能が強化されます。この製品には、Apache Software Foundation (http://www.apache.org) によって開発されたソフトウェアが組み込まれています。
ロギング ツールキットは、必要な Log4j クラスをラップし、J2EE 準拠アダプタに機能を追加するためのフレームワークです。このツールキットは、WLI_HOME/lib ディレクトリの logtoolkit.jar ファイル内にあります。この JAR ファイルは、DOM、XERCES、および Log4j に依存しています。XERCES の依存関係には、WebLogic Server と共に提供される weblogic.jar および xmlx.jar ファイルが必要です。WebLogic Integration は、WLI_HOME/lib の該当するバージョンである Log4j (log4j.jar) も提供します。
Log4j パッケージは、オープン ソース イニシアチブによって認可されたオープン ソースの完全ライセンス、Apache 公用ライセンスに従って配布されています。全ソース コード、クラス ファイル、およびドキュメント込みの最新の Log4j バージョンは、Apache Log4j Web サイト(http://www.apache.org)にあります。
ロギング コンフィグレーション ファイル
この節では、全般にわたってロギング コンフィグレーション ファイルの参照をしたりコードを抜粋したりしています。ロギング コンフィグレーション ファイルは、BEA_WLS_DBMS_ADK.xml などのアダプタ論理名で識別される .xml ファイルです。このファイルには、ロギング コンセプトで説明されている 4 つのロギング コンセプトに関する基本情報が定義されていて、開発者のアダプタに合わせて変更できます。
ADK では、WLI_HOME/adapters/sample/src に基本的なロギング コンフィグレーション ファイル BEA_WLS_SAMPLE_ADK.xml が格納されています。このファイルを独自のアダプタ用に変更する場合は、GenerateAdapterTemplate を実行してください。このユーティリティを使用すると、サンプル バージョンのロギング コンフィグレーション ファイルを、開発者が新しく構築したアダプタに関連する情報にもとづいてカスタマイズし、このカスタマイズ バージョンのファイルを新しいアダプタの開発環境で使用できます。GenerateAdapterTemplate の詳細については、カスタム開発環境の作成を参照してください。
ロギング コンセプト
ADK のロギング ツールキットを使う前に、ロギング フレームワークの主要コンセプトを理解しておいてください。ロギングには、次の 4 つの主要コンポーネントがあります。
これらのコンポーネントは相互に連携して機能し、メッセージ タイプと優先度に従ってログ メッセージを記録し、メッセージのフォーマットおよび出力先を実行時に管理できます。
メッセージ カテゴリ
カテゴリは、定義された基準に従ってログ メッセージを識別する、ロギング フレームワークの中心的なコンセプトです。ADK では、カテゴリは、BEA_WLS_SAMPLE_ADK.DesignTime のように名前で識別されます。
カテゴリは、定義された階層で、どのカテゴリも親カテゴリからプロパティを継承できます。階層は次のように定義されます。
たとえば、以下の図に示すように、BEA_WLS_SAMPLE_ADK.DesignTime は、BEA_WLS_SAMPLE_ADK の子孫で、さらに BEA_WLS_SAMPLE_ADK は、ルート カテゴリの子孫になっています。
ROOT CATEGORY
|
|->BEA_WLS_SAMPLE_ADK
|
|->BEA_WLA_SAMPLE.ADK.DesignTime
ルート カテゴリはカテゴリ階層の最上位にあり、名前で削除あるいは検索することができません。
カテゴリを作成する場合、属するアダプタ内のコンポーネントに対応した名前を割り当てます。たとえば、あるアダプタのコンポーネントが設計時ユーザ インタフェース コンポーネントである場合、次のような名前にします。BEA_WLS_SAMPLE_ADK.DesignTime
メッセージ優先度
各メッセージの重要度が、優先度によって示されています。メッセージの優先度は、メッセージのログに使用される ILogger インタフェース メソッドによって決まります。たとえば、ILogger インスタンスでデバッグ メソッドを呼び出すと、優先度のデバッグ メッセージが生成されます。
ロギング ツールキットでは、メッセージに対して 5 つの優先度をサポートしています。これらの優先度は、優先度の高い順に表 5-1 にリストされます。
BEA_WLS_SAMPLE_ADK カテゴリには下記の子要素があるので、その重要度は「WARN」となっています。
<priority value='WARN' class='com.bea.logging.LogPriority'/>
優先度に使用されるクラスは、com.bea.logging.LogPriority である必要があります。
カテゴリへの優先度の割り当て
カテゴリには優先度を割り当てることができ、優先度が割り当てられていないカテゴリの場合、優先度が割り当てられている最も近い祖先から優先度を継承します。すなわち、あるカテゴリの継承優先度は、そのカテゴリの階層で最初に行き当たった NULL でない優先度になります。
ログ メッセージは、優先度がそのカテゴリの優先度以上の場合、ログ送り先に送られます。それ以外の場合は、メッセージはログには書き込まれません。優先度が割り当てられていないカテゴリは、階層から優先度を継承します。最終的にすべてのカテゴリが優先度を継承できるようにするため、ルート カテゴリには必ず優先度が割り当てられます。継承優先度 q のカテゴリ内の優先度 p のログ ステートメントは、p >= q の場合、有効になります。このルールでは、優先度の順位が DEBUG < INFO < WARN < ERROR < AUDIT のようになっているという想定に基づきます。
メッセージ アペンダ
ロギング フレームワークでは、アペンダと呼ばれるインタフェースを使用することにより、1 つのアダプタで複数の送り先にログ メッセージを出力できます。Log4j には、以下の送り先に対応するアペンダがあります。
さらに、ADK ロギング ツールキットには、ご使用の WebLogic Server ログへのログ メッセージの送信を呼び出せるアペンダも用意されています。
1 つのカテゴリは、複数のアペンダを参照できます。あるカテゴリで有効なロギング要求は、カテゴリ階層の上位にある全アペンダとカテゴリ内にあるすべてのアペンダに対しても転送されます。すなわち、アペンダはカテゴリ階層から累加的に継承されます。
たとえば、コンソール アペンダがルート カテゴリに追加されると、有効なロギング要求はすべて、少なくともコンソールに表示されます。ここで、さらにファイル アペンダがカテゴリ C に追加されると、C および C の子カテゴリの有効なロギング要求はファイルに出力され、コンソールに表示されます。累加フラグを false に設定することにより、このデフォルト動作をオーバーライドして、アペンダの継承が累加的に付け加えられるのを止めることができます。
注意: この場合、さらにコンソール アペンダを直接 C に追加すると、同じメッセージが 2 回(C からとルートから)コンソールに表示されます。ルート カテゴリが、常にコンソールにログを出力するためです。
リスト5-1 は、WebLogic Server ログに対するアペンダを示しています。
コード リスト 5-1 WebLogic Server ログに対するアペンダを示すサンプル コード
<!--
WeblogicAppender がログ出力を Weblogic ログに送る。Weblogic 外で稼働する場合、
アペンダはメッセージを System.out に書き出す
-->
<appender name="WebLogicAppender"
class="com.bea.logging.WeblogicAppender"/>
</appender>
メッセージ レイアウト
Log4j では、レイアウトをアペンダに関連付けることでログ メッセージのフォーマットをカスタマイズできます。レイアウトによってログ メッセージのフォーマットが決定され、アペンダは、フォーマットされたメッセージを送り先に転送します。ロギング ツールキットでは、通常 PatternLayout を使用してログ メッセージのフォーマットを設定します。PatternLayout は、標準 Log4j 配布キットに含まれており、これを使用することにより、C 言語の printf 関数に似た変換パターンに従って出力フォーマットを指定できます。
たとえば、変換パターンが「%-5p%d{DATE} %c{4} %x - %m%n」の PatternLayout を呼び出すと、次のようなメッセージが生成されます。
AUDIT 21 May 2001 11:00:57,109 BEA_WLS_SAMPLE_ADK - admin opened connection to EIS
このパターンの各パラメータの意味は以下のとおりです。
「-」の後ろのテキストは、メッセージ内容です。
コンポーネントの結合
リスト5-2 では、サンプル アダプタの新しいカテゴリを宣言し、新しいカテゴリに優先度を関連付け、アペンダを宣言することでログ メッセージの送信先のファイルのタイプを指定しています。
コード リスト 5-2 新しいログ カテゴリを宣言するサンプル XML コード
<!-
重要!!!アダプタのルート カテゴリ、これを一意のものにすることで、
他のアダプタがカテゴリにロギングされるのを防ぐ。
-->
<category name='BEA_WLS_SAMPLE_ADK' class='com.bea.logging.LogCategory'>
<!-
デフォルト優先度レベルで実行時に変更可
DEBUG は、アダプタのコード ベースの全メッセージ
INFO は、情報、警告、エラー、監査ログ
WARN は、警告、エラー、監査ログ
ERROR は、エラー、監査ログ
AUDIT は、監査ログ
-->
<priority value='WARN' class='com.bea.logging.LogPriority'/>
<appender-ref ref='WebLogicAppender'/>
</category>
注意: クラスは com.bea.logging.LogCategory と指定します。
ロギングの設定方法
注意: 次の手順は、GenerateAdapterTemplate ユーティリティを実行して開発環境の複製が作成されていることを前提としています。このユーティリティの詳細については、カスタム開発環境の作成を参照してください。
アダプタに対してロギング フレームワークをセットアップするには
コード リスト 5-3 EventGenerator ログ カテゴリを優先度 DEBUG で追加するサンプル コード
<category name='BEA_WLS_DBMS_ADK.EventGenerator'
class='com.bea.logging.LogCategory'>
<priority value='DEBUG'
class='com.bea.logging.LogPriority'/>
</category>
コード リスト 5-4 ファイル アペンダおよびレイアウト パターンを追加するサンプル コード
<!-- 基本ファイル アペンダ -->
<appender name='FileAppender'
class='org.apache.Log4j.FileAppender'>
<!-- 出力をファイルに送信 -->
<param name='File' value='BEA_WLS_DBMS_ADK.log'/>
<!-- 既存を短縮 -->
<param name="Append" value="true"/>
<!-- 基本 LOG4J パターン レイアウトを使用 -->
<layout class='org.apache.Log4j.PatternLayout'>
<param name='ConversionPattern' value='%-5p %d{DATE} %c{4}
%x - %m%n'/>
</layout>
</appender>
ここで、以下のコンフィグレーション ファイルの設定を確認します。
これらのパスにおいて、ADAPTER はアダプタ名を示します。たとえば、DBMS サンプル アダプタの場合、関連付けられたコンフィグレーション ファイルのパス名は次のようになります。
WLI_HOME/adapters/dbms/src/rar/META-INF/ra.xml
ロギング フレームワークのクラス
ロギング フレームワークの基本コンセプトを理解した上で、さらにロギング ツールキットに用意されている 3 つのメイン クラスについても理解してください。
com.bea.logging.ILogger
このクラスは、ロギング フレームワークのメイン インタフェースです。ロギング メッセージ用にたくさんの便利なメソッドがあります。
ロギングの設定方法では、基本ログ コンフィグレーション ファイルでロギングのコンフィグレーション方法を説明しています。また、以下に示したロギング メソッドを実装することによってもプログラム上でロギングのコンフィグレーションを行うことができます。
com.bea.logging.LogContext
このクラスは、ロギング フレームワークの ILogger インスタンスの識別に必要な情報をカプセル化します。現行では、LogContext は、ログ カテゴリ名、および en_US などのロケールをカプセル化します。このクラスは、ログ マネージャ内の ILogger インスタンスを一意に識別するための主キーです。
com.bea.logging.LogManager
このクラスのメソッドによって、ロギング フレームワークをコンフィグレーションできるようになり、ILogger インスタンスにアクセスすることもできます。
使用するアダプタに合うロギング ツールキットを適切にコンフィグレーションするために、ADK では、リスト5-5 に示す引数を持つ configure() メソッドを LogManager に実装しています。
コード リスト 5-5 ロギング ツールキットのコンフィグレーション用のサンプル コード
public static LogContext
configure(String strLogConfigFile,
String strRootLogContext,
String strMessageBundleBase,
Locale locale,
ClassLoader classLoader)
表 5-2 は、configure() によって渡される引数の説明です。
コンフィグレーションが完了すると、LogContext オブジェクトを指定することにより、アダプタで使用する ILogger インスタンスを取得できます。
コード リスト 5-6 LogContext オブジェクトを指定するサンプル コード
LogContext logContext = new LogContext("BEA_WLS_SAMPLE_ADK", java.util.Locale.US);
ILogger logger = LogManager.getLogger(logContext); logger.debug("I'm logging now!");
ADK では、ほとんどのログ コンフィグレーションおよび設定は自動で行われます。com.bea.adapter.spi.AbstractManagedConnectionFactory クラスは、サービス アダプタのロギング ツールキットをコンフィグレーションし、AbstractEventGenerator はイベント アダプタのロギング ツールキットをコンフィグレーションします。さらに、ADK に用意されているクライアント コネクタ インタフェース(CCI)およびサービス プロバイダ インタフェース(SPI)の基本クラスはすべて、ILogger およびその関連付けられた LogContext へのアクセス機能を備えています。
アダプタには、EIS に対する通信を設定するのに使用するソケット レイヤなど、CCI/SPI レイヤをサポートするアダプタ内のレイヤも含まれる場合があります。アダプタが適切な ILogger オブジェクトにアクセスする方法は、2 つあります。
コード リスト 5-7 現在のスレッドに対する LogContext にアクセスするためのコード
public static LogContext getLogContext(Thread t)
throws IllegalStateException, IllegalArgumentException
また、LogManager には以下のような便利なメソッドがあります。
public static ILogger getLogger() throws IllegalStateException
このメソッドは、現在実行中のスレッドに対して、ILogger を提供します。この方法を使用するには注意点が 1 つあります。下位レイヤには、そのメンバーとして LogContext または ILogger を格納しないでください。下位レイヤが、これらを LogManager から動的に取り出すようにします。LogContext が現在実行中のスレッドに対して設定される前にこのメソッドが呼び出されると、IllegalStateException が返されます。
ログ メッセージのインターナショナライゼーションとローカライゼーション
インターナショナライゼーション(I18N)とローカライゼーション(L10N)は、ADK ロギング フレームワークの中心的なコンセプトです。ILogger インタフェースで、ロギングに使用するすべてのメソッドは、デバッグ メソッドを除き、I18N を提供しています。その実装は、Java インターナショナライゼーション規格に従っており、ResourceBundle オブジェクトを使用して、ロケール固有のメッセージまたはテンプレートを格納します。Java 言語の I18N および L10N 規格の使用方法については、Sun Microsystems 社による優れたオンライン チュートリアルがあります。
マルチスレッド コンポーネントでのコンテキスト情報の保存
現実に使用されているシステムの多くは、複数のクライアントを同時に処理する必要があります。そのようなシステムの典型的なマルチスレッド実装では、スレッドごとに異なるクライアントを処理します。ロギングは、特に複雑な分散アプリケーションのトレースおよびデバッグに適しています。2 つのクライアント間のロギング出力を区別する一般的な方法は、クライアントごとに個別カテゴリをインスタンス化する方法ですが、この方法には欠点があります。カテゴリが増大し、これらを管理するオーバーヘッドが大きくなるという点です。
より負担の小さい方法は、同じクライアント対話で開始された各ログ要求に対してユニークな識別子でスタンプを付す方法です。Neil Harrison 氏が、この方法を『Pattern Languages of Program Design 3』(R. Martin、D. Riehle、F. Buschmann 編集。Addison-Wesley、1997)の「Patterns for Logging Diagnostic Messages」で説明しています。
各要求にユニークな識別子でスタンプを付けるには、ユーザはコンテキスト情報を Nested Diagnostic Context (NDC) にプッシュします。ロギング ツールキットには、NDC メソッドへのアクセスのための独立したインタフェースがあります。このインタフェースは、getNDCInterface() メソッドを使用して ILogger から取得されます。
NDC 出力は、XML コンフィグレーション ファイル(%x 記号による)でオンになります。ログ要求が行われると、適切なロギング フレームワーク コンポーネントが、現在のスレッドに対する全 NDC スタックをログ出力に組み込みます。ユーザはこの処理に関わる必要はありません。ユーザの作業は、コード内の数箇所決まった場所で push および pop メソッドを使用して、正しい情報を NDC に入力するだけです。
コード リスト 5-8 サンプル コード
public void someAdapterMethod(String aClient) {
ILogger logger = getLogger();
INestedDiagnosticContext ndc = logger.getNDCInterface();
// 全ログ メッセージについてこのクライアント名を追跡する
ndc.push("User name=" + aClient);
// メソッド本体 ・・・
ndc.pop();
}
NDC は、使用するアダプタの CCI Interaction オブジェクト内で使用します。
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |