28 MAFアプリケーションのテストおよびデバッグ
この章の内容は次のとおりです。
MAFアプリケーションのテストおよびデバッグの概要
MAFアプリケーションをテストまたはデバッグするには、MAFでサポートされるいずれかのプラットフォーム(Android、iOSまたはユニバーサルWindowsプラットフォーム)上のデバイスに、デバッグ・モードでアプリケーションをデプロイします。
MAFおよび各プラットフォームでは、JDeveloper開発環境を、デバイスまたは仮想デバイス上で実行されるMAFアプリケーションに接続するために使用できるツールが提供されます。たとえば、AndroidデバイスでMAFアプリケーションをテストする場合は、JDeveloperからAndroidデバイスまたはAndroid Virtual Device (AVD)にMAFアプリケーションをデバッグ・モードでデプロイします。ユニバーサルWindowsプラットフォームおよびiOSでも類似のツールが提供されます。
MAFアプリケーションをデバッグするためのおおまかなステップには、次のタスクが含まれます。
-
MAFアプリケーションをテスト環境にデプロイするために使用するデプロイメント・プロファイルを構成して、MAFアプリケーションがデバッグ・モードでデプロイされるようにします。
-
MAFアプリケーションの
maf.properties
ファイルを構成して、デバッグを有効にします。 -
MAFアプリケーションをテスト環境にデプロイします。
-
実行するデバッグ・タスクに適切なツールを使用します。たとえば、MAFアプリケーションでJavaコードをデバッグする場合は、JDeveloperが提供するツールを使用します。MAFアプリケーションのユーザー・インタフェース(HTML、CSSまたはJavaScript)をレンダリングするコードをデバッグする場合は、各プラットフォームでこのタスクのために提供されているツールを使用します。
MAFにはこの他にも、アプリケーションのテストを支援するための機能が用意されています。これには、アプリケーションのパフォーマンスをモニターする機能や、Oracle Mobile Cloud Serviceに分析および診断情報を送信する機能(アプリケーションがこのサービスからのリソースにアクセスする場合)などがあります。
MAFアプリケーションのテスト
モバイル・デバイス、エミュレータまたはシミュレータでMAFアプリケーションをテストできます。
MAFアプリケーションをテストするには、次の2つの方法があります。
-
モバイル・デバイス上でのテスト: この方法では常に、最も正確な動作が提供されます。アプリケーションのパフォーマンスを測定する場合も、この方法をとる必要があります。ただし、テスト実行者がテスト対象のすべてのデバイスを入手できるとはかぎらないため、デバイスのテストは確実なものとは言えません。
-
モバイル・デバイス・エミュレータまたはシミュレータ上でのテスト: この方法は通常、よりよいパフォーマンスとより高速なデプロイを提供し、便利です。ただし、デバイスのエミュレータまたはシミュレータは、対応する物理デバイスに近似したものであるとは言え、動作の相違やエミュレートできる機能の制限が存在する場合があります。
通常、両方の方法を組み合せて使用することで、最良の結果が得られます。
iOSデバイス上でアクセシビリティのテストを実行する方法
iOSデバイス用に開発されたMAFアプリケーションのアクセシビリティをテストするには、次の方法を組み合せて使用してください。
-
iOSデバイス・シミュレータ上でアクセシビリティ・インスペクタを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』のVoiceOverを使用したデバイスでのアクセシビリティのテストに関する項を参照してください。
-
iOSデバイス上でVoiceOverを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』の「Using VoiceOver to Test Your Application」の項を参照してください。
コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成
JDeveloperには、Javaプログラムをデバッグ・モードで実行し、標準のブレークポイントを使用してアプリケーションの実行をモニターおよび制御することを可能にするデバッグ・メカニズムが備わっています。
MAFアプリケーションはJDeveloper内部で実行できないため、デバッグの方法が異なります。JDeveloperデバッガを使用して、モバイル・デバイスまたはシミュレータ上のJava仮想マシン・インスタンスに接続し、デプロイ済のMAFアプリケーションのJavaの部分を制御します。
MAFでは、デバッグ用にプロジェクト・プロパティが自動的に構成されます。JDeveloperを使用してMAFアプリケーション内のJavaコードをデバッグするために実行する必要のあるステップは、次のとおりです。
アプリケーションをテストまたはデバッグするには:
-
JDeveloperのメイン・メニューから、「実行」→「アクティブな実行構成を選択」をクリックして、アクティブな実行構成を選択します。
-
「アプリケーション」ウィンドウで、テストするファイルを右クリックし、「実行」を選択します。
あるいは、デバッグを有効にした状態でアプリケーションを実行する場合は、「デバッグ」を選択します。
ヒント:
「ソース」ビューでMAFアプリケーションのファイルを開き、右クリックして、「実行」または「デバッグ」を選択します。
注意:
事前定義済の実行構成セットを持たない既存のアプリケーションを使用する場合は、新しい実行構成を作成します。
「デバッグ構成に関する必知事項」を参照してください。
デバッグ構成に関する必知事項
新しいMAFアプリケーションを作成する場合、作成ウィザードでは、デバッグ用にアプリケーション・プロパティが自動的に構成されます。これには、iOSシミュレータまたはAndroidエミュレータやデバイスでMAFアプリケーションの実行またはデバッグを行うために使用できるデフォルトの実行構成の作成が含まれます。これらの実行構成では、JDeveloperの「実行」または「デバッグ」ボタンをクリックすると、MAFアプリケーションの構築、デプロイ、実行またはデバッグができます。JDeveloperの「実行」または「デバッグ」ボタンをクリックし、MAF実行構成を選択すると、実行構成に関連付けられたデプロイメント・プロファイルが実行され、アプリケーションが構築されてターゲット・デバイスにデプロイされます。アプリケーションはデプロイされると、自動的に起動します。「デバッグ」ボタンを選択すると、アプリケーションがデバッガとともに起動します。
実行構成の作成および編集方法の詳細は、「実行構成の作成と構成」を参照してください。
JavaコードおよびJavaScriptのデバッグを有効にする方法
maf.properties
ファイルでは、JVMの起動パラメータおよびMAFのWebビューを指定して、JavaコードおよびJavaScriptのデバッグを有効にできます。maf.properties
ファイルは自動的に作成され、「アプリケーション・リソース」のDescriptors/META-INF
ディレクトリ内に配置されます(「ロギングの使用方法と構成」を参照)。この場所は、アプリケーション・ファイル・システム内の<application_name>
/src/META-INF
の場所に対応しています。
MAF実行構成を実行すると、maf.properties
ファイルに次のデバッグ・プロパティが自動的に設定されます。
-
java.debug.enabled
: デバッグ・セッションを行う場合はtrue
に設定し、実行セッションを行う場合はfalse
に設定します。注意:
java.debug.enabled
がtrue
に設定されている場合、JVMは、デバッガが接続を確立するのを待ちます。デバッガが接続に失敗すると、MAF AMXアプリケーション機能のロードが失敗します。 -
java.debug.port
: 実行対象のMAF実行構成で構成されているポート番号に設定します。 -
javascript.debug.enabled
: デバッグ・セッションを行う場合はtrue
に設定し、実行セッションを行う場合はfalse
に設定します。Androidにのみ適用されます。注意:
iOSシミュレータまたはiOSデバイスでMAFアプリケーションが実行されている場合、JavaScriptデバッグを有効にするためには
javascript.debug.enabled
プロパティは必要ありません。
maf.properties
ファイルの内容は、次のようなものです。
java.debug.enabled=true java.debug.port=8000 javascript.debug.enabled=true
JDeveloperを使用してJavaコードをデバッグする方法については、「MAFアプリケーションのデバッグ」を参照してください。
MAF AMXコンテンツのデバッグ方法
MAFアプリケーションにMAF AMXコンテンツが含まれている場合は、デバイスまたはエミュレータの構成後、JDeveloperの他のアプリケーションをデバッグするときと同じように、ブレークポイントの設定、変数の内容の表示およびメソッド・コール・スタックのインスペクトを行うことができます。
注意:
デバッグできるのは、JavaコードおよびJavaScriptのみです(「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)。EL式または他の宣言要素のデバッグはサポートされていません。
AndroidプラットフォームにデプロイされたMAFアプリケーションのデバッグ
AndroidにデプロイするMAFアプリケーションのJavaおよびUIコードのデバッグ方法について説明します。
Javaコードをデバッグするには、アプリケーションでmaf.properties
ファイルを構成し、JDeveloperで実行構成を作成します。これらのタスクの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」および「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」を参照してください。これらのタスクを完了したら、「AndroidプラットフォームでのJavaコードのデバッグ方法」の説明に従って、MAFアプリケーションをデバッグ・モードでデプロイし、Javaコードをデバッグできます。
UIコード(JavaScript、HTMLおよびCSS)をデバッグするには、アプリケーションでmaf.properties
ファイルを構成します(javascript.debug.enabled=true
)。このタスクを完了したら、「AndroidプラットフォームでのUIコードのデバッグ方法」の説明に従って、UIコードをデバッグできます。
AndroidプラットフォームでのJavaコードのデバッグ方法
AndroidプラットフォームでMAFアプリケーションのJavaコードをデバッグするには、「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」で説明されているデバッグ手順に従います。
Androidデバイスまたはエミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、「AndroidエミュレータへのAndroidアプリケーションのデプロイ方法」を参照してください。
Androidデバイスまたはエミュレータで実行中のMAFアプリケーションのデバッグを可能にするには、「MAFアプリケーションでのプラグインの使用方法の概要」の説明に従って、ネットワーク情報プラグインが有効であることを確認します
AndroidプラットフォームでのUIコードのデバッグ方法
MAFアプリケーションを開発する際、Androidデバイスでアプリケーションのユーザー・インタフェース(UI)をレンダリングするコードのデバッグが必要になる場合があります。UIをレンダリングするコードには、JavaScript、HTML、CSSなどがあります。開発マシンからAndroidデバイスにMAFアプリケーションをデプロイするときに、GoogleのChrome DevToolsを使用して(図を参照)、このコードをデバッグできます。
使用するための要件を含む、Chrome DevToolsの詳細は、Google DevelopersのサイトでChrome DevToolsを使用したAndroidでのリモート・デバッグに関する項を参照してください。
Oracle Mobile Platform YouTubeチャンネルの「Android上のOracle MAFアプリケーションでのHTMLのデバッグ」ビデオで、AndroidでUIコードをデバッグする方法の概要も参照してください。後者のビデオではcvm.properties
ファイルに言及していることに注意してください。このファイルは、現在のリリースではmaf.properties
に名前が変更されています。
-
maf.properties
ファイルを構成して、javascript.debug.enabled=true
というエントリを含めます。maf.properties
ファイルの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。 -
デバッグ・モードでデプロイします。「MAFアプリケーションのデプロイ」を参照してください。
iOSプラットフォームにデプロイされたMAFアプリケーションのデバッグ
iOSにデプロイするMAFアプリケーションのJavaおよびUIコードのデバッグ方法について説明します。
Javaコードをデバッグするには、その前に、アプリケーションでmaf.properties
ファイルを構成し、JDeveloperで実行構成を作成します。これらのタスクの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」および「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」を参照してください。これらのタスクを完了したら、アプリケーションをiOSデバイスにデバッグ・モードでデプロイして、Javaコードをデバッグできます。デバッグ・モードでのデプロイ方法の詳細は、「iOSプラットフォームでのJavaコードのデバッグ方法」を参照してください。
UIコード(JavaScript、HTMLおよびCSS)をデバッグするには、アプリケーションでmaf.properties
ファイルを構成します(javascript.debug.enabled=true
)。このタスクを完了したら、「iOSプラットフォームでのUIコードのデバッグ方法」の説明に従って、UIコードをデバッグできます。
iOSプラットフォームでのJavaコードのデバッグ方法
iOSプラットフォームでJDeveloperを使用してMAFアプリケーションのJavaコードをデバッグするには、「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」で説明されているデバッグ手順に従います。
iOSデバイスまたはシミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、次を参照してください。
iOSプラットフォームでのUIコードのデバッグ方法
iOS プラットフォームで作業している場合、Safari ブラウザを使用してJavaScriptをデバッグできます。これを行うには、Safariの環境設定を開き、「Advanced」を選択した後、「Show Develop menu in menu bar」を選択して、ブラウザ内の「Develop」メニューを有効にします。
「Develop」メニューが有効な場合、図に示すように「iPhone Simulator」または「iPad Simulator」を選択し、デバッグするUIWebViewを選択します。
注意:
「Develop」メニューにiPhone Simulatorオプションが表示されるか、iPad Simulatorオプションが表示されるかは、どちらのデバイス・シミュレータが起動しているかによって決まります。
featureContentDelay
追加ビルド引数を使用して、アプリケーションの最初のページがロードされる前に、カスタムJavaScriptからのログ・メッセージおよびエラーを記録します。この引数は、WebViewにコンテンツが移入されるまでの遅延を指定します。追加ビルド引数-featureContentDelay
を20
に設定します。追加ビルド引数の設定の詳細は、「iOSビルド・オプションの定義」を参照してください。
図28-3 Safariブラウザの「Develop」メニューを使用したiPhone Simulator上でのデバッグ

