Oracle® Fusion Middleware Oracle WebLogic Server 診断フレームワークのコンフィグレーションと使い方 11g リリース 1 (10.3.1) B55523-01 |
|
![]() 戻る |
![]() 次へ |
前の章で説明したように、WebLogic Server Administration Console を使用して、WebLogic 診断フレームワーク (WLDF) などの WebLogic Server の機能を有効化、コンフィグレーション、およびモニタすることができます。また、JMX API と WebLogic Scripting Tool (WLST) を使用して、同じタスクをプログラム的に実行することもできます。
以下の節では、WLDF のプログラム的なコンフィグレーションについて説明します。
アプリケーションの開発とデプロイ、および WLST の使い方については、以降の節での説明に加え、以下のマニュアルも参照してください。
『Oracle Fusion Middleware Oracle WebLogic Server アプリケーションの開発』
『Oracle Fusion Middleware Oracle WebLogic Server JMX によるカスタム管理ユーティリティの開発』
『Oracle Fusion Middleware Oracle WebLogic Server JMX によるカスタム管理ユーティリティの開発』
『Oracle Fusion Middleware Oracle WebLogic Server アプリケーションのデプロイメント』
『Oracle Fusion Middleware Oracle WebLogic Scripting Tool ガイド』
通常、診断データは、以下のプロセスで WLDF コンポーネントによって生成および取得されます。
ハーベスタ、インスツルメンテーション、イメージ キャプチャ、および監視と通知の各コンポーネントの WLDF XML 記述子ファイルの設定によって、サーバの実行中に生成される診断データの種類と量が決まる。
診断コンテキストとインスツルメンテーションの設定によって、診断データがシステム内を流れる過程でフィルタ処理およびモニタされる。データが収集され、アクションがトリガされ、イベントが生成され、コンフィグレーションされた通知が送信されます。
アーカイブ コンポーネントによってデータが格納される。
アクセサ コンポーネントによってデータが取得される。
コンフィグレーションは主に管理タスクであり、Administration Console または WLST スクリプトを使用して行います。システム レベル (サーバおよびクラスタ) やアプリケーション レベルで診断リソースをコンフィグレーションする場合、通常はデプロイ可能な記述子モジュールである XML コンフィグレーション ファイルを使用します。(WLDF リソースのコンフィグレーションの詳細については、「WLDF コンフィグレーショについて」を参照)。
アクセサ コンポーネントによる出力の取得は、管理タスクになる場合と、プログラム的なタスクになる場合があります。
Administration Console または WLST を使って WLDF リソースを作成すると、WebLogic Server は各リソースについて MBean (管理対象 Bean) を作成します。JMX または WLST を使用してこれらの MBean にアクセスできます。weblogic.WLST は JMX クライアントであるため、WLST を使用して実行できるすべてのタスクは、JMX を使用してプログラム的に実行することもできます。
表 14-1 には、WLDF およびそのコンポーネントに関係する Bean とパッケージを示します。図 14-1 では、Bean をタイプ別にグループ化しています。
表 14-1 WLDF コンポーネントと Bean およびパッケージのマッピング
コンポーネント | Bean / パッケージ |
---|---|
WLDF |
|
診断イメージ |
|
インスツルメンテーション |
|
診断コンテキスト |
パッケージ : weblogic.diagnostics.context |
ハーベスタ |
|
監視と通知 |
WLDFWatchJMXNotificationRuntimeMBean WLDFWatchNotificationRuntimeMBean パッケージ : weblogic.diagnostics.watch |
アーカイブ |
|
アクセサ |
図 14-1 WLDF コンフィグレーション MBean、実行時 MBean、およびシステム モジュール Bean
WebLogic 診断フレームワークを使用すると、以下のタスクをプログラム的に実行できます。
診断記述子ファイルを作成および変更して、WLDF ハーベスタ、インスツルメンテーション、および監視と通知コンポーネントをサーバ レベルでコンフィグレーションする。
JMX を使用して、WLDF のオペレーションと属性にアクセスする。
JMX を使用して、収集可能なデータを格納するカスタム MBean を作成する。次に、ハーベスタをコンフィグレーションしてデータを収集したり、監視と通知をコンフィグレーションして値をモニタしたりできる。
以下のタスクを実行する Java プログラムを作成する。
JMX リスナによる通知のキャプチャ。
JMS による通知のキャプチャ。
アクセサによるアーカイブされたデータの取得(アクセサは、他のコンポーネントと同様に JMX として表面化されており、WLST や JMX プログラミングによって診断データを取り出すことができる)。
コンフィグレーション API と実行時 API は、WLDF をコンフィグレーションおよびモニタします。コンフィグレーション API と実行時 API は、双方とも MBean としてエクスポーズされます。
コンフィグレーション MBean とシステム モジュール Bean は、WLDF リソースを作成およびコンフィグレーションし、その実行時の動作を決定する。
実行時 MBean は、さまざまなコンポーネントの実行時状態および定義された処理をモニタする。
コンフィグレーション API と実行時 API を使用すると、データ収集をコンフィグレーション、アクティブ化、非アクティブ化したり、監視、通知、アラーム、診断イメージ キャプチャをコンフィグレーションしたり、データにアクセスしたりできます。
コンフィグレーション API は、以下の WLDF コンポーネントのコンフィグレーションに使用するインタフェースを定義します。
データ コレクタ : コンフィグレーション API を使用すると、インスツルメンテーション、収集、イメージ キャプチャをコンフィグレーションおよび制御できる。
インスツルメンテーション コンポーネントでは、サーバ レベルのインスツルメンテーションおよびインスツルメンテーション モニタを有効化、無効化、作成、および破棄できる。
注意 : コンフィグレーション API では、アプリケーション レベルのインスツルメンテーションのコンフィグレーションをサポートしていません。ただし、Java Specification Request (JSR) 88 API を使用している場合、アプリケーション レベルのインスツルメンテーションに対するコンフィグレーションの変更が影響を受ける可能性があります。 |
ハーベスタ コンポーネントでは、収集する型を追加および削除したり、その型のどの属性およびインスタンスを収集するかを指定したり、ハーベスタのサンプル期間を設定したりできる。
診断イメージ キャプチャ コンポーネントでは、イメージ キャプチャを格納するディレクトリの名前とパス、イベント イメージ キャプチャの間隔 (最近アーカイブされたイベントが診断イメージにキャプチャされる時間間隔) を設定できる。
監視と通知 : コンフィグレーション API を使用すると、監視と通知の有効化、無効化、作成および破棄を行える。また、コンフィグレーション API を使用すると、以下のことが可能になります。
ルールの種類、監視ルール式、監視の重大度の設定
通知に対するアラームの種類およびアラーム リセット期間の設定
診断イメージ キャプチャをトリガするための監視のコンフィグレーション
監視への通知の追加、および監視からの通知の削除
アーカイブ : アーカイブの種類およびアーカイブ ディレクトリを設定できる。
実行時 API は、WLDF コンポーネントの実行時の状態をモニタするためのインタフェースを定義します。これらの API のインスタンスは、個々の管理対象サーバのインスタンス上でインスタンス化されます。実行時 API は、実行時 MBean として定義されているので、JMX クライアントが簡単にアクセスできます。
実行時 API は、個々の WLDF コンポーネントの他のすべての実行時インスタンスをカプセル化します。これらの API は、weblogic.management.runtime パッケージに入っています。
実行時 API を使用すると、以下の WLDF コンポーネントをモニタできます。
データ コレクタ : 実行時 API を使用すると、インスツルメンテーション、ハーベスタ、イメージ キャプチャの各コンポーネントをモニタできる。
インスツルメンテーション コンポーネントでは、ジョインポイント数の統計、インスツルメンテーション モニタで検査されたクラスの数、変更されたクラスの数、およびインスツルメンテーション モニタでクラスの検査にかかった時間をモニタできる。
ハーベスタ コンポーネントでは、収集可能な型のセット、収集可能な属性、および収集可能なインスタンス (つまり、特定の型で現在収集可能なインスタンス) を問い合わせることができる。また、収集用に現在コンフィグレーションされている型、属性、およびインスタンスを問い合わせることもできます。サンプリング間隔、および収集プロセスに関するさまざまな実行時統計も利用可能です。
イメージ キャプチャ コンポーネントでは、診断イメージの出力先およびロックアウト期間を指定して、イメージ キャプチャを開始できる。
監視と通知 : 実行時 API を使用すると、監視と通知およびアーカイブの各コンポーネントをモニタできる。
監視と通知コンポーネントでは、監視アラームを設定したり、アラーム、イベント、ログ レコード、収集されたメトリックの解析に関する情報など、監視ルールの評価やトリガされた監視に関する統計をモニタしたりできる。
アーカイブ : ファイル名、アーカイブの統計など、アーカイブに関する情報をモニタできる。
データ アクセサ : 実行時 API を使用すると、別のアーカイブに保持されている診断データを取り出すことができる。また、実行時 API では、基底のアーカイブからデータを検索するクエリ式を指定できるので、データのフィルタ処理も利用できます。カラム型のマップ (診断データの対応する型名にカラム名を関連付けたマップ)、データ レコード数とタイムスタンプに関する統計、カーソル (クライアントがデータ レコードを取得するためのカーソル) に関する情報をモニタできます。
以下の 2 つのパッケージが用意されています。
weblogic.diagnostics.context には以下が含まれます。
DiagnosticContextConstants、WebLogic 診断システムでサポートされる仕分けフラグのインデックスを定義します。
DiagnosticContextHelper、アプリケーションから診断コンテキストへの限定的なアクセスを提供します。
weblogic.diagnostics.watch には以下が含まれます。
JMXWatchNotification、通知に関する追加情報を含む拡張 JMX 通知オブジェクトです。この情報は、getExtendedInfo メソッドから返される参照された WatchNotification オブジェクトに保持されます。
WatchNotification、監視ルールの通知を定義します。
以下のサンプルでは、WLDF Bean およびパッケージを使用し、実行中のサーバの情報にアクセスして変更します。
また、「WebLogic Scripting Tool のサンプル」の WLST および JMX のサンプルも参照してください。
次のサンプルでは、weblogic.diagnostics.context パッケージの DiagnosticContextHelper クラスを使用して、DYE_0 フラグの値を取得および設定します。診断コンテキストの情報については、「診断コンテキストを管理するための DyeInjection モニタのコンフィグレーション」を参照してください。
このプログラムをコンパイルして実行するには、次の手順に従います。
DiagnosticContextExample.java サンプル (コード リスト 14-2) をディレクトリにコピーし、次のコマンドを使用してコンパイルします。
javac -d . DiagnosticContextExample.java
これにより、/weblogic/diagnostics/examples ディレクトリが作成され、その中に DiagnosticContextExample.class が格納されます。
プログラムを実行します。コマンドの構文は次のようになります。
java weblogic.diagnostics.examples.DiagnosticContextExample
サンプル出力は次のようになります。
# java weblogic.diagnostics.examples.DiagnosticContextExample ContextId=5b7898f93bf010ce:40305614:1048582efd4:-8000-0000000000000001 isDyedWith(DYE_0)=false isDyedWith(DYE_0)=true
コード リスト 14-1 サンプル DiagnosticContextExample.java
package weblogic.diagnostics.examples; import weblogic.diagnostics.context.DiagnosticContextHelper; public class DiagnosticContextExample { public static void main(String args[]) throws Exception { System.out.println("ContextId=" + DiagnosticContextHelper.getContextId()); System.out.println("isDyedWith(DYE_0)=" + DiagnosticContextHelper.isDyedWith(DiagnosticContextHelper.DYE_0)); DiagnosticContextHelper.setDye(DiagnosticContextHelper.DYE_0, true); System.out.println("isDyedWith(DYE_0)=" + DiagnosticContextHelper.isDyedWith(DiagnosticContextHelper.DYE_0)); } }
HarvesterMonitor プログラムでは、ハーベスタ JMX 通知を使用して、収集サイクルの発生を識別します。次に、アクセサを使用して新しい値を取得します。すべてのアクセスは、JMX を使用して実行します。この節では、HarvesterMonitor.java のコードを示す前に、通知リスナについて説明します。
ハーベスタ コンポーネントの詳細については、「メトリック収集用のハーベスタのコンフィグレーション」を参照してください。
通知リスナでは、特定の転送媒体に対応する実装が用意されています。たとえば、SMTP 通知リスナでは、メール サーバとの SMTP 接続を確立し、その SMTP 通知リスナが受信する通知インスタンスで電子メールをトリガするメカニズムを利用できます。JMX、SNMP、JMS などの種類のリスナでも、それぞれに対応した実装があります。
注意 : SMTP、JMX、SNMP、または JMS 以外の転送媒体を使用して、WebLogic 診断フレームワークで生成されたイベントを伝播するプラグインを開発できます。1 つの方法としては、JMX NotificationListener インタフェースを使用してオブジェクトを実装し、選択した転送媒体の必要条件に従って通知を伝播します。 |
表 14-2 に、WebLogic Server で利用可能な各通知リスナの種類、およびその種類に対応するコンフィグレーションを示します。
14-2 通知リスナの種類
通知媒体 | 説明 | 必要なコンフィグレーション パラメータ |
---|---|---|
JMS |
JMS Message キューまたはトピックを介して伝播。 |
必須 : 送り先の JNDI 名。 省略可能 : 接続ファクトリの JNDI 名 (ない場合は、デフォルト JMS 接続ファクトリを使用)。 |
JMX |
標準 JMX 通知を介して伝播。 |
必須パラメータはなし。イベントのポストにはあらかじめ定義されたシングルトンを使用。 |
SMTP |
通常の電子メールを介して伝播。 |
必須 : MailSession JNDI 名と Destination の電子メール。 省略可能 : 電子メールの件名と本文 (指定しない場合は、デフォルトを使用) |
SNMP |
SNMP トラップおよび WebLogic Server SNMP エージェントを介して伝播。 |
必須パラメータはなし。ただし、WebLogic SNMP エージェントで SNMPTrapDestination MBean を定義する必要がある。 |
デフォルトでは、監視ルールから発動したすべての通知は、コンフィグレーションされた媒体を介して発動されるとともに、サーバ ログ ファイルに格納されます。
HarvesterMonitor プログラムをコンパイルして実行するには、次の手順に従います。
HarvesterMonitor.java サンプル (コード リスト 14-2) をディレクトリにコピーし、次のコマンドを使用してコンパイルします。
javac -d . HarvesterMonitor.java
これにより、/weblogic/diagnostics/examples ディレクトリが作成され、その中に HarvesterMonitor.class および HarvesterMonitor$HarvestCycleHandler.class が格納されます。
モニタを開始します。コマンドの構文は次のようになります。
java HarvesterMonitor <server> <port> <uname> <pw> [<types>]
WebLogic Server インスタンスにアクセスし、サーバの名前、ポート番号、管理者のログイン名、および管理者のパスワードを調べる必要があります。
収集される型名のリストを指定することもできます。指定した場合、プログラムを実行するとそれらの型の値のみが表示されます。ただし、選択したそれぞれの型について収集した値がすべて表示されます。表示される値を制約する方法は提供されていません。
収集が明示的にコンフィグレーションされた値のみが表示されます。監視ルールをサポートするためだけに収集された値 (暗黙的な値) は表示されません。
次のコマンドでは、CLASSPATH 変数に「.」を含める必要があります。また、このコマンドは、プログラムをコンパイルしたディレクトリから実行する必要があります。このコマンドを実行すると、ポート 7001、ユーザ weblogic、パスワード weblogic で myserver サーバに接続されます。
java weblogic.diagnostics.examples.HarvesterMonitor myserver 7001 weblogic weblogic
HarvesterMonitor からの出力のサンプルについては、コード リスト 14-3 を参照してください。
コード リスト 14-2 サンプル : HarvesterMonitor.java
package weblogic.diagnostics.examples; import weblogic.management.mbeanservers.runtime.RuntimeServiceMBean; import javax.management.*; import javax.management.remote.*; import javax.naming.Context; import java.util.*; public class HarvesterMonitor { private static String accessorRuntimeMBeanName; private static ObjectName accessorRuntimeMBeanObjectName; private static String harvRuntimeMBeanName; private static ObjectName harvRuntimeMBeanObjectName; private static MBeanServerConnection rmbs; private static ObjectName getObjectName(String objectNameStr) { try { return new ObjectName(getCanonicalName(objectNameStr)); } catch (RuntimeException x) { throw x; } catch (Exception x) { x.printStackTrace(); throw new RuntimeException(x); } } private static String getCanonicalName(String objectNameStr) { try { return new ObjectName(objectNameStr).getCanonicalName(); } catch (RuntimeException x) { throw x; } catch (Exception x) { x.printStackTrace(); throw new RuntimeException(x); } } private static String serverName; private static int port; private static String userName; private static String password; private static ArrayList typesToMonitor = null; public static void main(String[] args) throws Exception { if (args.length < 4) { System.out.println( "Usage: java weblogic.diagnostics.harvester.HarvesterMonitor " + "<serverName> <port> <userName> <password> [<types>]" + weblogic.utils.PlatformConstants.EOL + " where <types> (optional) is a comma-separated list " + "of types to monitor."); System.exit(1); } serverName = args[0]; port = Integer.parseInt(args[1]); userName = args[2]; password = args[3]; accessorRuntimeMBeanName = getCanonicalName( "com.bea:ServerRuntime=" + serverName + ",Name=HarvestedDataArchive,Type=WLDFDataAccessRuntime" + ",WLDFAccessRuntime=Accessor,WLDFRuntime=WLDFRuntime"); accessorRuntimeMBeanObjectName = getObjectName(accessorRuntimeMBeanName); harvRuntimeMBeanName = getCanonicalName( "com.bea:ServerRuntime=" + serverName + ",Name=WLDFHarvesterRuntime,Type=WLDFHarvesterRuntime" + ",WLDFRuntime=WLDFRuntime"); harvRuntimeMBeanObjectName = getObjectName(harvRuntimeMBeanName); if (args.length > 4) { String typesStr = args[4]; typesToMonitor = new ArrayList(); int index; while ((index = typesStr.indexOf(",")) > 0) { String typeName = typesStr.substring(0,index).trim(); typesToMonitor.add(typeName); typesStr = typesStr.substring(index+1); } typesToMonitor.add(typesStr.trim()); } rmbs = getRuntimeMBeanServerConnection(); new HarvesterMonitor().new HarvestCycleHandler(); while(true) {Thread.sleep(100000);} } static protected String JNDI = "/jndi/"; static public MBeanServerConnection getRuntimeMBeanServerConnection() throws Exception { JMXServiceURL serviceURL; serviceURL = new JMXServiceURL("t3", "localhost", port, JNDI + RuntimeServiceMBean.MBEANSERVER_JNDI_NAME); System.out.println("ServerName=" + serverName); System.out.println("URL=" + serviceURL); Hashtable h = new Hashtable(); h.put(Context.SECURITY_PRINCIPAL, userName); h.put(Context.SECURITY_CREDENTIALS, password); h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote"); JMXConnector connector = JMXConnectorFactory.connect(serviceURL,h); return connector.getMBeanServerConnection(); } class HarvestCycleHandler implements NotificationListener { // used to track harvest cycles private int timestampIndex; private int domainIndex; private int serverIndex; private int typeIndex; private int instNameIndex; private int attrNameIndex; private int attrTypeIndex; private int attrValueIndex; long lastSampleTime = System.currentTimeMillis(); HarvestCycleHandler() throws Exception{ System.out.println("Harvester monitor started..."); try { setUpRecordIndices(); rmbs.addNotificationListener(harvRuntimeMBeanObjectName, this, null, null); } catch (javax.management.InstanceNotFoundException x) { System.out.println("Cannot find JMX data. " + "Is the server name correct?"); System.exit(1); } } private void setUpRecordIndices() throws Exception { Map columnIndexMap = (Map)rmbs.getAttribute( accessorRuntimeMBeanObjectName, "ColumnIndexMap"); timestampIndex = ((Integer)columnIndexMap.get("TIMESTAMP")).intValue(); domainIndex = ((Integer)columnIndexMap.get("DOMAIN")).intValue(); serverIndex = ((Integer)columnIndexMap.get("SERVER")).intValue(); typeIndex = ((Integer)columnIndexMap.get("TYPE")).intValue(); instNameIndex = ((Integer)columnIndexMap.get("NAME")).intValue(); attrNameIndex = ((Integer)columnIndexMap.get("ATTRNAME")).intValue(); attrTypeIndex = ((Integer)columnIndexMap.get("ATTRTYPE")).intValue(); attrValueIndex = ((Integer)columnIndexMap.get("ATTRVALUE")).intValue(); } public synchronized void handleNotification(Notification notification, Object handback) { System.out.println("\n------------------------------------------"); long thisSampleTime = System.currentTimeMillis()+1; try { String lastTypeName = null; String lastInstName = null; String cursor = (String)rmbs.invoke(accessorRuntimeMBeanObjectName, "openCursor", new Object[]{new Long(lastSampleTime), new Long(thisSampleTime), null}, new String[]{ "java.lang.Long", "java.lang.Long", "java.lang.String" } ); while (((Boolean)rmbs.invoke(accessorRuntimeMBeanObjectName, "hasMoreData", new Object[]{cursor}, new String[]{"java.lang.String"})).booleanValue()) { Object[] os = (Object[])rmbs.invoke(accessorRuntimeMBeanObjectName, "fetch", new Object[]{cursor}, new String[]{"java.lang.String"}); for (int i = 0; i < os.length; i++) { Object[] values = (Object[])os[i]; String typeName = (String)values[typeIndex]; String instName = (String)values[instNameIndex]; String attrName = (String)values[attrNameIndex]; if (!typeName.equals(lastTypeName)) { if (typesToMonitor != null && !typesToMonitor.contains(typeName)) continue; System.out.println("\nType " + typeName); lastTypeName = typeName; } if (!instName.equals(lastInstName)) { System.out.println("\n Instance " + instName); lastInstName = instName; } Object attrValue = values[attrValueIndex]; System.out.println(" - " + attrName + "=" + attrValue); } } lastSampleTime = thisSampleTime; } catch (Exception e) {e.printStackTrace();} } } }
コード リスト 14-3 に、HarvesterMonitor プログラムからの出力のサンプルを示します。
コード リスト 14-3 HarvesterMonitor からのサンプル出力
ServerName=myserver URL=service:jmx:t3://localhost:7001/jndi/weblogic.management.mbeanservers.runtime Harvester monitor started... ------------------------------------------------------ Type weblogic.management.runtime.WLDFHarvesterRuntimeMBean Instance com.bea:Name=WLDFHarvesterRuntime,ServerRuntime=myserver,Type=WLDFHarvesterRuntime,WLDFRuntime=WLDFRuntime - TotalSamplingTime=202048863 - CurrentSnapshotElapsedTime=1839619 Type weblogic.management.runtime.ServerRuntimeMBean Instance com.bea:Name=myserver,Type=ServerRuntime - RestartRequired=false - ListenPortEnabled=true - ActivationTime=1118319317071 - ServerStartupTime=40671 - ServerClasspath= [deleted long classpath listing] - CurrentMachine= - SocketsOpenedTotalCount=1 - State=RUNNING - RestartsTotalCount=0 - AdminServer=true - AdminServerListenPort=7001 - ClusterMaster=false - StateVal=2 - CurrentDirectory=C:\testdomain\. - AdminServerHost=10.40.8.123 - OpenSocketsCurrentCount=1 - ShuttingDown=false - SSLListenPortEnabled=false - AdministrationPortEnabled=false - AdminServerListenPortSecure=false - Registered=true
次のサンプルでは、JMX を使用してログ エントリを標準出力に出力します。すべてのアクセスは、JMX を使用して実行します。(アクセサ コンポーネントの詳細については、「データ アクセサを使用した診断データへのアクセス」を参照)。
このプログラムをコンパイルして実行するには、次の手順に従います。
JMXAccessorExample.java サンプル (コード リスト 14-4) をディレクトリにコピーし、次のコマンドを使用してコンパイルします。
javac -d . JMXAccessorExample.java
これにより、/weblogic/diagnostics/examples ディレクトリが作成され、その中に JMXAccessorExample.class が格納されます。
プログラムを実行します。コマンドの構文は次のようになります。
java weblogic.diagnostics.example.JMXAccessor <logicalName> <query>
WebLogic Server インスタンスにアクセスし、サーバの名前、ポート番号、管理者のログイン名、および管理者のパスワードを調べる必要があります。
logicalName はログの名前です。有効な名前は、HarvestedDataArchive、EventsDataArchive、ServerLog、DomainLog、HTTPAccessLog、ServletAccessorHelper.WEBAPP_LOG、RAUtil.CONNECTOR_LOG、JMSMessageLog、および CUSTOM です。
クエリは、「WLDF クエリ言語」で説明する構文を使用して作成されます。JMXAccessorExample プログラムでは、空の query (空の二重引用符のペア、"") を指定すると、ログ内のすべてのエントリが返されます。
次のコマンドでは、CLASSPATH 変数に「.」を含める必要があります。また、このコマンドは、プログラムをコンパイルしたディレクトリから実行する必要があります。プログラムでは、IIOP (Internet Inter-ORB Protocol) プロトコルを使用して、ユーザ weblogic、パスワード weblogic でポート 7001 に接続し、ServerLog ログ内のすべてのエントリを標準出力に出力します。
java weblogic.diagnostics.examples.JMXAccessorExample ServerLog ""
このサンプルは、適切なユーザ名とパスワードを使用するように変更できます。
コード リスト 14-4 JMXAccessorExample.java
package weblogic.diagnostics.examples; import java.io.IOException; import java.net.MalformedURLException; import java.util.Hashtable; import java.util.Iterator; import javax.management.MBeanServerConnection; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import javax.naming.Context; public class JMXAccessorExample { private static final String JNDI = "/jndi/"; public static void main(String[] args) { try { if (args.length != 2) { System.err.println("Incorrect invocation. Correct usage is:\n" + "java weblogic.diagnostics.examples.JMXAccessorExample " + "<logicalName> <query>"); System.exit(1); } String logicalName = args[0]; String query = args[1]; MBeanServerConnection mbeanServerConnection = lookupMBeanServerConnection(); ObjectName service = new ObjectName(weblogic.management.mbeanservers.runtime.RuntimeServiceMBean.OBJECT_NAME); ObjectName serverRuntime = (ObjectName) mbeanServerConnection.getAttribute(service, "ServerRuntime"); ObjectName wldfRuntime = (ObjectName) mbeanServerConnection.getAttribute(serverRuntime, "WLDFRuntime"); ObjectName wldfAccessRuntime = (ObjectName) mbeanServerConnection.getAttribute(wldfRuntime, "WLDFAccessRuntime"); ObjectName wldfDataAccessRuntime = (ObjectName) mbeanServerConnection.invoke(wldfAccessRuntime, "lookupWLDFDataAccessRuntime", new Object[] {logicalName}, new String[] {"java.lang.String"}); String cursor = (String) mbeanServerConnection.invoke(wldfDataAccessRuntime, "openCursor", new Object[] {query}, new String[] {"java.lang.String"}); int fetchedCount = 0; do { Object[] rows = (Object[]) mbeanServerConnection.invoke(wldfDataAccessRuntime, "fetch", new Object[] {cursor}, new String[] {"java.lang.String"}); fetchedCount = rows.length; for (int i=0; i<rows.length; i++) { StringBuffer sb = new StringBuffer(); Object[] cols = (Object[]) rows[i]; for (int j=0; j<cols.length; j++) { sb.append("Index " + j + "=" + cols[j].toString() + " "); } System.out.println("Found row = " + sb.toString()); } } while (fetchedCount > 0); mbeanServerConnection.invoke(wldfDataAccessRuntime, "closeCursor", new Object[] {cursor}, new String[] {"java.lang.String"}); } catch(Throwable th) { th.printStackTrace(); System.exit(1); } } private static MBeanServerConnection lookupMBeanServerConnection () throws Exception { // JMX サービス URL を作成する JMXServiceURL serviceURL; serviceURL = new JMXServiceURL("iiop", "localhost", 7001, JNDI + "weblogic.management.mbeanservers.runtime"); // ユーザ、パスワード、WebLogic プロバイダ パッケージを指定する Hashtable h = new Hashtable(); h.put(Context.SECURITY_PRINCIPAL,"weblogic"); h.put(Context.SECURITY_CREDENTIALS,"weblogic"); h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote"); // JMX コネクタを取得する JMXConnector connector = JMXConnectorFactory.connect(serviceURL,h); // MBean サーバの接続クラスを返す return connector.getMBeanServerConnection(); } // lookupMBeanServerConnection の終了 }