(57)【要約】【課題】性能データ収集処理の追加を容易に行うことができ、更にクライアントやリクエスト固有の問題があった場合に特定が容易となる。【解決手段】第１の性能データ収集プログラム１６は所定のログ出力を行うと共に、セッションＩＤ、リクエストＩＤをスレッド固有変数領域３１に格納する。第２の性能データ収集プログラム１７は、アプリケーションプログラム（Javaクラス１２）からの呼び出しに応じて、スレッド固有変数領域３１から取得したセッションＩＤ、リクエストＩＤに対応付けて関数の性能データをログ出力する。第２の性能データ収集プログラム１７と上記呼び出し処理を有するアプリケーションプログラム（Javaクラス１２）は、アスペクトコンパイルにより生成される。【選択図】図５
2009064125.tif 000002
【特許請求の範囲】
【請求項１】
任意のクライアントからの任意のリクエストに応じた処理を実行するサーバ装置であって、
任意のクライアントから任意のリクエストを受け付ける毎に、このリクエストに応じたセッションＩＤ、リクエストＩＤを所定の記憶領域に記憶すると共に、該セッションＩＤとリクエストＩＤとに対応付けて所定のログ情報を記録する第１の性能データ収集手段と、
前記リクエストに応じて所定の１以上の関数の処理を実行するアプリケーション実行手段と、
前記アプリケーション実行手段による前記各関数の処理実行時に、前記所定の記憶領域から前記セッションＩＤ、リクエストＩＤを取得して、該セッションＩＤとリクエストＩＤとに対応付けて前記各関数の処理実行に係る所定の性能データを記録する第２の性能データ収集手段と、
を有することを特徴とするサーバ装置。
【請求項２】
前記第２の性能データ収集手段と前記アプリケーション実行手段を実現させるプログラムは、所定のログ出力処理と任意の各ログ出力対象／ログ出力箇所とが記述されたアスペクトソースファイルと、前記関数の処理に係るアプリケーションプログラムとをアスペクトコンパイルすることで生成されることを特徴とする請求項１記載のサーバ装置。
【請求項３】
任意のデータ収集オン／オフ情報を設定させて記憶する第１の設定・記憶手段を更に有し、
前記第１又は第２の性能データ収集手段は、該データ収集オン／オフ情報を参照して、オフ設定である場合には前記ログ情報又は前記性能データの記録処理は実行しないことを特徴とする請求項１又は２記載のサーバ装置。
【請求項４】
前記アスペクトソースファイルには各レベル値に応じた複数種類のログ出力条件が記述され、
任意のレベル値を設定させて記憶する第２の設定・記憶手段を更に有し、
前記第２の性能データ収集手段は、該記憶されているレベル値に応じたログ出力条件に基づいて前記性能データの記録処理を実行することを特徴とする請求項２記載のサーバ装置。
【請求項５】
任意のクライアントからの任意のリクエストに応じた処理を実行するサーバ装置であって、
任意のクライアントから任意のリクエストを受け付ける毎に、このリクエストに応じたセッションＩＤ、リクエストＩＤを所定の記憶領域に記憶すると共に、該セッションＩＤとリクエストＩＤとに対応付けて所定のログ情報を記録する第１の性能データ収集手段と、
前記リクエストに応じて所定の１以上の関数の処理を実行すると共に、前記所定の記憶領域に記憶されている前記セッションＩＤとリクエストＩＤを取得し、該各関数の処理の実行に伴い所定の各タイミングで、該セッションＩＤとリクエストＩＤとに対応付けて前記各関数の処理実行に係る所定の性能データを記録するアプリケーション実行・性能データ収集手段と、
を有することを特徴とするサーバ装置。
【請求項６】
前記アプリケーション実行・ログ記録手段を実現させるプログラムは、所定のログ出力処理と任意の各ログ出力対象／ログ出力箇所とが記述されたアスペクトソースファイルと、前記関数の処理に係るアプリケーションプログラムとをアスペクトコンパイルすること
で、該アプリケーションプログラム中の前記各ログ出力対象／ログ出力箇所に該当する箇所に前記所定のログ出力処理が埋め込まれることで生成されることを特徴とする請求項５記載のサーバ装置。
【請求項７】
前記各関数の処理実行に係る所定の性能データは、該各関数の関数名、処理開始／終了日時であることを特徴とする請求項１〜６の何れかに記載のサーバ装置。
【請求項８】
任意のクライアントからの任意のリクエストに応じた処理を実行するサーバ装置のコンピュータを、
任意のクライアントから任意のリクエストを受け付ける毎に、このリクエストに応じたセッションＩＤ、リクエストＩＤを所定の記憶領域に記憶すると共に、該セッションＩＤとリクエストＩＤとに対応付けて所定のログ情報を記録する第１の性能データ収集手段と、
前記リクエストに応じて所定の１以上の関数の処理を実行すると共に、該各関数の処理の実行に伴い所定のタイミングで第２の性能データ収集手段を呼び出すアプリケーション実行手段と、
前記アプリケーション実行手段からの前記呼び出しに応じて、前記所定の記憶領域から前記セッションＩＤ、リクエストＩＤを取得して、該セッションＩＤとリクエストＩＤとに対応付けて前記各関数の処理実行に係る所定の性能データを記録する第２の性能データ収集手段、
として機能させる為のプログラム。
【請求項９】
任意のクライアントからの任意のリクエストに応じた処理を実行するサーバ装置のコンピュータを、
任意のクライアントから任意のリクエストを受け付ける毎に、このリクエストに応じたセッションＩＤ、リクエストＩＤを所定の記憶領域に記憶すると共に、該セッションＩＤとリクエストＩＤとに対応付けて所定のログ情報を記録する第１の性能データ収集手段と、
前記リクエストに応じて所定の１以上の関数の処理を実行すると共に、前記所定の記憶領域に記憶されている前記セッションＩＤとリクエストＩＤを取得し、該各関数の処理の実行に伴い所定の各タイミングで、該セッションＩＤとリクエストＩＤとに対応付けて前記各関数の処理実行に係る所定の性能データを記録するアプリケーション実行・性能データ収集手段、
として機能させる為のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、クライアントとサーバからなるシステムにおいて、クライアントからの要求に応じてサーバ上で実行されるアプリケーションプログラムの、関数単位の性能データ収集方式に関する。
【背景技術】
【０００２】
クライアントとサーバからなるシステムにおいて、サーバ上で動作するアプリケーションプログラムの応答が遅いなど性能に問題がある場合に、アプリケーションプログラムの性能（例えば、どの関数の処理に時間がかかっているのか等）を調べる方法としては、アプリケーションプログラムのソースプログラムに性能データ（上記関数の処理時間等）を収集する仕組みを組み込む方法が一般的であった。
【０００３】
図１７に、従来のシステム構成及び性能データ収集方式を示す。
図１７において、クライアント１００は、例えば一般ユーザが所有するパソコン等の汎用コンピュータであり、一般的なＯＳ１０２環境上でブラウザ等のクライアントプログラム１０１を実行することにより、不図示のＬＡＮ、インターネット等のネットワークを介してＷｅｂ／Ａｐサーバ７０にアクセスして任意の処理を要求する。
【０００４】
Ｗｅｂ／Ａｐサーバ７０は、Ｗｅｂサーバ／Ａｐ（アプリケーション）サーバであり、各種アプリケーションプログラムを実装し、クライアント１００からの要求（例えば任意のＵＲＬのホームページへのアクセス）に応じたアプリケーション実行を行い、例えばクライアント１００側のディスプレイにホームページの表示等を行わせる。
【０００５】
この各種アプリケーションは、ＪＳＰ／Ｓｅｒｖｌｅｔ７１、Ｊａｖａクラス７２より成る。尚、これら各種アプリケーションは、図示の通り、一般的なＪａｖａ実行環境上（ＯＳ７５、ＪａｖａＶＭ（Ｊａｖａ仮想マシン）７４、Ｓｅｒｖｌｅｔコンテナ７３）で実行されることになる。また、ＪＳＰは、Java Server Pagesの略である。
【０００６】
各種アプリケーションは、概略的には、ＪＳＰ／Ｓｅｒｖｌｅｔ７１が基本動作を行い、ＪＳＰ／Ｓｅｒｖｌｅｔ７１が必要なＪａｖａクラス７２を随時呼び出し、呼び出されたＪａｖａクラス７２のメソッド（関数）の処理が実行される。
【０００７】
上記ＪＳＰ／Ｓｅｒｖｌｅｔ７１、Ｊａｖａクラス７２より成る各種アプリケーションのうち任意のアプリケーション（特にＪａｖａクラス７２の各メソッド（関数））について、その性能データ（例えば各関数の処理時間等）収集を行いたい場合、開発用ＰＣ（パソコン）８０上で、まず、当該性能データ収集対象のアプリケーションのソースコードファイルを開いて、オペレータ等が手作業で、このソースプログラムに性能データ収集処理を追加・記述する（図１７上に示す（１））。続いて、この新たなソースコード８１（性能データ収集処理が追加記述されたソースコード）をコンパイルして実行モジュール８２（性能データ収集機能付き）を生成する（図１７上に示す（２））。
【０００８】
そして、Ｗｅｂ／ＡＰサーバ７０において、上記性能データ収集対象のアプリケーション（実行モジュール）を、上記性能データ収集機能付きの実行モジュール８２に入れ替える（図１７上に示す（３））。その後は、実行モジュール８２を実行することで、性能データ（各関数の処理時間等）収集処理も行われることになる。
【０００９】
尚、よく知られているように、Ｊａｖａにおけるメソッドは“関数”に相当するもので
あり、上記の通り関数と呼ぶ場合もある。また、概略的にはＪａｖａクラス７２をメソッド（関数）と見做してもよい。
【００１０】
また、特許文献１、特許文献２、特許文献３等に記載の従来技術がある。
特許文献１に記載の従来技術では、プログラム走行時間データとプロセッサ使用時間データとを、測定対象プログラムの１回の走行で求めることにより、データ作成効率の向上を図るものである。
【００１１】
特許文献２に記載の従来技術は、既存のアプリケーションプログラムに対して性能プロファイリングを目的としたアプリケーションプログラムの修正、再コンパイル及び再起動を行うことなく、性能プロファイリングを実施する為に、情報処理装置内の命令プロセッサに組み込まれているハードウェアモニタを備えることを特徴としている。ハードウェアモニタは、指定されたＣＰＵ内部でのイベントを検出してカウントし、カウント値が閾値を超えた場合に割り込みを発生する機能を備える。そして、この割り込みに応じて、割り込み発生時点で実行していた関数名等が求められる。
【００１２】
特許文献３に記載の従来技術は、複数のトランザクションを並行処理する際のボトルネックについて、その発生箇所の特定を可能にするボトルネック検出システム等を提供することを目的としている。その為に、まず、ＯＳ  ｋｅｒｎｅｌ内にはカーネル・プローブ、ソフトウェア部品内にはアプリケーション・プローブが内蔵されている。カーネル・プローブは、ＣＰＵ使用開始／終了処理を行う部分に設置されている。アプリケーション・プローブは、各ソフトウェア部品が実行するトランザクション処理の開始部分と終了部分に設置されている。そして、トレーサが、これら各プローブから、ソフトウェア実行状況に関する情報を受け取って記録する。
【特許文献１】特開平８−１５３０２６号公報
【特許文献２】特開２００５−２１５８１６号公報
【特許文献３】特開２００６−２２７９９９号公報
【発明の開示】
【発明が解決しようとする課題】
【００１３】
上述した図１７に示す従来技術では、以下の課題が発生していた。
（１）各アプリケーションプログラムのソースコードにそれぞれ手作業で性能データ収集のための仕組みを組み込み、実行モジュールを生成し、実行モジュールを入れ替える必要があるため、作業効率が悪い。何らかの問題が生じてから上記実行モジュール生成・入れ替え作業開始すると、実際に性能データが収集できる状態になるまで時間が掛かり、これより収集したデータに基づいて原因を特定できるまでの時間も掛かることになる。
【００１４】
（２）アプリケーションプログラム毎に処理時間収集のための仕組みを組み込む必要がある為、その分の作業工数が余計に掛かる。特に、性能データ収集対象となるアプリケーションが多い場合には、非常に時間が掛かることになり、手間が掛かる。
【００１５】
（３）異なるクライアント（ブラウザ）や、複数のリクエストから同じ関数が呼ばれたときに、リクエストに対応した関数の処理時間が把握できないため、クライアントやリクエスト固有の問題があった場合に特定が困難であった。
【００１６】
本発明の課題は、任意のJavaアプリケーションに関する性能データ収集処理の追加を容易に行うことができ、更にクライアント／リクエスト毎の性能データ収集が行えることでクライアントやリクエスト固有の問題があった場合に特定が容易となるサーバ装置、そのプログラム等を提供することである。
【課題を解決するための手段】
【００１７】
本発明のサーバ装置は、任意のクライアントからの任意のリクエストに応じた処理を実行するサーバ装置であって、任意のクライアントから任意のリクエストを受け付ける毎に、このリクエストに応じたセッションＩＤ、リクエストＩＤを所定の記憶領域に記憶すると共に、該セッションＩＤとリクエストＩＤとに対応付けて所定のログ情報を記録する第１の性能データ収集手段と、前記リクエストに応じて所定の１以上の関数の処理を実行するアプリケーション実行手段と、前記アプリケーション実行手段による前記各関数の処理実行時に、前記所定の記憶領域から前記セッションＩＤ、リクエストＩＤを取得して、該セッションＩＤとリクエストＩＤとに対応付けて前記各関数の処理実行に係る所定の性能データを記録する第２の性能データ収集手段とを有する。
【００１８】
上記サーバ装置では、上記任意のクライアントからの任意のリクエストに応じたセッションＩＤとリクエストＩＤとに対応付けて、各関数の性能データ等が記録される。よって、この記録を参照／分析すれば、各セッション・リクエスト毎の関数の性能データ（処理時間等）が把握できるようになる。例えば同じ関数であっても、特定のセッション・リクエストに対応するものの性能データのみが悪ければ、この特定のセッション・リクエストに固有の何らかの問題があることが推測できる。
【００１９】
また、上記サーバ装置において、例えば、前記第２の性能データ収集手段と前記アプリケーション実行手段を実現させるプログラムは、所定のログ出力処理と任意の各ログ出力対象／ログ出力箇所とが記述されたアスペクトソースファイルと、前記関数の処理に係るアプリケーションプログラムとをアスペクトコンパイルすることで生成される。
【００２０】
各アプリケーションプログラム毎に、逐一、必要な箇所にログ出力処理を追加するような手間が掛かることは必要なく、１つのアスペクトソースファイルを作成すれば済む。
また、上記サーバ装置において、例えば、任意のデータ収集オン／オフ情報を設定させて記憶する第１の設定・記憶手段を更に有し、前記第１又は第２の性能データ収集手段は、該データ収集オン／オフ情報を参照して、オフ設定である場合には前記ログ情報又は前記性能データの記録処理は実行しないようにすることもできる。
【００２１】
あるいは、例えば、前記アスペクトソースファイルには各レベル値に応じた複数種類のログ出力条件が記述され、任意のレベル値を設定させて記憶する第２の設定・記憶手段を更に有し、前記第２の性能データ収集手段は、該記憶されているレベル値に応じたログ出力条件に基づいて前記性能データの記録処理を実行するようにすることもできる。
【００２２】
あるいは、上記サーバ装置と同様の処理を実現する他の形態のサーバ装置として、例えば、任意のクライアントからの任意のリクエストに応じた処理を実行するサーバ装置であって、任意のクライアントから任意のリクエストを受け付ける毎に、このリクエストに応じたセッションＩＤ、リクエストＩＤを所定の記憶領域に記憶すると共に、該セッションＩＤとリクエストＩＤとに対応付けて所定のログ情報を記録する第１の性能データ収集手段と、前記リクエストに応じて所定の１以上の関数の処理を実行すると共に、前記所定の記憶領域に記憶されている前記セッションＩＤとリクエストＩＤを取得し、該各関数の処理の実行に伴い所定の各タイミングで、該セッションＩＤとリクエストＩＤとに対応付けて前記各関数の処理実行に係る所定の性能データを記録するアプリケーション実行・性能データ収集手段とを有するものであってもよい。
【発明の効果】
【００２３】
本発明のサーバ装置、そのプログラム等によれば、任意のJavaアプリケーションに関する性能データ収集処理の追加を容易に行うことができ、更にクライアント／リクエスト毎の性能データ収集が行えることでクライアントやリクエスト固有の問題があった場合に、
原因の特定が容易となる。
【発明を実施するための最良の形態】
【００２４】
以下、図面を参照して本発明の実施の形態について説明する。
図１に、本例のクライアントとサーバからなるシステムのシステム構成図を示す。
図１において、クライアント１００は、上記従来のクライアント１００と同じであってよく（ブラウザ搭載の一般ユーザのパソコン等）、同一符号を付し、説明は省略する。
【００２５】
図示のＷｅｂ／Ａｐサーバ１０は、上記従来のＷｅｂ／Ａｐサーバ７０と同様に、一般的なＪａｖａ実行環境上（ＯＳ１５、ＪａｖａＶＭ（Ｊａｖａ仮想マシン）１４、Ｓｅｒｖｌｅｔコンテナ１３）で、各種アプリケーションが実行されることになる。各種アプリケーションプログラムは、ＪＳＰ／Ｓｅｒｖｌｅｔ１１、Ｊａｖａクラス１２等より成る。従来で説明したように、ＪＳＰ／Ｓｅｒｖｌｅｔ１１が各Ｊａｖａクラス１２を呼び出すものであり、各Ｊａｖａクラス１２は１以上のメソッド（関数）を実行するものであり、概略的にはＪａｖａクラス１２をメソッド（関数）と見做してもよい。
【００２６】
そして、本例の構成では、Ｗｅｂ／Ａｐサーバ１０は、更に、第１の性能データ収集プログラム１６と第２の性能データ収集プログラム１７を有する。
尚、第１の性能データ収集プログラム１６と第２の性能データ収集プログラム１７（その他、ＪＳＰ／Ｓｅｒｖｌｅｔ１１、Ｊａｖａクラス１２等の他の各種プログラムも）は、例えば後述する図１６に示す記憶部２０５等に格納されており、これをＣＰＵ２０１が読み出し・実行することにより、所定の機能・動作を実現するものであり、以下、特に逐一断らないが、当然、以下の説明における各種プログラムに係る機能・動作の説明は、これら各種プログラムがＣＰＵ２０１等の演算プロセッサにより実行されることにより実現される機能・動作を説明しているものである。
【００２７】
第１の性能データ収集プログラム（Servletフィルタ）１６は、Javaのサーバアプリケーション形態の一つであるServletフィルタプログラムであり、Servlet やJSPの実行環境であるServletコンテナ１３上で動作する。本プログラムは、アプリケーションプログラムとは別物であり、アプリケーションプログラムの実行環境に配備して利用する。
【００２８】
そして、第１の性能データ収集プログラム１６は、詳しくは後述するように、任意のクライアント１００からの任意のリクエストが受信される毎に（更に、その応答毎に）、セッションID、リクエストID、スレッド名、日付時刻情報（現在日時）等を取得して、ログファイルに記録する。また、リクエスト受信時に、上記セッションID、リクエストIDを、所定の記憶領域に記憶して、この記憶領域を介することで、第２の性能データ収集プログラム（Javaクラス）１７に渡す。
【００２９】
第２の性能データ収集プログラム（Javaクラス）１７は、当該プログラム実行毎に、上記所定の記憶領域を参照する等して上記セッションID、リクエストIDを取得し、更にスレッド名、日付時刻情報、メソッド名（関数名）等を取得して、これらをログファイルに記録する。
【００３０】
第２の性能データ収集プログラム（Javaクラス）１７は、例えば後述する図５のように、実行中のアプリケーションプログラム（Ｊａｖａクラス１２）から任意のタイミングで呼び出されることで実行される。この呼び出しタイミングは、例えば任意のログ出力対象のメソッド（関数）の実行時（例えばその開始／終了時等）等となっている。これにより、例えば、実行された関数の日付時刻情報（関数の実行開始／終了時刻等）や関数名等に、この関数実行に係るクライアント・リクエストを示すセッションID、リクエストIDが対応付けられて、ログファイルに記録されることになる。
【００３１】
上記のように、アプリケーションプログラム（Ｊａｖａクラス１２）には任意のタイミングでの呼び出し処理が含まれているが、これは最初から存在するわけでなく、必要に応じて追加される。つまり、呼び出し処理を有するアプリケーションプログラム（Ｊａｖａクラス１２）は、必要に応じて、第２の性能データ収集プログラム（Javaクラス）１７と共に生成される。この生成処理は、従来のように手間が掛かるものではなく、以下に説明するように容易に生成できる。尚、後述するように、アプリケーションプログラム（Ｊａｖａクラス１２）内に実質的に第２の性能データ収集プログラム（Javaクラス）１７が含まれる形態であってもよい。
【００３２】
以下、上記アプリケーションプログラム（Ｊａｖａクラス１２）及び第２の性能データ収集プログラム（Javaクラス）１７の生成処理について説明する。
アプリケーションプログラム（Ｊａｖａクラス１２）及び第２の性能データ収集プログラム（Javaクラス）１７は、アプリケーションプログラムのバイトコードと、当該アプリケーションプログラム内の任意のログ出力対象関数、当該関数内のログ出力箇所（例：関数開始点、関数終了点）、および所定のログ出力処理を記述したアスペクトプログラムのソースファイルとを、アスペクトコンパイラによりコンパイルすることで生成される。尚、アスペクトプログラムとは、所謂“アスペクト指向プログラミング”（略してＡＯＰと呼ばれる）手法に係るプログラムである。ＡＯＰとは、端的に言えば、システムに渡って横断的に要求される機能を、一箇所に「アスペクト」としてまとめておくプログラミング手法のことである。よって、上記アスペクトプログラムは、複数の各アプリケーションプログラムに共通的な処理（例：ログ出力処理等）が記述されたものである。
【００３３】
以下、図２を参照して、上記第２の性能データ収集プログラム（Javaクラス）１７等の生成方法について説明する。
上記第２の性能データ収集プログラム（Javaクラス）１７（及び各Ｊａｖａクラス１２）は、図２に示すアプリケーションプログラムのバイトコード（.classファイル）２２（以下、アプリケーションプログラム２２と記す）と、アスペクトプログラムのソースファイル（.ajファイル）２１（以下、アスペクトソースファイル２１と記す）とを、アスペクトコンパイラ２０によりコンパイルする（以下、アスペクトコンパイルという）ことで生成される。アスペクトソースファイル２１には、アプリケーションプログラム２２のログ出力対象関数、関数内のログ出力箇所（例：関数開始点、関数終了点）、およびログ出力処理が、プログラマ等によって記述されている。
【００３４】
そして、アスペクトコンパイラ２０によるコンパイルの結果として、図２に示す（３）アスペクトプログラム（.classファイル）２３と（４）アプリケーションプログラム（.classファイル）２４とが生成される。このアスペクトプログラム（.classファイル）２３が上記図１に示す第２の性能データ収集プログラム（Javaクラス）１７に相当し、アプリケーションプログラム（.classファイル）２４がＪａｖａクラス１２（呼び出し処理付）に相当する。
【００３５】
尚、アプリケーションプログラム２２はアスペクトコンパイル前のアプリケーションプログラム（Ｊａｖａクラス１２）であり、これに、上記アスペクトコンパイルによって、アスペクトソースファイル２１に記述されている各ログ出力対象関数の各ログ出力箇所に、第２の性能データ収集プログラム（Javaクラス）１７の呼び出し処理が挿入されることになり、これが上記アプリケーションプログラム（.classファイル）２４である。
【００３６】
上記アスペクトコンパイラ２０によるコンパイル前後のソースファイル／プログラムに関して、以下にまとめて説明する。
（１）アスペクトソースファイル（.ajファイル）２１；
アプリケーションプログラム２２の各関数のうちの特定のログ出力対象関数、このログ出力対象関数に係るログ出力箇所（例：関数開始点、関数終了点）、および所定のログ出力処理を記述したソースファイル。Javaに似た言語にて記述する。
【００３７】
（２）アプリケーションプログラム（.classファイル）２２；
アプリケーションソースファイルをJavaコンパイラでコンパイルしたバイトコード。従来のJavaクラス７２（但し、処理時間収集処理無しのバージョン）に相当する。
【００３８】
（３）アスペクトプログラム（.classファイル）２３；
アスペクトソースファイル２１をアスペクトコンパイルした結果生成される、上記第２の性能データ収集プログラム（Javaクラス）１７である。アスペクトソースファイル２１内で定義された各ログ出力対象関数内の各ログ出力箇所でアプリケーションプログラム（.classファイル）２４が呼び出しを行うことで、ログ出力処理を行う。つまり、アスペクトプログラム（.classファイル）２３自体は、基本的に、上記所定のログ出力処理を行うだけである。
【００３９】
所定のログ出力処理とは、後述する図５のログファイル４１へのログデータ出力処理であり、このログデータ（性能データ）の具体例は例えば図８に示してある。
（４）アプリケーションプログラム（.classファイル）２４；
アプリケーションプログラム２２に対しアスペクトコンパイルを行うことで、例えば図４（ｂ）に示すように各ログ出力箇所に上記アスペクトプログラム（.classファイル）２３の呼び出し処理が埋め込まれたプログラム。
【００４０】
上記のように生成したアスペクトプログラム（.classファイル）２３及びアプリケーションプログラム（.classファイル）２４を、例えば図３に示すようにアプリケーション実行環境に配備、置き換えすることで（上記の通り、これらプログラム２３，２４は、第２の性能データ収集プログラム（Javaクラス）１７、Ｊａｖａクラス１２に相当する）、アプリケーションプログラムの性能データの収集が可能になる。
【００４１】
尚、図１〜図３に示すものは、一例であり、この例に限るものではない。すなわち、公知のように、上記“アスペクト指向プログラミング”手法に係るコンパイラでは、アスペクトプログラムとアプリケーションプログラムとを統合することも可能である。この場合、アスペクトコンパイル処理によって、例えば図４（ａ）に示すように、アプリケーションプログラム２２中にアスペクトプログラム２３が埋め込まれた形式の１つのプログラムが生成されることになる。アスペクトプログラム２３が埋め込まれる位置は、当然、アスペクトソースファイル（.ajファイル）２１で記述されている、上記各ログ出力対象関数に係る各ログ出力箇所（例えば関数の開始／終了時点）である。この場合も、埋め込まれるアスペクトプログラム２３自体は、上記所定のログ出力処理を実行するものである。
【００４２】
一方、本説明で用いる例では、上述した通り、２つのプログラムが１つに統合されることはなく、アスペクトプログラム（.classファイル）２３及びアプリケーションプログラム（.classファイル）２４が生成される。そして、アプリケーションプログラム（.classファイル）２４は、図４（ｂ）に示すように、コンパイル前のアプリケーションプログラム（.classファイル）２２中に、アスペクトプログラム（.classファイル）２３を呼び出す処理が埋め込まれたものとなる。この呼び出し処理が埋め込まれる位置は、当然、アスペクトソースファイル（.ajファイル）２１で記述されている、上記ログ出力箇所等である。そして、呼び出されたアスペクトプログラム（.classファイル）２３は、上記所定のログ出力処理を実行することになる。
【００４３】
尚、よく知られているように、一つの「クラス」は通常、１以上の「メソッド（関数）
」を有しており、例えば全ての「クラス」を上記アプリケーションプログラム２２とし、アスペクトソースファイル（.ajファイル）２１で指定された関数を有する「クラス」には、当該関数の実行箇所に呼び出し処理が埋め込まれるようにしてもよいし、アスペクトソースファイル（.ajファイル）２１で指定された「クラス」のみを上記アプリケーションプログラム２２としてアスペクトコンパイラ２０に入力させるようにしてもよい。
【００４４】
図５は、本例のクライアントとサーバからなるシステム全体の動作を示す図である。
Ｗｅｂ／Ａｐサーバ１０は、任意のクライアント１００（ブラウザ等）から送られてくる任意のリクエストを受信すると、まず、第１の性能データ収集プログラム（Servletフィルタ）１６が、詳しくは後述する図６の処理によって得たセッションＩＤとリクエストＩＤを、主記憶装置３０内のスレッド固有の変数領域３１に格納する。尚、言うまでもないが、セッションＩＤは各セッションを識別する識別コードであり、リクエストＩＤは各リクエストに対し一意となるＩＤであり、スレッド固有の変数領域３１は各スレッド毎に割り当てられる変数領域である。
【００４５】
第１の性能データ収集プログラム（Servletフィルタ）１６は、更に、詳しくは後述する図６の処理によって、更に、日付時刻情報、スレッド名、処理の開始／終了情報、アクセスＵＲＬ等の各種情報を取得して、これら取得した情報を上記セッションＩＤ、リクエストＩＤに対応付けて、例えば補助記憶装置４０（ハードディスク等）内のログファイル４１に書き込む。
【００４６】
上記第１の性能データ収集プログラム（Servletフィルタ）１６による処理に続いて、上記受信したリクエストに応じたＪａｖａアプリケーション（ＪＳＰ／Ｓｅｒｖｌｅｔ１１、Ｊａｖａクラス１２）が実行されることになる。（ＪＳＰ／Ｓｅｒｖｌｅｔ１１が実行され、当該スレッドから呼び出された各関数が実行される。）
そして、任意のＪａｖａクラス１２が実行されるとき、このＪａｖａクラス１２が上記呼び出し処理が埋め込まれたものである場合には、この呼び出し処理が実行されることで呼び出されたアスペクトプログラム（.classファイル）２３（第２の性能データ収集プログラム（Javaクラス）１７）が実行されることになる。
【００４７】
この呼び出しタイミングは、ユーザ等が上記ソースプログラムで任意に指定しているものであり、例えば関数の実行開始時／終了時等であり、ここではこの例を用いて説明する。
【００４８】
呼び出された第２の性能データ収集プログラム（Javaクラス）１７は、詳しくは後述する図７の処理を実行することで、当該スレッド固有の変数領域３１に格納されている上記セッションＩＤ、リクエストＩＤや、日付時刻情報、スレッド名、処理の開始／終了情報、アクセスＵＲＬ等の各種情報を、例えば補助記憶装置４０（ハードディスク等）内のログファイル４１に書き込む。
【００４９】
尚、上記各種処理は、一旦、主記憶装置３０内に記憶しておき、リクエストによる一連の処理（リクエストに応じて呼び出される全関数の実行）が完了したタイミングで、主記憶装置３０から補助記憶装置４０上のログファイル４１に出力するようにしてもよい。
【００５０】
以下、図６、図７を参照して、上記第１、第２の性能データ収集プログラムによって実行される処理について説明する。
上記の通り、図６は第１の性能データ収集プログラム（Servletフィルタ）１６の処理フローチャート図であり、図７は第２の性能データ収集プログラム（Javaクラス）１７の処理フローチャート図である。
【００５１】
まず、図６に示す処理について説明する。
図６に示すように、第１の性能データ収集プログラム（Servletフィルタ）１６は、任意のクライアントから任意のリクエストを受信する毎に（ステップＳ１１）、まず、当該Ａｐサーバが自動的に割り当てるセッションＩＤと、当該リクエストの通過時に当該プログラム（Servletフィルタ）がプログラム内でカウント／生成するリクエストＩＤとを、上記スレッド固有の変数領域３１に格納する（ステップＳ１２）。また、Ｊａｖａ内部で付与されるスレッド名を取得する（ステップＳ１３）。更に、現在日時（あるいは上記リクエストを受信した時点）を示す日付時刻情報等を、Ｗｅｂ／Ａｐサーバ１０内の不図示のシステムクロック等から取得する（ステップＳ１４）。
【００５２】
そして、上記各処理により取得した各種情報、すなわち現在の日付時刻情報、セッションＩＤ、リクエストＩＤ、スレッド名と、更に、処理の開始／終了情報、アクセスＵＲＬを、ログファイル４１に書き込む（ステップＳ１５）。
【００５３】
尚、処理の開始／終了情報は、単に、任意のリクエストに応じた処理の開始時点か終了時点かを示す情報であり、リクエスト受信時には当然“開始”となる。尚、リクエストに応じた一連の処理が終了してクライアントにレスポンスを返す際にも、第１の性能データ収集プログラム（Servletフィルタ）１６は図６の処理を実行するものであり、その際には処理の開始／終了情報は当然“終了”となる。また、尚、アクセスＵＲＬは、リクエストされた（アクセス先の）ホームページ等のＵＲＬである。
【００５４】
次に、図７の処理について以下に説明する。
尚、図７に示す各ステップの処理のうち、第２の性能データ収集プログラム（Javaクラス）１７自体によって実行される処理は、ステップＳ２４〜Ｓ２７であると見做してもよい。すなわち、ステップＳ２１〜Ｓ２３の処理は、任意の第２の性能データ収集プログラム（Javaクラス）１７が呼び出されるまでの処理を意味すると見做してもよい。つまり、ＪＳＰ／Servlet１１が任意のＪａｖａクラス１２を呼出す毎に（ステップＳ２１）、このＪａｖａクラス１２にログ出力対象関数がない場合（ステップＳ２２，ＮＯ）、すなわち上記アスペクトコンパイルにより呼び出し処理が全く埋め込まれていない場合には、当然、第２の性能データ収集プログラム（Javaクラス）１７が呼び出されることはなく、このＪａｖａクラス１２の処理が実行されるだけである。
【００５５】
一方、ログ出力対象関数がある場合には（ステップＳ２２，ＹＥＳ）、このログ出力対象関数の実行に伴って、上記ログ出力箇所（関数実行開始／終了時等）に埋め込まれている呼び出し処理が実行される毎に（ステップＳ２３，ＹＥＳ）、呼び出された第２の性能データ収集プログラム（Javaクラス）１７がステップＳ２４〜Ｓ２７の処理を実行することになる。
【００５６】
すなわち、まず、当該スレッドに対応する上記スレッド固有変数領域３１に記憶されている上記セッションＩＤ、リクエストＩＤを取得し（ステップＳ２４）、Ｊａｖａ内部で付与されるスレッド名を取得する（ステップＳ２５）。更に、現在日時（あるいは上記呼び出しを受けた時点等）の日付時刻情報等を、Ｗｅｂ／Ａｐサーバ１０内の不図示のシステムクロックから取得する（ステップＳ２６）。
【００５７】
そして、上記各処理で取得した各種情報、すなわち現在の日付時刻情報、セッションＩＤ、リクエストＩＤ、スレッド名と、更に、処理の開始／終了情報、アクセスＵＲＬ、（呼び出し元の）関数名を、当該関数の性能データとしてログファイル４１に書き込む（ステップＳ２７）。
【００５８】
尚、開始／終了情報や（呼び出し元の）関数名は、呼び出し処理の際にパラメータとし
て渡してもよいし、他の方法であってよい。
上述した処理により、任意のクライアント（セッション）からの任意のリクエストに応じた全てのログ出力対象関数に関する上記性能データには、同一のセッションＩＤ及びリクエストＩＤが格納されていることになり、後に、収集した性能データを分析する際に、例えば各リクエストによる同じ関数に係る処理時間を一覧表示して、他と比較して処理時間が非常に長いものがあった場合に、この関数の性能データに含まれるセッションＩＤ及びリクエストＩＤから、そのクライアントやリクエスト固有の問題があることが推定できる等、クライアントやリクエスト固有の問題があった場合に特定が容易となる
図８に、上記ログファイル４１の格納データ形式の一例を示す。
【００５９】
図示の例では、ログファイル４１のテーブル５０（以下、性能データ５０とも言う）は、年月日時分秒．ミリ秒５１、ログレベル５２、セッションＩＤ５３、リクエストＩＤ５４、スレッド名５５、開始／終了５６、ＵＲＬ５７、実行メソッド情報５８等の各データ項目より成る（尚、図示の「備考・参考情報」はここでは関係ない）。
【００６０】
年月日時分秒．ミリ秒５１には、上記現在の日付時刻情報が格納される。この例のように、日付時刻情報は、年月日時分秒に加えてミリ秒単位まであり、ここではミリ秒は３桁となっている。
【００６１】
ログレベル５２は常に“ＤＥＢＵＧ”とするが、ここでは特に関係ない。
セッションＩＤ５３、リクエストＩＤ５４、スレッド名５５、開始／終了５６、ＵＲＬ５７には、それぞれ上記セッションＩＤ、リクエストＩＤ、スレッド名、処理の開始／終了情報、アクセスＵＲＬが格納される。
【００６２】
実行メソッド情報５８には、上記呼び出し元の関数名（メソッド名）が格納される。よって、図６の処理の際には何も格納されない。
図９に、上記図８に示すテーブル５０（性能データ５０）の具体例を示す。
【００６３】
図示の通り、ログファイル４１には、任意の同一のセッションＩＤ及びリクエストＩＤの組み合わせ毎に、この同一のセッションＩＤ及びリクエストＩＤによるＵＲＬ５７（ここでは省略して示す）へのアクセスに応じて実行された、すなわち任意のクライアント（ブラウザ）からの任意のリクエストに応じて実行された一連の関数処理等のログデータ（性能データ５０）が、書き込まれた順番通りに（ログ出力処理実行順に）格納されている。
【００６４】
また、同図の例では、実行メソッド情報５８として、α、βが格納されており、これはメソッド名（関数名）α、βの２つの関数が、セッションＩＤ＝‘1122’及びリクエストＩＤ＝‘３’によるＵＲＬ５７（ここでは省略して示す）へのアクセスに応じて実行されたことを意味する。そして、各関数α、βの実行開始時、終了時等にそれぞれログ出力されており、これに応じて各関数毎に、開始／終了５６が「開始」、「終了」の２つのレコードが記録されている。
【００６５】
また、図示の一連のレコードの最初と最後のレコードには、実行メソッド情報５８（関数名）が記録されていないが、これは、上記第１の性能データ収集プログラム（Servletフィルタ）１６による上記ＨＴＴＰリクエスト受付時及び応答時のログ出力処理によって記録されたレコードであることを意味する。この第１の性能データ収集プログラム（Servletフィルタ）１６による上記ＨＴＴＰリクエストの受付及び応答に係る処理を「リクエスト受付・応答処理」と呼ぶものとする。従って、この一例では、ログファイル４１には、任意の同一のセッションＩＤ及びリクエストＩＤの組み合わせ毎に、「リクエスト受付・応答処理」に係るレコードと、各関数実行（開始／終了）に係るレコードとが記録され
ることになる（例えば、ログ記録処理の際に、セッションＩＤ及びリクエストＩＤをキーにしてログファイル４１を検索して、該当するレコード群の最後に新たなレコードを追加すればよい）。
【００６６】
尚、図９では、日付時刻情報（年月日時分秒．ミリ秒５１）は、年月日時は省略し、分秒．ミリ秒のみ示してある。また、上記の通りＵＲＬ５７の具体例は省略してある。
上述した本システムのサーバ１０等によれば、アプリケーションプログラムの各ソースコード毎に逐一、処理時間収集のための仕組みを組み込んだり、モジュールを入れ替える必要がなくなり、任意のJavaアプリケーションに関する性能データ収集処理の追加を容易に行うことができる。
【００６７】
更に、複数のクライアント、リクエストから同じ関数が呼ばれた場合であっても、クライアント、リクエストに対応した関数の処理時間を収集することができる。あるいは、各クライアント・リクエスト毎の処理全体に掛かった時間等も分かる。これより、後に収集したデータを解析することで、例えば、各クライアント・リクエスト毎の処理全体の時間や、各クライアント・リクエスト毎の各関数毎の処理時間等が分かる。これより、例えば同一の関数における各リクエストごとの処理時間を比較することで、特に処理時間が掛かっているものがあれば、そのクライアント・リクエスト固有の問題があること等が推測できる。
【００６８】
以下、上述した実施例の変形例として、変形例１、変形例２について説明するが、これら変形例は上述した実施例をベースとするものであるので、基本的に、上述した実施例との違いについてのみ説明する。
【００６９】
ここで、変形例１の説明において、上述した実施例との違いについて分かり易くする為に、まず、上述した実施例の動作を概略的に示す図面として図１０、図１１を示すものとし、以下、図１０、図１１について簡単に説明するものとする。
【００７０】
上記の通り、図１０は上述した実施例のＷｅｂ／Ａｐサーバ１０の動作を概略的に示す図であり、図１１はそのフローチャート図である。
図１０に示す動作は、既に説明してある通りであり、任意のクライアント１００のブラウザから任意のＨＴＴＰリクエストがあると、第１の性能データ収集プログラム（Servletフィルタ）１６が、セッション情報（セッションＩＤ、リクエストＩＤ）の記憶や、上記各種情報のログ出力を行う。そして、リクエストに応じたＪａｖａアプリケーションを実行させる。これにより、ＪＳＰ／Servlet１１は、各メソッド（Ｊａｖａクラス１２）を実行させ、Ｊａｖａクラス１２は上記呼び出し処理が挿入されているものである場合には、この呼び出し処理実行のタイミングで第２の性能データ収集プログラム（Javaクラス）１７を呼び出す。本例では、上記の通り、一例として、Ｊａｖａクラス１２（関数）の実行開始と終了時のタイミングで、呼び出し処理が実行されるものである。
【００７１】
これより、図示の通り、第２の性能データ収集プログラム（Javaクラス）１７は、Ｊａｖａクラス１２（関数）の実行開始と終了時のタイミングで、それぞれ、上記ログ出力処理を行うことになる。
【００７２】
そして、リクエストに応じたＪａｖａアプリケーション処理が全て終了したら、第１の性能データ収集プログラム（Servletフィルタ）１６は、レスポンス通過の際に、上記ログ出力を行う。更に、セッション情報を解除する。すなわち、上記スレッド固有変数領域３１に格納したセッション情報を消去する。
【００７３】
図１１は、図１０に対応する概略的な処理フローチャート図である。よって、必ずしも
実際の動作と一致するものではないが（実際の動作は図５、図６、図７等で既に説明してある）、以下、簡単に説明するものとする。
【００７４】
図１１において、任意のリクエストを受信すると（ステップＳ３１）、生成されるセッションＩＤ、リクエストＩＤを上記スレッド固有変数領域３１に格納し、当該リクエストに応じた関数（Ｊａｖａクラス１２）が実行される毎に（ステップＳ３３）、上記の例では関数処理開始時（ステップＳ３４，ＹＥＳ）及び終了時（ステップＳ３６，ＹＥＳ）にそれぞれ、上記各種情報（セッションＩＤ、リクエストＩＤ、日付時刻情報等）を取得して（ステップＳ３５，Ｓ３７）、ログファイル４１に書き込む（ステップＳ３９）。
【００７５】
以下、上記図１０、図１１の動作を比較の為に参照しつつ、まず、変形例１について説明する。
変形例１については、図１２、図１３を参照して説明する。
【００７６】
変形例１では、予め又は運用中の任意のときに、ユーザ（運用管理者等）が例えば不図示のオン／オフ設定用のソフトウェアを用いて、例えば不図示のオン／オフ設定画面上で所望のオン／オフ設定を行う。このオン／オフ設定情報は、上記オン／オフ設定用ソフトウェアによって、例えば主記憶装置３０上の所定の記憶領域に記憶される。
【００７７】
そして、上記設定されたオン／オフ情報を参照して、図１２、図１３の処理を実行する。
以下、図１２、図１３について説明するが、既に述べている通り、上記図１０、図１１と比較して異なる点についてのみ説明する。
【００７８】
図１２に示す通り、図示のステップＳ５１，Ｓ５２の処理が追加されている点が図１０の処理とは異なるので、この点についてのみ説明する。すなわち、第１の性能データ収集プログラム（Servletフィルタ）１６は、任意のクライアント１００のブラウザからの任意のＨＴＴＰリクエストを受け取ると、まず、上記所定の記憶領域に記憶されている性能データ収集のオン／オフ設定を参照して、オン設定である場合には（ステップＳ５１，ＹＥＳ）上述したセッション情報格納やログファイル４１への出力処理を実行し、オフ設定である場合には（ステップＳ５１，ＮＯ）これら処理は実行しない。これはリクエスト受信時だけでなくレスポンス時も同じである。
【００７９】
第２の性能データ収集プログラム（Javaクラス）１７も同様に、（図１２には特に示さないが）Ｊａｖａクラス１２からの呼び出しがあると、まず、上記設定されている性能データ収集のオン／オフ設定を参照して、オン設定である場合にのみ（ステップＳ５２，ＹＥＳ）上述したログファイル４１への出力処理を実行する。
【００８０】
尚、上記オン／オフ設定情報が記憶される所定の記憶領域は、例えば、後述する変形例２におけるレベル情報と同様、例えば後述する図１４に示すクラス変数領域６１等であってもよい。この場合には、後述する図１４の場合と同様、第１の性能データ収集プログラム（Servletフィルタ）１６は、クラス変数領域６１に記憶されているオン／オフ設定情報を参照するだけでなく、このオン／オフ設定情報をスレッド固有変数領域６２に格納することで、第２の性能データ収集プログラム（Javaクラス）１７がこの変数領域６２のオン／オフ設定情報を参照するようにしてもよい。勿論、この様な例に限るものではなく、第１の性能データ収集プログラム（Servletフィルタ）１６及び第２の性能データ収集プログラム（Javaクラス）１７が、オン／オフ設定情報を参照可能とするものであれば何でもよい。
【００８１】
また、図１３において、図１１と同一の処理ステップについては同一のステップ番号を
付してある。よって、図示の通り、ステップＳ３１の処理の後にステップＳ６１，Ｓ６２が追加されている点を除いては図１１の処理と同じであり、ステップＳ６１、Ｓ６２の処理についてのみ説明する。すなわち、ステップＳ６１は上記性能データ収集のオン／オフ設定を参照・取得する処理であり、オン設定の場合には（ステップＳ６２，ＹＥＳ）図１１と同様にステップＳ３２以降の処理を実行し、オフ設定の場合には（ステップＳ６２，ＮＯ）これら処理は行わずにそのまま本処理を終了する。
【００８２】
上記図１〜図１１で説明した実施例では、性能データ収集プログラムを組み込むことは容易に行えるようになるが、一旦組み込んだ後は常に性能データ収集が行われることになる。よって、当然、ログ出力処理が追加される分、サーバの負荷が増大することになる。
【００８３】
上記実施例による性能データ収集プログラムを組み込みは、アプリケーションプログラムの検証（デバッグ）時に行うものとし、運用前には元も戻すことで、運用中にはログ出力が行われないようにすることも考えられるが、運用中にも例えば処理時間の劣化が見られるような場合等、必要に応じて性能データ収集を行いたい場合もある。しかしながら、その為に運用中に常に性能データ収集プログラムを組み込んだ状態とすることは、上記の通りサーバの負荷が大きい。この為、必要になったときにその都度、性能データ収集プログラムを組み込み、必要が無くなったら元に戻すことも考えられるが、この様に必要になる都度組み込み作業を行うのでは、手間が掛かることになり、作業効率が悪化する。
【００８４】
上述した変形例１では、この様な問題を解決することができ、必要なときにだけ性能データ収集が行われるようにでき、オペレータ等は単にオン／オフ設定を行うだけで済み、手間が掛からなくなる。
【００８５】
次に、以下、変形例２について説明する。
図１４は、変形例２におけるＷｅｂ／Ａｐサーバ１０の動作を示す図である。
以下、図５に示す動作とは異なる点についてのみ説明する。
【００８６】
図１４に示すＷｅｂ／Ａｐサーバ１０では、主記憶装置３０上の第１の性能データ収集プログラム１６（Servletフィルタ）のクラス変数領域６１に、レベル情報が記憶される。
【００８７】
このクラス変数領域６１に記憶されるレベル情報は、例えば後述する図１５に示す“レベル１”、“レベル２”等である。その意味で、図では“レベル情報”と記しているが、実際のレベル情報のレベル値といえる情報であるので、以下、“レベル値”と呼ぶものとし、実際のレベル情報とは区別するものとする。尚、実際のレベル情報は、後述するように（例えば図１５参照）、予め各レベル値毎のレベル情報が、アスペクトソースファイル中に記述されている。
【００８８】
尚、初期レベル値は、第１の性能データ収集プログラム１６（Servletフィルタ）のソースファイル内で定義されており、運用中には、上記変形例１と同様に、ユーザが、不図示のレベル設定用のＪａｖａプログラムによって、クラス変数領域６１に格納されているレベル値を変更することが可能である。
【００８９】
第１の性能データ収集プログラム１６（Servletフィルタ）は、上記ログ出力処理（セッションＩＤ等の各種情報をログファイル４１に書き込む処理）を実行すると共に、クラス変数領域６１からレベル値を取得して、これをセッションＩＤ、リクエストＩＤと共にスレッド固有変数領域６２に格納する。
【００９０】
そして、上述したようにＪａｖａクラス１２の呼出し処理により呼び出された第２の性
能データ収集プログラム（Javaクラス）１７は、スレッド固有変数領域６２を参照することで上記の通りセッションＩＤ、リクエストＩＤを取得すると共に、本変形例２においては上記レベル値を取得する。そして、取得したレベル値のレベル情報に応じたログ出力処理を行う（換言すれば、呼び出されてもログ出力処理を行わない場合がある）。
【００９１】
ここで、図１５に、レベル情報の一例を示す。
上記の通り、レベル情報は、各レベル値毎に規定されているものであり、簡単の為、図示の例ではレベル１、レベル２の２つのレベル値の各レベル情報を示す。
【００９２】
本変形例２では、図１５に示すように、各レベル値毎のレベル情報（ログ出力対象、ログ出力箇所等）が、アスペクトプログラムのソースファイルに記述されており（ユーザ等が任意に記述する）、アスペクトコンパイルを行うことでアスペクトプログラム（第２の性能データ収集プログラム１７）にこれらのレベル情報が埋め込まれる。これらは、所謂アスペクト指向技術の一例であるAspectＪにおけるポイントカット及びアドバイスとして定義されるものである。
【００９３】
図示の例では、上記の通り、レベル情報は、性能データ収集対象とする関数、及びログ出力箇所（関数実行前、実行後など）を指定するものであり、ログ出力対象とログ出力箇所とからなる。そして、レベル１ではログ出力対象は「jp.co.fesys.＊」、ログ出力箇所は「関数実行前、実行後」となっている。これは、ログ出力対象がパッケージ“jp.co.fesys”に含まれる全てのクラス・関数であることを意味し、ログ出力箇所はこれら各クラス・関数の実行前、実行後であることを意味する。
【００９４】
また、図１５に示すレベル２では、ログ出力対象は「com.abc.＊」、ログ出力箇所は「関数呼出し時」である。これは、全てのパッケージ・クラスに含まれる全ての関数呼び出し時にログ出力を行うことを規定しているものである。
【００９５】
例えば、Ｊａｖａの場合、非常に多くのパッケージやクラスが集まって１つのアプリケーションとして動作するものである。つまり、よく知られているように、一つの「Ｊａｖａアプリケーションプログラム」は一つ以上の「パッケージ」から構成され、一つの「パッケージ」は一つ以上の「クラス」から構成され、一つの「クラス」は、複数の「属性（変数）」と、複数の「メソッド（関数）」で構成されている。このなかで性能データログ出力対象とするパッケージ、クラス名を指定し、更にログ出力箇所を指定するものである。
【００９６】
第２の性能データ収集プログラム（Javaクラス）１７は、スレッド固有変数領域６２に格納されたレベル値を参照して、このレベル値のレベル情報の条件を適用して、ログ出力処理を行うことになる。
【００９７】
例えばスレッド固有変数領域６２に格納された（つまり設定された）レベル値が、レベル１であった場合には、第２の性能データ収集プログラム（Javaクラス）１７は、例えば、呼び出し元のクラス・関数が、パッケージ“jp.co.fesys”に含まれるクラス・関数では無い場合には、ログ出力処理を行わないことになる。
【００９８】
この様に、変形例２では、ログ出力処理の条件を変更するときに、逐一、アスペクトコンパイルする必要なく、レベル値の設定を変更するだけで済むようになる。
図１６に、上記Ｗｅｂ／Ａｐサーバ１０等のコンピュータのハードウェア構成図を示す。
【００９９】
図１６に示すコンピュータ２００は、ＣＰＵ２０１、メモリ２０２、入力部２０３、出
力部２０４、記憶部２０５、記録媒体駆動部２０６、及びネットワーク接続部２０７を有し、これらがバス２０８に接続された構成となっている。
【０１００】
ＣＰＵ２０１は、当該コンピュータ２００全体を制御する中央処理装置である。また、ＣＰＵ２０１には、例えば、上記主記憶装置３０が内臓されていてもよい。
メモリ２０２は、プログラム実行、データ更新等の際に、記憶部２０５（あるいは可搬型記録媒体２０９）に記憶されているプログラムあるいはデータを一時的に格納するＲＡＭ等のメモリである。ＣＰＵ２０１は、メモリ２０２に読み出したプログラム／データを用いて、各種処理を実行する。
【０１０１】
出力部２０４は、例えばディスプレイ等であり、入力部２０３は、例えば、キーボード、マウス等である。
ネットワーク接続部２０７は、例えば不図示のネットワークに接続して、他の情報処理装置（クライアント１００等）との通信（コマンド／データ送受信等）を行う為の構成である。
【０１０２】
記憶部２０５は、例えばハードディスク等であり、例えば第１、第２の性能データ収集プログラム１６，１７や、アプリケーションプログラム（ＪＳＰ／Ｓｅｒｖｌｅｔ１１、Ｊａｖａクラス１２等）が格納されている。その他、ＯＳ１５やＪａｖａＶＭ１４、アスペクトコンパイラ２０等を実現するプログラム等、本例のＷｅｂ／Ａｐサーバ１０の各種機能を実現させる為に必要となる各種プログラムが格納されている。
【０１０３】
また、記憶部２０５には、図８に示すログデータ等が格納されてもよい。
ＣＰＵ２０１は、上記記憶部２０５に格納されている各種プログラムを読み出し・実行することにより、上述したＷｅｂ／Ａｐサーバ１０の各種機能・処理（特に図２、図５〜図７、図１０〜図１４に示す処理）を実現する。
【０１０４】
また、記憶部２０５は、上記補助記憶装置４０に相当するものであってもよく、この場合にはログファイル４１も記憶されることになる。
あるいは、上記記憶部２０５に格納される各種プログラム／データは、可搬型記録媒体２０９に記憶されているものであってもよい。この場合、可搬型記録媒体２０９に記憶されているプログラム／データは、記録媒体駆動部２０６によって読み出される。可搬型記録媒体２０９とは、例えば、ＦＤ（フレキシブル・ディスク）２０９ａ、ＣＤ−ＲＯＭ２０９ｂ、その他、ＤＶＤ、光磁気ディスク等である。
【０１０５】
あるいは、また、上記プログラム／データは、ネットワーク接続部２０７により接続しているネットワークを介して、他の装置内に記憶されているものをダウンロードするものであってもよい。あるいは、更に、インターネットを介して、外部の他の装置内に記憶されているものをダウンロードするものであってもよい。
【０１０６】
また、本発明は、上記本発明の各種処理をコンピュータ上で実現するプログラムを記録した可搬型記憶媒体として構成できるだけでなく、当該プログラム自体として構成することもできる。
【図面の簡単な説明】
【０１０７】
【図１】本例のクライアントとサーバからなるシステムのシステム構成図である。
【図２】第２の性能データ収集プログラム等の生成処理を説明する為の図である。
【図３】図２と図１を対応付けて示す図である。
【図４】（ａ）、（ｂ）はアスペクトコンパイル結果のアプリケーション（Javaクラス）の一例である。
【図５】本例のシステム全体の動作を示す図である。
【図６】第１の性能データ収集プログラムの処理フローチャート図である。
【図７】第２の性能データ収集プログラムの処理フローチャート図である。
【図８】ログファイルの格納データ形式の一例を示す図である。
【図９】図８に示すデータ（性能データ）の具体例を示す図である。
【図１０】本実施例のＷｅｂ／Ａｐサーバの動作を概略的に示す図である。
【図１１】図１０に対応する概略的なフローチャート図である。
【図１２】変形例１のＷｅｂ／Ａｐサーバの動作を概略的に示す図である。
【図１３】図１２に対応する概略的なフローチャート図である。
【図１４】変形例２におけるＷｅｂ／Ａｐサーバの動作を示す図である。
【図１５】レベル情報の一例を示す図である。
【図１６】コンピュータ・ハードウェア構成図である。
【図１７】従来のシステム構成及び性能データ収集方式を示す図である。
【符号の説明】
【０１０８】
１０  Ｗｅｂ／Ａｐサーバ
１１  ＪＳＰ／Ｓｅｒｖｌｅｔ
１２  Ｊａｖａクラス
１３  Ｓｅｒｖｌｅｔコンテナ
１４  ＪａｖａＶＭ（Ｊａｖａ仮想マシン）
１５  ＯＳ
１６  第１の性能データ収集プログラム
１７  第２の性能データ収集プログラム
２０  アスペクトコンパイラ
２１  アスペクトソースファイル
２２  アプリケーションプログラム
２３  アスペクトプログラム（.classファイル）
２４  アプリケーションプログラム（.classファイル）
３０  主記憶装置
３１  スレッド固有の変数領域
４０  補助記憶装置
４１  ログファイル
５０  ログファイルのテーブル（性能データ）
５１  年月日時分秒．ミリ秒
５２  ログレベル
５３  セッションＩＤ
５４  リクエストＩＤ
５５  スレッド名
５６  開始／終了
５７  ＵＲＬ
５８  実行メソッド情報
６１  クラス変数領域
６２  スレッド固有の変数領域
２００  コンピュータ
２０１  ＣＰＵ
２０２  メモリ
２０３  入力部
２０４  出力部
２０５  記憶部
２０６  記録媒体駆動部
２０７  ネットワーク接続部
２０８  バス
２０９  可搬型記録媒体
２０９ａ  ＦＤ（フレキシブル・ディスク）
２０９ｂ  ＣＤ−ＲＯＭ
【図１】
2009064125.tif 000003
【図２】
2009064125.tif 000004
【図３】
2009064125.tif 000005
【図４】
2009064125.tif 000006
【図５】
2009064125.tif 000007
【図６】
2009064125.tif 000008
【図７】
2009064125.tif 000009
【図８】
2009064125.tif 000010
【図９】
2009064125.tif 000011
【図１０】
2009064125.tif 000012
【図１１】
2009064125.tif 000013
【図１２】
2009064125.tif 000014
【図１３】
2009064125.tif 000015
【図１４】
2009064125.tif 000016
【図１５】
2009064125.tif 000017
【図１６】
2009064125.tif 000018
【図１７】
2009064125.tif 000019