「図28-3 Safariブラウザの「Develop」メニューを使用したiPhone Simulator上でのデバッグ」の説明
図28-4 Safariブラウザの「Develop」メニューを使用したiPad Simulator上でのデバッグ

「図28-4 Safariブラウザの「Develop」メニューを使用したiPad Simulator上でのデバッグ」の説明
CSS、DOMおよびHTMLをデバッグ中のSafariのリモートWebインスペクタを図に示します。
Safariブラウザ内のブレークポイントを使用したJavaScriptデバッグを図に示します。
ユニバーサルWindowsプラットフォームにデプロイされたMAFアプリケーションのデバッグ
UWPにデプロイするMAFアプリケーションのJavaおよびUIコードのデバッグ方法について説明します。
JDeveloperのデバッグ・ツールを使用して、UWPにデプロイするMAFアプリケーションでJavaコードをデバッグできます。「ユニバーサルWindowsプラットフォームでJavaコードをデバッグする方法」を参照してください。
「ユニバーサルWindowsプラットフォームでUIコードをデバッグする方法」の説明に従って、Visual Studioを使用してMAFアプリケーションでJavaScript、HTMLおよびCSSコードをデバッグします。
ユニバーサルWindowsプラットフォームでJavaコードをデバッグする方法
ユニバーサルWindowsプラットフォーム(UWP)にデプロイするMAFアプリケーションでJavaコードをデバッグする方法について説明します。
次のステップを実行して、UWPにデプロイするMAFアプリケーションでJavaコードをデバッグできます。
-
MAFアプリケーションの
maf.properties
ファイル・エントリを構成して、デバッグを有効にします。maf.properties
ファイルに次の値が存在することを確認します。java.debug.enabled=true java.debug.port=8000 java.debug.mode=client java.debug.host=localhost
maf.properties
ファイルの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。 -
「デバッグ」モードを使用するように、MAFアプリケーションのWindowsデプロイメント・プロファイルを構成します(図28-10を参照)。このダイアログにアクセスするには、「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」をクリックします。
図28-10 MAFアプリケーションのデバッグ・モードの有効化
-
カスタム・プロジェクトをMAFアプリケーションに追加して、標準のJDeveloperアプリケーションの「実行/デバッグ」構成ダイアログにアクセスできるようにします。このカスタム・プロジェクトをMAFアプリケーションに追加したら、JPDAプロトコルをリスニングする接続を指定して、「リモート・デバッグ」オプションを有効にします。カスタム・プロジェクトでデバッグ・リスナーを開始します。これらのタスクの詳細は、「ユニバーサルWindowsプラットフォームでMAFアプリケーションのリモート・デバッグを有効にする方法」を参照してください。
-
ローカルWindowsマシン・オプションを使用してMAFアプリケーションをデプロイします。「ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ」を参照してください。
Windowsローカル・マシン・デプロイメント・オプションを使用してMAFアプリケーションをデプロイすると、アプリケーションが起動し、JDeveloperとのデバッグ・セッションが確立されます。
ユニバーサルWindowsプラットフォームでMAFアプリケーションのリモート・デバッグを有効にする方法
カスタム・プロジェクトをMAFアプリケーションに追加して、MAFアプリケーションの作成時にMAFアプリケーション作成テンプレートでは表示されない、「実行/デバッグ」構成パネルを表示します。
ユニバーサルWindowsプラットフォームでUIコードをデバッグする方法
ユニバーサルWindowsプラットフォーム(UWP)でMAFアプリケーションを開発する際、アプリケーションのユーザー・インタフェース(UI)をレンダリングするコードのデバッグが必要になる場合があります。UIをレンダリングするコードには、JavaScript、HTML、CSSなどがあります。Visual Studioを使用してこのコードをデバッグします。
MAFアプリケーション開発で使用するVisual Studioのインストールの詳細は、『Oracle Mobile Application Frameworkのインストール』のユニバーサルWindowsプラットフォーム用の開発ツールの設定に関する項を参照してください。
アプリケーションをWindowsプラットフォーム上で実行する場合は、Visual Studioを使用してアプリケーションのコードをデバッグし、インスペクトします。Windowsマシンにアプリケーションをデプロイし、Microsoftのドキュメントで説明されているように、アプリケーションのプロセスをVisual Studioデバッガにアタッチします。
MAFアプリケーションは、Windows上ではwwahost.exe
プロセスのインスタンスで実行されるため、複数のアプリケーションを実行している場合は、wwahost.exe
プロセスの複数のインスタンスがプロセスへのアタッチダイアログ・ボックスに表示されます。次の図に示すように、プロセスへのアタッチダイアログのタイトル列を使用して、アタッチする適切なアプリケーションを選択します(ここではFixItFastという名前のアプリケーションが選択されています)。
図28-13 プロセスへのアタッチダイアログ

アプリケーションをアタッチした後、Microsoftのドキュメントで説明されているように、Visual Studioデバッガを使用してアプリケーションをデバッグします。
MAFアプリケーションでのロギングの使用および構成
すべてのサポートされているプラットフォームに、MAFでログ出力が1つのファイルに向かうようにlogging.properties
ファイルを構成することによる埋込みコードおよび、JavaScriptを介してログオンできます。このログ出力には、System.out.println
およびSystem.err.println
文によって生成された出力が含まれます。
デフォルトのMAFのロギング・プロセスは、次のとおりです。
-
アプリケーションの起動時、ロギングが開始されます。
-
アプリケーションの以前の実行で生成された既存のログ・ファイルが削除され、現在の実行の内容のみが使用可能になります。
-
アプリケーションをiOSデバイス・シミュレータ上で実行する場合、Javaロギング出力へのアクセスに使用できるファイルは、出力のリダイレクションに伴って生成された直後に、その名前と場所が通知されるファイルのみです。このファイルの一般的な場所として、
/Users/
<userid>
/Library/Developer/CoreSimulator/Devices/
<device_id>
/data/Containers/Data/Application/
<container_id>
/application.log
(<device_id>
と<container_id>
の参照は、アプリケーションのインストール時にiOSによって作成されたUUIDの長い文字列を表します)などがあります。これらの参照の値は予測できないので、複数のシミュレータまたはアプリケーションがインストールされている場合は、デプロイメント時に使用されるシミュレータに対応するフォルダを特定することは困難です。デプロイメントにJDeveloperを使用する場合は、ログ出力を既知の場所に向けるように自動的に-consoleRedirect
オプションが設定されます。iOS用のMAFの実行構成で、「実行構成の編集」→「モバイル実行構成」ダイアログを使用してそれを設定し、その実行構成をデプロイメントまたはiOSデバイス・シミュレータ上でのMAFアプリケーションの実行に使用する場合は、構成された場所にログ・ファイルが作成され、その内容がJDeveloperのコンソールに表示されます。「実行構成の編集」→「モバイル実行構成」ダイアログを使用して値を設定していない場合、または通常のデプロイメント(たとえば、iOS用のMAF実行構成を使用しないなど)を選択する場合は、ログ・ファイルは<appRoot>/<deployRoot>/<iOSProfileName>/
log
<appName>
.log
ファイルに作成され、その内容がJDeveloperのコンソールに表示されます。「実行構成の作成と構成」を参照してください。注意:
ログ・ファイルを取得するには、パスは絶対パスである必要があり、場所は現在のユーザーにとって書込み可能である必要があります。
iOSデバイス上でアプリケーションを実行している場合、コンソール出力は、アプリケーションの
Documents/logs
ディレクトリにあるapplication.log
ファイルにリダイレクトされます。iOSデバイスでは、このディレクトリに次のようにアクセスできます。- 「Xcode」→「Devices」とナビゲートします。
- 「Installed Apps」セクションのリストからアプリケーションを選択します。
- 歯車のアイコンをクリックします。
- ダウンロードされたコンテナを選択します。
- ダウンロードされた
*.xcappdata
ファイルを右クリックして、「Show Package Contents」を選択します。 - 「AppData」→「Documents」→「Logs」を開きます。
application.log
ファイルをダブルクリックします。
Androidでは、出力は、アプリケーションと同じ名前のテキスト・ファイルにフォワードされます。出力ファイルの場所は、
/sdcard/Android/data/<app.package>/files/<app.name>.txt
です。この場所が存在していないか、読取り専用として構成されている場合、ログ出力は、アプリケーションの書込み可能データ・ディレクトリ(/data/data/<package>/files/<AppName>.txt
)に再ルーティングされます。Android 6.0以降を使用するAndroidデバイスでは、エンド・ユーザーがストレージ権限をMAFアプリケーションに付与していないかぎり、次の図に示すようにMAFはログ出力を/data/data/<package>/files/<AppName>.txt
に書き込みます。エンド・ユーザーがストレージ権限を付与している場合、MAFはログ出力を/sdcard/Android/data/<app.package>/files/<app.name>.txt
に書き込みます。MAFアプリケーションは、MAFアプリケーションでのプラグインの使用方法の概要に説明されているように、記憶域アクセス・プラグインを有効にすることによってユーザーがストレージ権限を有効にするようにリクエストします。MAFには多くのAPIが用意されており、MAFアプリケーションで使用してストレージ権限を管理します。次のサンプル・コードでは、これらのAPIを使用する方法を示します。MAFは非AndroidプラットフォームではこれらのAPIを無視します。このAPIの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
// Check if the Storage permission is granted: import oracle.maf.api.platform.android.Permissions; import oracle.maf.api.platform.android.PermissionGroup; ... Permissions.getInstance().hasPermissions(PermissionGroup.Storage); ... // Check if a UI should be shown to the user with a rationale for the Storage permission: import oracle.maf.api.platform.android.Permissions; import oracle.maf.api.platform.android.PermissionGroup; ... Permissions.getInstance().shouldShowRequestPermissionRationale(PermissionGroup.Storage); ... // Request Storage permission: import oracle.maf.api.platform.android.Permissions; import oracle.maf.api.platform.android.PermissionGroup; import oracle.maf.api.platform.android.PermissionsCallback; public class AndroidPermissionsBean implements PermissionsCallback { public void checkStoragePermission() { // // Set "this" as the permission callback handler. // Permissions.getInstance().setPermissionsCallbackHandler(this); // // Asynchronously request permissions. // Permissions.getInstance().requestPermissions(PermissionGroup.Storage); } @Override public void onPermissionsResponse(PermissionGroup permissionGroup, boolean hasPermissions) { // // Remove "this" as the permission callback handler. // Permissions.getInstance().setPermissionsCallbackHandler(null); // // Asynchronously handle the permission result callback below. // } }
ログ・ファイルの内容は、AndroidのLogcatユーティリティ(
http://developer.android.com/tools/debugging/debugging-log.html
を参照)でレプリケートされます。JDeveloperを使用してMAFアプリケーションをAndroidデバイスまたはエミュレータにデプロイする場合は、JDeveloperでLogcatからログ出力が表示されます。 -
iOSおよびAndroidの両方で、デプロイメントの直後に、ログ出力がJDeveloperの実行またはデバッグ・ログのページに表示されます。通常のデプロイメントの場合、アプリケーション・ログが個別の「ログ」ページに表示されるのに対し、デプロイ・ログは「デプロイ・ログ」ページに表示されます。MAFアプリケーションのビルド、デプロイおよび起動に「実行/デバッグ」実行構成を使用する場合は、「アプリケーション」ウィンドウの「プロセス」タブにある「終了」オプションで、ログのリダイレクトを実行するプロセスとともにMAFアプリケーションを終了します。「ログの表示」オプションで、次の図に示すようにログ・ページを表示できます。
図term_process.pngの説明MAFアプリケーションのビルド、デプロイおよび起動にデプロイメント・プロファイルを使用する場合は、「プロセス」タブの「終了」オプションでは、ログ・リダイレクト・プロセスのみが終了し、MAFアプリケーションの実行は続きます。
-
logging.properties
ファイルは自動的に作成され、「アプリケーション・リソース」のDescriptors/META-INF
ディレクトリ内に配置されます(「ロギングの使用方法と構成」を参照)。この場所は、アプリケーション・ファイル・システム内の<application_name>
/src/META-INF
の場所に対応しています。このファイルでは、すべてのログ出力でjava.util.logging.ConsoleHandler
およびSimpleFormatter
を使用することが定義され、ログ・レベルがSEVERE
に設定されます。このファイルを編集して、別のロギング動作を指定できます(「プロパティ・ファイルを使用したロギングの構成方法」を参照)。注意:
MAFアプリケーションでは、
java.util.logging
パッケージからのロガーを使用することはできません。
MAFのロガーは、次のとおりoracle.adfmf.util.Utility
クラスで宣言されます。
public static final String APP_LOGNAME = "oracle.adfmf.application"; public static final Logger ApplicationLogger = Logger.getLogger(APP_LOGNAME); public static final String FRAMEWORK_LOGNAME = "oracle.adfmf.framework"; public static final Logger FrameworkLogger = Logger.getLogger(FRAMEWORK_LOGNAME);
MAFアプリケーションで使用するロガーは、ApplicationLogger
です。
oracle.adfmf.util.logging.Trace
クラスのメソッドを使用することもできます。
Oracle Mobile Application Framework Java APIリファレンスを参照してください。
プロパティ・ファイルを使用したロギングの構成方法
次の例は、ロギングの構成で使用するlogging.properties
ファイルを示しています。
# default - all loggers to use the ConsoleHandler .handlers=java.util.logging.ConsoleHandler # default - all loggers to use the SimpleFormatter .formatter=java.util.logging.SimpleFormatter oracle.adfmf.util.logging.ConsoleHandler.formatter= oracle.adfmf.util.logging.PatternFormatter oracle.adfmf.util.logging.PatternFormatter.pattern= [%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE% #configure the framework logger to only use the adfmf ConsoleHandler oracle.adfmf.framework.useParentHandlers=false oracle.adfmf.framework.handlers=oracle.adfmf.util.logging.ConsoleHandler oracle.adfmf.framework.level=SEVERE #configure the application logger to only use the adfmf ConsoleHandler oracle.adfmf.application.useParentHandlers=false oracle.adfmf.application.handlers=oracle.adfmf.util.logging.ConsoleHandler oracle.adfmf.application.level=SEVERE
oracle.adfmf.util.logging.ConsoleHandler
は、カスタム・フォーマッタの受信者としての役割を果たします。
oracle.adfmf.util.logging.PatternFormatter
では、ログ・メッセージの出力を可能にする、次の高度なフォーマット・トークンが許可されています。
-
%LEVEL%
: ロギング・レベル。 -
%LOGGER%
: 出力が書き込まれるロガーの名前。 -
%CLASS%
: ログに記録されるクラス。 -
%METHOD%
: ログに記録されるメソッド。 -
%TIME%
: ロギング・メッセージが送信された時間。 -
%MESSAGE%
: 実際のメッセージ。
使用可能なロギング・レベルは、次のとおりです。
-
SEVERE
: 重大な障害を示すメッセージ・レベルです。 -
WARNING
: 潜在的な問題を示すメッセージ・レベルです。 -
INFO
: 情報メッセージのメッセージ・レベルです。 -
FINE
: トレース情報を提供するメッセージ・レベルです。 -
FINER
: このレベルは、かなり詳細なトレース・メッセージを示します。 -
FINEST
: このレベルは、非常に詳細なトレース・メッセージを示します。
注意:
ロギング・レベルの詳細度を選択するときは、SEVERE
、WARNING
およびINFO
レベルで出力の詳細度を上げると、アプリケーションのパフォーマンスに悪影響を及ぼすことに留意してください。
logging.properties
ファイルで定義されているロガーは、oracle.adfmf.util.Utility
クラスから取得されるロガーと一致します(「ロギングの使用方法と構成」を参照)。ロギング・レベルも一致します。INFO
よりも詳細なロギング・レベルを使用する場合は、ConsoleHandler
のロギング・レベルを、次の例に示されているものと同じレベルに変更する必要があります。
oracle.adfmf.util.logging.ConsoleHandler.formatter= oracle.adfmf.util.logging.PatternFormatter oracle.adfmf.util.logging.ConsoleHandler.level=FINEST oracle.adfmf.util.logging.PatternFormatter.pattern= [%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE%
JavaScriptのロギングの使用方法
JavaScriptは、console.log
or.error/.warn/.info
に出力を書き込みます。この出力は、System.out
ユーティリティによってファイルにリダイレクトされます。
メッセージを指定することで、ログの出力をカスタマイズできます。次のJavaScriptコードでは、"Message from JavaScript"
出力が生成されます。
<script type="text/javascript" charset="utf-8"> function test_function() { console.log("Message from JavaScript"); } </script>
ロギング・ファイルに定義されているプロパティを利用するには、adf.mf.log
パッケージ、およびそれによって提供されるApplication
ロガーを使用する必要があります。
使用可能なロギング・レベルは、次のとおりです。
-
adf.mf.log.level.SEVERE
-
adf.mf.log.level.WARNING
-
adf.mf.log.level.INFO
-
adf.mf.log.level.CONFIG
-
adf.mf.log.level.FINE
-
adf.mf.log.level.FINER
-
adf.mf.log.level.FINEST
ロギングをトリガーするには、adf.mf.log.Application
ロガーのlogp
メソッドを使用し、そのメソッドのパラメータで次のものを指定します。
-
ロギング・レベル
-
文字列としての現在のクラス名
-
文字列としての現在のメソッド
-
文字列としてのメッセージ文字列
次の例は、MAFアプリケーションでlogp
メソッドを使用する方法を示しています。
adf.mf.log.Application.logp(adf.mf.log.level.WARNING, "myClass", "myMethod", "My Message");
logp
メソッドを実行すると、次の出力が生成されます。
[WARNING - oracle.adfmf.application - myClass - myMethod] My Message
埋込みロギングの使用方法
埋込みロギングでは、次の例に示されているとおり、java.util.logging.Logger
を使用します。EmbeddedClass
はプロジェクトで定義されるJavaクラスを表します。
import java.util.logging.Level; import java.util.logging.Logger; import oracle.adfmf.util.logging.*; ... Utility.ApplicationLogger.logp(Level.WARNING, EmbeddedClass.class.getName(), "onTestMessage", "embedded warning message 1"); Logger.getLogger(Utility.APP_LOGNAME).logp(Level.WARNING, this.getClass().getName(), "onTestMessage", "embedded warning message 2"); Logger.getLogger("oracle.adfmf.application").logp(Level.WARNING, this.getClass().getName(), "onTestMessage", "embedded warning message 3");
このコードによって生成される出力は、次のとおりです。
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 1 [WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 2 [WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 3
iOSプラットフォームでのデバッグおよびロギングにXcodeを使用する方法
MAFプロジェクトの操作にXcodeを使用することは、JDeveloperを使用した次回のデプロイメント中に一部またはすべての変更を失う可能性があるため推奨されませんが、例外的な状況ではこれを使用できます。
始める前に:
アプリケーションをJDeveloperからiOSシミュレータにデプロイします。
生成されたプロジェクトを直接Xcodeで開く手順は次のとおりです。
-
workspace_directory
\deploy\
デプロイメント・プロファイル名
\temporary_xcode_project\
に移動します。 -
Oracle_ADFmc_Container_Template.xcodeproj
というXcodeプロジェクトを開きます。
Xcodeを使用してMAFアプリケーションをデバッグしている場合、IDE内(JDeveloperコンソールまたはXcodeコンソール)ではJavaの出力を表示できません。この出力は、ファイルにリダイレクトされます(「ロギングの使用方法と構成」を参照)。アプリケーションのスキーマに次の引数を追加すると、この動作を無効にし、iOSデバイスまたはシミュレータ上でデバッグを実行するときに、XcodeからJava、JavaScriptおよびObjective-Cのログ出力にリアルタイムでアクセスできるようになります。
-consoleRedirect=FALSE
アプリケーション・ログへのアクセス方法
MAFアプリケーションのアプリケーション・ログ・ファイルをユーザーのデバイスから取得して、MAFアプリケーションで発生している問題を分析できます。これを行う1つの方法は、アプリケーション・ログ・ファイルを、そのデバイス上の場所から、アプリケーションがアプリケーション・ログ・ファイルをデバイスから送信できるディレクトリにコピーすることです。
次の例は、アプリケーション・ログ・ファイルの場所にアクセスし、そのファイルを電子メール・メッセージへの添付が可能な場所にコピーして、ログ・ファイルの内容を分析できる受信者に送信する方法を示しています。
import java.nio.file.FileSystems;
import java.nio.file.Path;
import oracle.adfmf.util.Utility;
// Get path to application log file
private static Path getPathToLogFile() {
String pathStr = Utility.getStorageLocations().getLogFileLocation();
return FileSystems.getDefault().getPath(pathStr);
}
// Create an instance of device manager to access the device’s email functionality later
DeviceManager dm = DeviceManagerFactory.getDeviceManager();
//Construct path to application log file
String logFilePath = getPathToLogFile().toString();
...
//1. Determine device location to save a copy of the log file
String mailAccessiblePath = Utility.ensureTrailingForwardSlash(AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DeviceOnlyDirectory));
String targetFileNameAndPath = mailAccessiblePath + appName + ".log";
//2. Copy file to a location accessible from a mail client
try {
Utility.copy(new File(logFilePath), new File(targetFileNameAndPath));
}
catch (IOException e) {
// If something goes wrong, log the failure to copy.
Utility.ApplicationLogger.logp(Level.SEVERE, this.getClass().getSimpleName(), "sendLogAsMail", "Could not copy file " + logFilePath + " to " + targetFileNameAndPath);
Utility.ApplicationLogger.logp(Level.SEVERE, this.getClass().getSimpleName(), "sendLogAsMail", e.getLocalizedMessage());
}
//3. Set the attachment property referenced by sendEmail(...)
this.setMailAttachment(targetFileNameAndPath);
//4. Send mail: open the mail client
dm.sendEmail(mailTo, mailCc, mailSubject, mailBody, mailBcc, mailAttachment, mailMimeType);
注意:
アプリケーションをJDeveloperから仮想デバイス(iOSシミュレータまたはAndroidエミュレータ)にデプロイすると、MAFは、アプリケーション・ログ・ファイルではなく、JDeveloperの「ログ」ウィンドウにログ出力を書き込みます。アプリケーション・ログ・ファイルの場所を取得したら、ユーザーのデバイスからサーバー側に送信するメカニズムを選択します。検討する必要があるオプションとして、REST Webサービスを使用した、アプリケーションに関連付けられているサーバー側の特定の場所へのファイルのアップロードがあります。このオプションでは、ログ・ファイルを電子メール添付ファイルとして送信する別のオプションと比べて、より一貫したユーザー操作性が提供されます。後者のオプションでは、プラットフォーム・デバイス(iOS、Android、UWP)や、電子メール・クライアントがデバイスで構成されている方法に基づいて、異なる動作をとることができます。
MAFアプリケーションのログ・ファイルで取得される詳細レベルは、logging.propertiesファイルの構成エントリによって異なります。ただし、次の例に示すように、たとえばAPIを使用してログ・レベルを実行時に動的に変更している場合は除きます。
Logger l = Utility.ApplicationLogger;
// Select a new log level. Note that OFF disables logging. In our example, we select ALL.
// Level newLevel = Level.<ALL | CONFIG | INFO | FINE | FINER | FINEST | OFF | SEVERE | WARNING>
Level newLevel = Level.ALL;
l.setLevel(newLevel);
ロギングを無効にする方法
ロギング出力がアプリケーション・ログ・ファイルに転送されないように設定できます(この場合、ログ・ファイルは、空白のままになるか、まったく作成されません)。ロギングが無効になると、トレース文はアプリケーション・ログから失われ、stderr
およびstdout
に転送された出力は、すべてnull
の場所またはエンド・ユーザーがアクセスできない別の場所にリダイレクトされます。
すべてのロギングを無効にするには、次のようにアプリケーションのadf-config.xml
ファイルでdisableLogging
プロパティをtrue
に設定します。
<adf-property name="disableLogging" value="true"/>
デフォルトでは、MAFアプリケーションのロギングは有効で、disableLogging
プロパティはfalse
に設定されています。
adf-config.xml
ファイルの詳細は、「MAFアプリケーションとプロジェクト・ファイルの概要」を参照してください。
MAFアプリケーションのパフォーマンス測定
MAFは、ユーザーによるMAFアプリケーションのパフォーマンスのモニターおよび測定を支援します。たとえば、アプリケーションで次のイベントの実行にかかる時間を測定できます。
-
ボタンにより起動されたアクションの完了
-
ページのロード
-
RESTコールがレスポンスを返す
また、MAFアプリケーションでモニターする操作の実行時間の平均および標準偏差を示す統計を出力できます。
logging.properties
ファイルで次のパフォーマンス・ロガーのロギング・レベルを構成して、パフォーマンス測定を有効にします。次の例でロガーに割り当てられる値は、説明用の値です。使用可能なすべての値の説明は、表28-1を参照してください。oracle.adfmf.amx.useParentHandlers=false oracle.adfmf.amx.handlers=oracle.adfmf.util.logging.ConsoleHandler oracle.adfmf.amx.level=SEVERE # used to control what monitors are captured in the list of monitors oracle.maf.performance.monitor.captured.level = FINEST # used to control what monitors are reported in the dumpStatistics oracle.maf.performance.monitor.reported.useParentHandlers=false oracle.maf.performance.monitor.reported.handlers=oracle.adfmf.util.logging.ConsoleHandler oracle.maf.performance.monitor.reported.level = FINEST # used to control what monitor observations (start/stop times) are logged. oracle.maf.performance.monitor.observations.reported=false oracle.maf.performance.monitor.observations.reported.handlers=oracle.adfmf.util.logging.ConsoleHandler oracle.maf.performance.monitor.observations.reported.level = FINEST
パフォーマンス測定が完了したら、MAFにより、アプリケーションのパフォーマンスの測定中に収集されたデータを確認できます。「MAFアプリケーションのパフォーマンス・データの表示」で説明しているPerformanceMonitorGraph.jar
ツールを呼出すか、または、好みのログ・ファイル・エディタでアプリケーション・ログ・ファイルを開いて、データを確認できます。次の例は、MAFにより、パフォーマンスのモニター後に生成される出力の抜粋を示しています。この例では、モニターによって5件のProcess AMX event
が検出され、実行時間の平均は1435.5
ミリ秒、標準偏差は1990.567…
でした。
[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS: Monitor 'com.company.WorkBetter.**Perf_Monitor**.Springboard.Container.Process AMX event' description: 'Time to process event' observations: 5 mean: 1435.4 standard deviation: 1990.5674567821106
表28-1に、logging.properties
ファイルで設定できる、使用可能なパフォーマンス・モニター・レベルを示します。
表28-1 パフォーマンス・モニター・レベル
レベル | 説明 |
---|---|
Level.INFO |
これは最もおおまかなモニター・レベルです。イベントおよびアクションがモニターされます。このレベルを使用すると、たとえば、ページのロードやエンド・ユーザー・アクションの実行(ボタンのクリックなど)をモニターできます。このモニター・レベルを使用した場合、パフォーマンスへの影響は最小限になります。 |
Level.FINE |
このレベルは、次のカテゴリに分けられる、より多くのパフォーマンス・インジケータをモニターします。
このモニター・レベルを使用するとアプリケーションのパフォーマンスに影響するため、デフォルトでは有効にしないでください。アプリケーションを再構築または調整することを目的として、コードの実行状況に関するインサイトを取得する場合に、このレベルの使用を検討してください。 |
Level.FINER |
AMXページでのノードの処理、データ変更イベントまたはEL式の実行時間といった重大なパフォーマンスの問題をモニターする場合に使用します。 |
Level.FINEST |
アプリケーションのパフォーマンスをデバッグする場合に、このモニター・レベルを使用します。 |
logging.properites
で指定したモニター・レベルは、アプリケーションを初めて起動するときに有効になります。
注意:
MAFでは、oracle.adfmf.framework.api
パッケージのPerfMon
クラスに、実行時にパフォーマンス・モニター・レベルを変更するために使用できるいくつかのsetPerformanceMonitor
メソッドが用意されています。Oracle Mobile Application Framework Java APIリファレンスを参照してください。
logging.properties
ファイルでのモニター・レベルの指定に加え、パフォーマンス・データを収集するモニターをアプリケーションに追加することもできます。MAFでは、Javaクラスoracle.adfmf.performance.Monitor
(モニター)を使用してパフォーマンス・データを収集します。モニターは、開始および停止でき、監視を追加できるストップ・ウォッチです。監視を追加すると、モニターを使用して特定の測定の標準偏差などを把握できます。各モニターに、一意のIDとオプションの説明があります。
モニターでは、イベントの継続時間やイベントの発生回数を測定するために使用できるいくつかのaddObservation()
メソッドが公開されています。継続時間を測定する場合は、イベントの前にモニターを開始します。イベントが発生したら、モニターからaddObservation()
メソッドを呼び出します。これによりモニターが停止します。継続時間は、start()
メソッドからaddObservation()
メソッドまでの時間です。停止されなかったモニターは再開できます。開始していないモニターは停止できません。そのようなモニターを停止しようとすると、エラーが記録されます。
イベントの発生回数を測定するモニターは、開始または停止する必要はありません。次の例に示すように、モニターを停止しないaddObservation(double duration)
メソッドを使用します。このモニターは、パフォーマンスを測定しているアプリケーションでのJSONシリアライズの発生回数を計測します。duration
パラメータは、モニターが最後に監視を追加してからの時間を示します。
次の例は、イベントの継続時間を測定するモニターの作成方法を示しています。この例では、このモニターによって生成される統計情報のサンプルも示しています。
import oracle.adfmf.performance.Monitor; .... public void measurePerformance() { Monitor monitor = null; try { //// Check that the appropriate monitor level is set before you create the monitor if (Utility.PerformanceMonitorCaptured.isLoggable(Level.INFO)) { monitor = MonitorFactory.getInstance().getMonitor("REST call", Level.INFO, "REST call timing"); monitor.start(); } // // Perform your custom logic here: // } finally { if (monitor != null) { monitor.addObservation(); } } } public void countCalls() { Monitor monitor = null; try { if (Utility.PerformanceMonitorCaptured.isLoggable(Level.FINE)) { monitor = MonitorFactory.getInstance().getMonitor("Call count", Level.FINE, "Count number of calls"); monitor.start(); } // // Perform your custom logic here: // } finally { if (monitor != null) { monitor.addObservation(1); } } }
アプリケーションでパフォーマンス・データを収集するモニターを作成するには、データを収集するためのパフォーマンス・モニター取得レベルを有効にするようにlogging.properties
ファイルを構成します。前述の例で、アプリケーションのlogging.properties
ファイルに次のエントリが含まれていない場合、MAFではモニターのパフォーマンス・データを収集しません。
# used to control what monitors are captured in the list of monitors oracle.maf.performance.monitor.captured.level = FINEST
モニター(oracle.adfmf.performance.Monitor
)の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
モニターに加え、MAFではoracle.adfmf.performance.Story
(ストーリ)も提供されます。ストーリを使用すると、パフォーマンス・データの収集を開始および終了できます。ストーリのパフォーマンス・データの収集が終了すると、ストーリの開始時に割り当てたストーリIDを使用して収集されたパフォーマンス・データの階層ビューがMAFに表示されます。階層ビューには、ストーリ中に実行されたイベントの個別のタイミング測定が示されます。さらに、ストーリの終了時に、MAFによってシステムの状態(HOTS)チェックポイントが実行されます。このHOTSチェックポイントの一環として、ストーリ中に収集されたすべてのモニター・データの標準偏差が計算されるため、個別のストーリ・イベントが統計的にどのように測定されているかに関するインサイトを得ることができます。その後、すべてのモニター・データがMonitorFactory
からクリアされます。
注意:
oracle.adfmf.util.HOTS.checkpoint()
メソッドを呼び出すことで、ストーリとは関係なく、HOTSチェックポイントを実行できます。これにより、JVMにより使用された合計メモリー、空きメモリー、使用済メモリー(合計から空きメモリーを引いたもの)およびアクティブな機能の数といったアプリケーションの情報が判別されます。checkpoint()
によって返されるデータのサンプルを次に示します。HOTS.memory.used (N/A) count: 1.0335056E7 HOTS.memory.free (N/A) count: 1.365112E7 HOTS.memory.total (N/A) count: 2.3986176E7 HOTS.memory.max (N/A) count: 4.9152E7 HOTS.threads.active (N/A) count: 20.0 HOTS.features.active (N/A) count: 6.0
次の例は、ストーリID (**Perf_Monitor**
)でストーリを開始し、ストーリを停止するメソッドを公開するマネージドBeanを示しています。このストーリは、パフォーマンスを測定するアプリケーションのUIのボタンから開始および終了できます。たとえば、ページのロードを測定する場合は、そのページに移動する前にストーリを開始するためのUIボタンと、ページがロードされたらストーリを終了する別のボタンを公開します。
package mobile; import oracle.adfmf.amx.event.ActionEvent; import oracle.adfmf.performance.Story; public class PerfBean { public PerfBean() { super(); } public void startStory(ActionEvent ae) { Story.startStory("**Perf_Monitor**"); } public void endStory(ActionEvent ae) { Story.endStory(); } }
logging.properties
ファイルで指定したパフォーマンス・モニター・レベルによって、ストーリによって取得されるデータの量が決定されます。つまり、logging.properties
ファイルのoracle.maf.performance.monitor.reported.level = FINEST
エントリは、INFO
エントリよりも詳細なストーリを生成します。ストーリが終了すると、ストーリ中に取得されたすべてのパフォーマンス・データがタイミングに基づいてソートされます。モニターが記録された時間が、測定対象のイベントが実行された時間と異なる場合があるため、このソートによって、JavaScriptイベントに対応するモニターの監視が正しい時間で示されます。次にMAFは、次の例に示すように、ソートされたレコードを反復処理し、目的の出力を生成します。
MAFによって、アプリケーションのログ・ファイルにストーリが書き込まれます。AMXページ間を移動するアプリケーションのサンプル出力は、次のようになります。
例28-1 ストーリを使用して生成されたMAFパフォーマンス・モニター・データ
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (Story Book) at 1452728427473
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb2 (Time to process event) at 1452728427416
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop]
PERFMON-JAVA STOP: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb2 (Time to process event) took: 14897.0ms
(started at 1452728427416)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (Time to process event) at 1452728442323
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (Time to process event) took:
586.0ms (started at 1452728442323)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Container.Load page /view2.amx
(Time to fully render the page) at 1452728442441
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Load page /view2.amx
(Time to fully render the page) took: 468.0ms (started at 1452728442441)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Embedded.Evaluate method expression #{myBean2.endStory}
(UserSpace) at 1452728450665
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Embedded.Evaluate method expression #{myBean2.endStory}
(UserSpace) took: 78.0ms (started at 1452728450665)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Container.Process AMX event Page: /view2.amx
event of type action on node cb2 (Time to process event) at 1452728450626
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Process AMX event Page: /view2.amx
event of type action on node cb2 (Time to process event)
took: 85.0ms (started at 1452728450626)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (Story Book)
took: 23367.0ms (started at 1452728427473)
[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Container.Process AMX event'
description: 'Time to process event' observations: 3
mean: 5189.333333333333 standard deviation: 8410.817102596711
[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Container.Load page'
description: 'Time to fully render the page' observations: 1
mean: 468.0 standard deviation: NaN
[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Embedded.Evaluate
method expression' description: 'UserSpace' observations: 1 mean: 78.0
standard deviation: NaN
[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Embedded.Story'
description: 'Story Book' observations: 1 mean: 23367.0 standard deviation: NaN
1452728427473 0001.0001 [0000] Start: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (INFO)
1452728442323 0002.0002 [0001] Start: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (INFO)
1452728442441 0003.0003 [0002] Start: **Perf_Monitor**.Navigation.Container.Load page /view2.amx (INFO)
1452728442909 0003.0003 [0002] Stop: **Perf_Monitor**.Navigation.Container.Load page /view2.amx
(took = 468.0) started at 1452728442441 (INFO)
1452728442909 0002.0002 [0001] Stop: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (took = 586.0)
started at 1452728442323 (INFO)
1452728450626 0004.0002 [0001] Start: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view2.amx event of type action on node cb2 (INFO)
1452728450665 0005.0003 [0004] Start: **Perf_Monitor**.Navigation.Embedded.Evaluate
method expression #{myBean2.endStory} (INFO)
1452728450711 0004.0002 [0001] Stop: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view2.amx event of type action on node cb2 (took = 85.0)
started at 1452728450626 (INFO)
1452728450743 0005.0003 [0004] Stop: **Perf_Monitor**.Navigation.Embedded.Evaluate method
expression #{myBean2.endStory} (took = 78.0)
started at 1452728450665 (INFO)
1452728450840 0001.0001 [0000] Stop: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor**
(took = 23367.0) started at 1452728427473 (INFO)
MAFアプリケーションのパフォーマンス・データの表示
MAFでは、MAFアプリケーションのパフォーマンスを測定するときに、収集するMAFアプリケーションのパフォーマンス・データをグラフで表示する、パフォーマンス・モニター・グラフ・ツールが用意されています。
logging.properties
ファイルを構成する必要があります。その後、パフォーマンス・データをツールへの入力として収集するアプリケーション・ログ・ファイルを使用します。ツールはタイムラインと共にパフォーマンス・データをHTMLファイルで出力し、アプリケーションの実行中に、いつ、何のMAFイベントが発生したのかを視覚化する助けとなります。次の図に、HTMLファイルのtest.html
をデフォルト・ブラウザに表示します。
ツールは、logging.properties
ファイルで指定したデフォルトの形式に従ったアプリケーション・ログ・ファイルのログ・メッセージを解析します。それ以外の形式のメッセージは解析されません。デフォルトの形式は、次のとおりです。
oracle.adfmf.util.logging.ConsoleHandler.formatter=oracle.adfmf.util.logging.PatternFormatter
oracle.adfmf.util.logging.PatternFormatter.pattern=[%LEVEL% - %LOGGER% - %CLASS% - %METHOD%] %MESSAGE%
ツールのページの上部の各コントロールの上にマウスを置くと、コントロールの機能の説明が表示されるので、画面に表示されるその他の手順に従い、ツールが表示するパフォーマンスに関する詳細を表示させます。
ツールは次の場所にMAFによりJARファイルにパッケージ化されます。
\jdeveloperInstall\jdev\extensions\oracle.maf\tools\PerformanceMonitorGraph.jar
次のコマンドを起動して、ツールを使用して収集したパフォーマンス・データをレンダリングします。
PathToJDK\java.exe –jar \jdeveloper\jdev\extensions\oracle.maf\tools\PerformanceMonitorGraph.jar PathToLogFileWithPerformanceData.txt –o OutputFileName
ここで、OutputFileName
はツールが生成するHTMLファイルのファイル名で、前述のコマンドを呼び出した場所から現在のディレクトリに書込みが行われます。ツール自体は.HTML
ファイル拡張子をファイル名に追加します。これを行う必要はありません。
出力ファイルは -o
または--output-file
のいずれかを使用して指定できます。
MAFアプリケーションでのWebサービス・コールの検査
MAFアプリケーションが、クライアント・データ・モデルの作成にデザインタイム・サポートを使用して構成されたRESTサービスにアクセスする場合は、再利用可能なアプリケーション機能を追加して、アプリケーションで行われるすべてのRESTコールのリクエストとレスポンスの詳細を表示できます。
クライアント・データ・モデルの詳細は、「MAFアプリケーションでのクライアント・データ・モデルの作成」を参照してください。アプリケーションにこの機能を追加するには、次のステップを実行します。