JP2004094374A - ロギングシステム - Google Patents
ロギングシステム Download PDFInfo
- Publication number
- JP2004094374A JP2004094374A JP2002251637A JP2002251637A JP2004094374A JP 2004094374 A JP2004094374 A JP 2004094374A JP 2002251637 A JP2002251637 A JP 2002251637A JP 2002251637 A JP2002251637 A JP 2002251637A JP 2004094374 A JP2004094374 A JP 2004094374A
- Authority
- JP
- Japan
- Prior art keywords
- log
- call
- post
- call method
- event log
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
【課題】イベントログに出力させる箇所を効率よく限定したり、動的に変更可能とするロギングシステムを提供する。
【解決手段】ログファイル13として記録されるイベントログの取得対象となるメソッドをクラス名で指定する情報を設定するログ出力設定テーブル12と、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとをクラスの関数として有し、プリコールメソッドおよびポストコールメソッドの呼び出し元のクラス名と、ログ出力設定テーブル12に設定されたクラス名とを比較し、一致した場合、イベントログを出力状態に管理するログ管理プログラム11と、ログ管理プログラムのプリコールメソッドおよびポストコールメソッドを、イベントログの取得対象となるメソッドの前後に有するアプリケーションコンポーネント14〜16とを備えている。
【選択図】 図1
【解決手段】ログファイル13として記録されるイベントログの取得対象となるメソッドをクラス名で指定する情報を設定するログ出力設定テーブル12と、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとをクラスの関数として有し、プリコールメソッドおよびポストコールメソッドの呼び出し元のクラス名と、ログ出力設定テーブル12に設定されたクラス名とを比較し、一致した場合、イベントログを出力状態に管理するログ管理プログラム11と、ログ管理プログラムのプリコールメソッドおよびポストコールメソッドを、イベントログの取得対象となるメソッドの前後に有するアプリケーションコンポーネント14〜16とを備えている。
【選択図】 図1
Description
【0001】
【発明の属する技術分野】
本発明は、オブジェクト指向プログラミング等によるシステムにおいてイベントをログする際に用いて好適なロギングシステムに関する。
【0002】
【従来の技術】
ロギングシステムは、システムの故障監視や故障時の解析のために、イベントログをシステムの中に定義して、適宜コンソール画面やファイルに出力させるものである。従来のロギングシステムには、▲1▼イベントログ出力部分のソースコードを改変し、リコンパイルする方式(以下、方式Aとする。)、▲2▼デバッガにより解析する方式(以下、方式Bとする。)、▲3▼プロファイラツールにより解析する方式(以下、方式Cとする。)等がある。
【0003】
【発明が解決しようとする課題】
ロギングシステムでは、ログの出力量が多すぎると記録用ディスクの逼迫やログ解析の困難につながるため、目的にあわせて必要なログだけを出力させることが重要である。例えば、故障監視のためには、安定動作しているソフトウェア部品のログは出力させず、動作不安定な部品のログだけを出力させたい、といったケースがある。これを実現するには、ログ出力させる箇所を所望の箇所に限定する仕組みが必要である。
【0004】
上述したような従来のシステムにおいて、開発時または運用時にログ出力させる箇所を所望の箇所に限定する場合には、次のような課題が考えられる。方式Aでは、要求条件にあわせたソース改変とリコンパイルの作業が必要で、煩雑である。またコンパイルしたモジュールを入れ替えるためにシステムの中断時間が生じ、運用制約となる。方式Bでは、デバッグ情報を出力可能とするために特殊なコンパイルが必要で、情報を詳細に渡って多く取得できる代わりにシステムの処理性能が劣化する。デバッグ目的で開発時に使うには便利だが、性能が要求される運用時には向かない。そして、方式Cでは、OS(オペレーティングシステム)レベルや、VM(仮想マシン)等ミドルウェアレベルの情報取得が可能だが、アプリケーションで定義したログを扱うことはできない。
【0005】
すなわち、上述したような従来のシステムでは、ログ出力させる箇所を所望の箇所に限定する際に、要求条件にあわせたソース改変とリコンパイルの作業が必要であったり、デバッグ情報を出力可能とするために特殊なコンパイルが必要であったり、あるいは、アプリケーションで定義したログを扱うことができなかったりという課題があった。例えば、従来方法において、ログ出力コードをソースに埋め込んで、直接ファイルに出力させる方法では、取得したいログが変わるたびに、ソース改造やリコンパイルおよびモジュール入換えが必要となるので、開発稼動面やシステム運用面で問題があった。
【0006】
本発明は、上記のような事情を考慮してなされたもので、イベントログに出力させる箇所を効率よく限定したり、指定したりすることができるロギングシステムを提供することを目的とする。また、本発明は、特に、イベントログに出力させる箇所を効率良く動的に変更可能とするロギングシステムを提供することを目的とする。
【0007】
【課題を解決するための手段】
上記課題を解決するため、請求項1記載の発明は、イベントログの取得対象となるメソッドを指定するための情報を設定する出力設定テーブルと、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、出力設定テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理プログラムと、ログ管理プログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後に有するアプリケーションコンポーネントとを備えることを特徴とする。
【0008】
請求項2記載の発明は、前記出力設定テーブルに設定される情報が、クラス名、メソッド名、トランザクション、セッション、イベントレベル又は当該メソッドの呼び出しのべ回数のしきい値の1又は複数であることを特徴とする。請求項3記載の発明は、前記ログ管理プログラムが、前記アプリケーションプログラム複数間のメソッド呼び出しの入れ子の階層数に基づいて、一連の前記複数のアプリケーションコンポーネントのメソッド呼び出しの起点と終点とを把握し、イベントログの出力状態をその起点と終点に応じて管理することを特徴とする。請求項4記載の発明は、前記アプリケーションコンポーネントにおけるログ管理プログラムのプリコールメソッド及びポストコールメソッドが、当該アプリケーションコンポーネントのソースファイルを解析することでイベントログの取得対象となるメソッドの前後に自動挿入されたものであることを特徴とする。
【0009】
請求項5記載の発明は、イベントログの取得対象となるメソッドのクラス名を設定する出力設定テーブルと、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有し、プリコールメソッド及びポストコールメソッドの呼び出し元のクラス名と、出力設定テーブルに設定されたクラス名とを比較し、その比較結果に基づいて、当該クラスのメソッドの処理開始から処理が返るまでのイベントログの出力状態を管理するログ管理プログラムと、ログ管理プログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後に有するアプリケーションコンポーネントとを備えることを特徴とする。
【0010】
請求項6記載の発明は、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有し、プリコールメソッド及びポストコールメソッドが呼び出されたときに、当該ポストコールメソッドの引数の情報に基づいてイベントログの出力状態を管理するログ管理プログラムと、ログ管理プログラムのプリコールメソッド及びポストコールメソッドをイベントログの取得対象となるメソッドの前後に有し、該ポストコールメソッドの呼び出し時にその引数に該イベントログの取得対象となるメソッドの成功又は失敗を示す情報を設定するアプリケーションコンポーネントとを備えることを特徴とする。
【0011】
請求項7記載の発明は、所定のテーブルにイベントログの取得対象となるメソッドを指定するための情報を設定する出力設定過程と、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有するプログラムを実行し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、前記出力設定過程で前記テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理過程と、アプリケーションコンポーネント内で、前記ログ管理過程で実行されるプログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後で呼び出す呼出過程とを有することを特徴とする。
【0012】
請求項8記載の発明は、所定のテーブルにイベントログの取得対象となるメソッドを指定するための情報を設定する出力設定過程と、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有するプログラムを実行し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、前記出力設定過程で前記テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理過程と、アプリケーションコンポーネント内で、前記ログ管理過程で実行されるプログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後で呼び出す呼出過程とをコンピュータを用いて実行するためのロギングプログラムである。請求項9記載の発明は、所定のテーブルにイベントログの取得対象となるメソッドを指定するための情報を設定する出力設定過程と、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有するプログラムを実行し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、前記出力設定過程で前記テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理過程と、アプリケーションコンポーネント内で、前記ログ管理過程で実行されるプログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後で呼び出す呼出過程とをコンピュータを用いて実行するためのロギングプログラムを記録したコンピュータ読み取り可能な記録媒体である。
【0013】
【発明の実施の形態】
以下、図面を参照して本発明によるロギングシステムの実施の形態について説明する。図1を参照して説明する実施の形態は、1または複数のコンピュータと、その周辺機器と、そのコンピュータで実行されるプログラムとから構成されるものである。図1には、そのコンピュータの記憶装置10と、そのコンピュータに対して情報を入出力させるための設定端末21および端末等22とを示している。記憶装置10は、主記憶装置と補助記憶装置とから構成されている。記憶装置10内では、所定のOS上でログ管理プログラム11とアプリケーションコンポーネント14〜16とが実行され、また、ログ出力設定テーブル12とログファイル13とが記憶されるようになっている。
【0014】
アプリケーションコンポーネント14〜16は、アプリケーションシステムの機能を実装するプログラム(アプリケーションシステムを構成するソフトウェアの部品)であり、オブジェクト指向プログラミングにおけるクラスで実装されている。各コンポーネント中には、ログ管理プログラム11を介してイベントログに情報を出力するためのメソッドやデータが定義されている。そのメソッドによって、イベントログに記録されるログ情報が、ログ管理プログラム11へと渡されるようになっている。この場合、アプリケーションコンポーネント14、15、および16は、それぞれ、クラスA、B、およびC(=Aクラス、BクラスおよびCクラスあるいはアプリケーションクラスA、B、およびC)で定義されるオブジェクトa、b、およびcとして構成されている。各アプリケーションコンポーネント14〜16では、また、マウス、キーボード等からなる端末等22に対する操作者の操作に応じてイベントが発生するようになっている。
【0015】
ログ管理プログラム11は、各アプリケーションコンポーネント14〜16から渡されるログ情報を一括管理するプログラムであり、オブジェクト指向プログラミングにおけるクラスで実装されている。ログ管理プログラム11は、ログ出力設定テーブル12に設定された条件(情報)にもとづいて各アプリケーションコンポーネント14〜16から渡されたログ情報をイベントログに出力するかしないかを判定する。出力する場合には、各アプリケーションコンポーネント14〜16から渡されたログ情報は、複数のイベントログからなるログファイル13へと出力される。
【0016】
ログ出力設定テーブル12は、ログ出力の契機(起点および終点)となるクラス名を、出力設定クラス名として保持するファイルである。ログ出力設定テーブル12内のデータは、外部設定端末21から書き込むことができる。
【0017】
次に、本システムの設定方法および動作について図2〜図9を参照して説明する。図2は、図1に示した各アプリケーションコンポーネント14〜16においてイベントログに対してログ管理プログラム11を介して情報を出力するためのメソッドを起動するイベントのモデルを示す図である。図2に示すように、▲1▼各アプリケーションコンポーネント(オブジェクトa〜c)では、アプリケーションコンポーネント内の各メソッド呼出しの前後(呼び出し前および返り後)にそれぞれに対応するイベント(プリコールイベント31およびポストコールイベント32)が発生するように定義がなされている。▲2▼プリコールイベント31は、メソッド(アプリケーションメソッド)呼出し開始を通知するイベントで、ログ管理プログラム11のプリコールメソッドで実装される。▲3▼ポストコールイベント32は、アプリケーションメソッド呼出しの完了(返り時)を通知するイベントで、ログ管理プログラム11のポストコールメソッドで実装される。
【0018】
次に、図3を参照して、アプリケーションコンポーネント14〜16におけるプリコールメソッドおよびポストコールメソッドの実装例について説明する。本実施の形態では、ログ情報を取得する可能性のあるすべてのメソッドの前後に、ログ管理プログラム11のプリコールメソッドとポストコールメソッドを挿入するようにしている。
【0019】
図3は、ログ出力用に、図2に示すプリコールイベント31およびポストコールイベント32に対応するプリコールメソッドおよびポストコールメソッドを挿入して改変したアプリケーションクラスAのソースコードの一例を示す図である。図3では、AクラスがBクラスを呼び出す例を示している。図3において、“LogManager”はログ管理プログラム11のクラスであり、“b”はBクラスのオブジェクトである。図3に示すAクラスのソースコードでは、関数“someMethod()”内で、オブジェクトbの関数“getAccount(name)”を呼び出すソースコードの前にプリコールメソッド“LogManager.preCall(...)”を挿入し、その後にポストコールメソッド“LogManager.postCall(...)”を挿入している。
【0020】
図4は、ログ出力設定テーブル12の一例を示す図である。ログ出力設定テーブル12は、ログ出力契機となる(始点および終点となる)クラス名を保持する任意のレコード数からなるテーブルである。ログ出力設定テーブル12内のデータは、外部設定端末21等によって書き込まれる。ただし、システム内の任意のプログラムを経由してデータが書き込まれるようにしてもいい。
【0021】
次に、図5〜図9を参照して、ログ管理プログラム11について説明する。ログ管理プログラム11は、上述したように、クラスとして実装され、ログ出力設定テーブル12に設定された条件にもとづいて各アプリケーションコンポーネント14〜16から渡されたログ情報をイベントログに出力するかしないかを判定する機能を有している。ログ管理プログラム11のクラスは、出力モード(変数)と、コールカウント(変数)と、プリコードメソッド(関数)と、ポストコードメソッド(関数)とを有するように定義されている。
【0022】
出力モードは、イベントログにログ情報を出力するか否かの判定結果(出力モード)を示す値を保持する内部変数である。出力モードは、「ON」と「OFF」の2値の何れかを取りうる。出力モードが「ON」の間、イベントログが出力される。「OFF」の場合は、イベントログが出力されない。初期値は「OFF」で、ログ出力開始時に「ON」になる。出力開始契機となったメソッドの処理が返ると「OFF」になる。
【0023】
コールカウントは、自然数を、内部変数として保持するものである。コールカウントは、出力モードが「ON」の間、一連のメソッド呼出しの入れ子の階層数を表す。初期値は「0」で、出力モードが「ON」の間、プリコールイベント毎にインクリメントし、ポストコールイベント毎にデクリメントする。
【0024】
図5は、出力モードの状態遷移図である。初期状態(S51)では、コールカウントが「0」に設定され、システムが開始すると(51)、出力モードが「OFF」の状態(S52)になる。プリコールメソッドが呼び出されてプリコールイベントが発生した場合に、プリコールメソッドの呼出し元クラス名がログ出力設定テーブル12に設定された出力設定クラス名の何れかに一致したときは(52)、出力モードが「ON」の状態(S53)になり、一致しないときは出力モードは「OFF」の状態のままとなる。また、ポストコールメソッドが呼び出された場合は、出力モードは「OFF」の状態のままとなる。
【0025】
出力モードが「ON」の状態(S53)の場合に、さらにプリコールメソッドが呼び出されてプリコールイベントが発生したとき(53)には、出力モードは「ON」の状態(S53)で変化しない。ただし、コールカウントは、そのとき、プリコールイベント毎にインクリメントする。
【0026】
出力モードが「ON」の状態(S53)の場合に、ポストコールメソッドが呼び出されてポストコールイベントが発生したときには、コールカウントの値によって遷移する状態が変化する。すなわち、コールカウントが「0」より大きいとき(54)は、出力モードは「ON」の状態(S53)で変化しない。ただし、コールカウントは、ポストコールイベント毎にデクリメントする。一方、コールカウントが「0」のとき(55)は、出力モードは「OFF」の状態(S52)になる。
【0027】
出力モードが「OFF」の状態(S52)の場合に、システムが終了したときには、初期状態(S51)に遷移する。
【0028】
次に、図6および図7を参照して、ログ管理プログラム11のクラスのプリコールメソッドについて説明する。図6はプリコールメソッドの仕様を示す図表、図7はプリコールメソッドのフローチャートである。図6に示すように、プリコールメソッドは、返り値を「任意(なし、または成功/失敗)」とし、引数を「呼出し元クラス名」および「アプリケーションで定義した任意のログ情報」とする関数である。その処理内容は、▲1▼ログ出力設定テーブル12の設定内容とアプリケーションコンポーネントのクラス名を比較し、出力モードを判定・設定することと、▲2▼出力モードが「ON」の場合、コールカウントをインクリメントし、ログ出力を実行することである。
【0029】
図7を参照して、プリコールメソッドの処理の流れを説明する。プリコールメソッドでは、まず、ログ出力設定テーブル12にレコードが存在するか否かが判定される(ステップ101)。レコードが存在する場合、すなわち、ログ出力設定テーブル12に1以上の任意の出力設定クラス名が設定されている場合、次に、コールカウントが「0」か否かが判定される(ステップ102)。一方、レコードが存在しない場合は、コールカウントのインクリメント、ログ出力等の処理は行われずに、そのまま関数内の処理が終了する(ステップ101で「false」→終了)。
【0030】
次に、ステップ102で、コールカウントが「0」であると判定された場合は、ログ出力設定テーブル12からレコードを取得する処理が行われ(ステップ103)、次にプリコールメソッドのメソッド引数から呼び出し元クラス名を取得する処理が行われる(ステップ104)。続いてレコード内のクラス名のいずれかに呼出し元クラス名が一致するか否かが判定される(ステップ105)。一致した場合、出力モードを「ON」にする処理が行われ(ステップ106)、一致しなかった場合、関数内の処理が終了する(ステップ105で「false」→終了)。
【0031】
ステップ106で出力モードを「ON」にした場合、および、ステップ102でコールカウントが「0」でないと判定された場合、コールカウントをインクリメントする処理が行われる(ステップ107)。次に、次にプリコールメソッドのメソッド引数からアプリケーションコンポーネント内で定義された任意のログ情報を取得する処理が行われた後、取得したログ情報に基づいてログファイル13に対するログ出力が行われる(ステップ108)。ここで、関数内の処理が終了する。
【0032】
次に、図8および図9を参照して、ログ管理プログラム11のクラスのポストコールメソッドについて説明する。図8はポストコールメソッドの仕様を示す図表、図9はポストコールメソッドのフローチャートである。図8に示すように、ポストコールメソッドは、返り値を「任意(なし、または成功/失敗)」とし、引数を「アプリケーションで定義した任意のログ情報」とする関数である。その処理内容は、▲1▼出力モード「ON」の場合、コールカウントをデクリメントし、ログ出力することと、▲2▼デクリメントによってコールカウントが「0」になったら出力モードを「OFF」にすることである。
【0033】
図9を参照して、ポストコールメソッドの処理の流れを説明する。ポストコールメソッドでは、まず、出力モードが「ON」か否かが判定される(ステップ111)。出力モードが「ON」の場合、コールカウントをデクリメントする処理が行われ(ステップ112)、続いてログ出力が行われる(ステップ113)。次に、コールカウントが「0」か否かを判定する処理が行われる(ステップ114)。ステップ114でコールカウントが「0」と判定された場合、出力モードを「OFF」にする処理が行われて(ステップ115)、関数内の処理が終了する。
【0034】
一方、ステップ111で出力モードが「ON」でないと判定された場合、および、ステップ114でコールカウントが「0」でないと判定された場合、コールカウントのデクリメント、ログ出力等の処理は行われずに関数内の処理が終了する。
【0035】
次に、図10および図11を参照して、図1に示すロギングシステムにおける処理の流れについて具体例を示して説明する。図10は、図1のロギングシステムにおけるログ出力の際の一連の処理の流れを示すシークエンス図であり、図11は、図10に示す各ログ出力時の出力例を示す図である。この場合、ログ設定テーブル12には、クラスAを出力設定クラスとするレコードが存在するものとする。また、ログ管理プログラム11の遷移状態は図5に示す初期状態(S51)にあるものとする。
【0036】
また、図10に示す例は、Aクラスのオブジェクトa(図1の参照符号14)→Bクラスのオブジェクトb(15)→Cクラスのオブジェクトc(16)の順に各オブジェクトのメソッドが呼出される処理の一例である。この例では、アカウント××取得処理を行うために(「××」は任意のアカウント名を表す。)、Aクラスのオブジェクトa(14)がBクラスのオブジェクトb(15)のメソッド「getAccount」を呼び出し、Bクラスのオブジェクトb(15)のメソッド「getAccount」がアカウント××有効チェック処理を行うために、Cクラスのオブジェクトc(16)のメソッド「isVaid」を呼び出す処理を行うこととしている。
【0037】
また、Aクラスのオブジェクトa(14)からBクラスのオブジェクトb(15)のメソッド「getAccount」を呼び出すステップの前後には、図3に示すようにプリコールメソッドおよびポストコールメソッドが挿入されていて、同様に、Bクラスのオブジェクトb(15)のメソッド「getAccount」がCクラスのオブジェクトc(16)のメソッド「isVaid」を呼び出すステップの前後にも図3に示すようなプリコールメソッドおよびポストコールメソッドが挿入されているものとする。
【0038】
したがって、図10に示すように、Aクラスのオブジェクトa(14)がBクラスのオブジェクトb(15)のメソッド「getAccount」を呼び出す際には、ログ管理プログラム11のクラスのプリコールメソッドが呼び出されることになる(ステップ201)。ログ管理プログラム11では、この場合、図5および図7を参照して説明したように、出力モードが「OFF」から「ON」に変化するとともに、コールカウントに「1」がセットされる(ステップ202)。そして、ログ出力が行われて(ステップ203)、プリコールメソッドの引数に基づいて例えば図11のログ情報221(「アカウント××取得処理開始/呼び出し元:Aクラス/呼び出し先:Bクラス/メソッド:getAccount」)がログファイル13に記録される。
【0039】
次に、実際に、Aクラスのオブジェクトa(14)からBクラスのオブジェクトb(15)のメソッド「getAccount」の呼び出し処理が行われる(ステップ204)。この場合、Bクラスのオブジェクトb(15)のメソッド「getAccount」は、さらに、Cクラスのオブジェクトc(16)のメソッド「isVaid」を呼び出す処理を行う。その際、Bクラスのオブジェクトb(15)では、Cクラスのオブジェクトc(16)のメソッド「isVaid」を呼び出す処理の前に、ログ管理プログラム11のクラスのプリコールメソッドを呼び出す処理が行われる(ステップ205)。ログ管理プログラム11では、出力モードが「ON」となっているので、コールカウントがインクリメントされて値が「2」になり(ステップ206)、その後、ログ出力が行われる(ステップ207)。ここでは、プリコールメソッドの引数に基づいて、例えば図11のログ情報222(「アカウント××有効チェック処理開始/呼び出し元:Bクラス/呼び出し先:Cクラス/メソッド:isVaid」)がログファイル13に記録される。
【0040】
次に、実際に、Bクラスのオブジェクトb(15)のメソッド「getAccount」からCクラスのオブジェクトc(16)のメソッド「isVaid」を呼び出す処理が行われる(ステップ208)。ここで、Cクラスのオブジェクトc(16)のメソッド「isVaid」が実行されて(ステップ209)、応答信号がBクラスのオブジェクトb(15)に渡される(ステップ210)。次に、ログ管理プログラム11のクラスのポストコールメソッドが呼び出される(ステップ211)。
【0041】
ログ管理プログラム11では、この場合、図5および図9を参照して説明したように、コールカウントがデクリメントされて値が「1」になり(ステップ212)、その後、ログ出力が行われる(ステップ213)。この場合、ポストコールメソッドの引数に基づいて例えば図11のログ情報223(「アカウント××有効チェック処理失敗(アカウント名無効)/呼び出し元:Bクラス/呼び出し先:Cクラス/メソッド:isValid」)がログファイル13に記録される。
【0042】
次に、Bクラスのオブジェクトb(15)のメソッド「getAccount」が終了すると、応答信号がAクラスのオブジェクトa(14)に渡される(ステップ214)。次に、Aクラスのオブジェクトa(14)から、ログ管理プログラム11のクラスのポストコールメソッドが呼び出される(ステップ215)。
【0043】
ログ管理プログラム11では、この場合、図5および図9を参照して説明したように、出力モードが「ON」から「OFF」に変化するとともに、コールカウントがデクリメントされて「0」にリセットされる(ステップ216)。次に、ログ出力が行われて(ステップ217)、ポストコールメソッドの引数に基づいて例えば図11のログ情報224(「アカウント××取得処理失敗(アカウント取得不可)/呼び出し元:Aクラス/呼び出し先:Bクラス/メソッド:getAccount」)がログファイル13に記録される。
【0044】
以上説明したように、本実施の形態は、アプリケーションコンポーネント(アプリケーションプログラム)がログを直接外部出力せず、ログ管理プログラム11がログ出力設定テーブル12を参照しながら各アプリケーションコンポーネント14〜16からのログ情報を一括管理してログ出力するソフトウェア構成を採用している。また、ログ管理プログラム11における、メソッド呼出しの入れ子の階層数のカウントによって、一連の複数メソッド呼出しの起点と終点を把握する仕組みを用いるようにしている。そのため、クラス名を指定することでイベントログの取得範囲を指定することが可能となり、また、メソッド呼出しが入れ子状態となっていても、該当クラスのメソッドの処理開始から処理が返るまでのログを取得することが可能となった。さらに、システム動作中にログ出力設定テーブル12の内容を変更することで、ログ対象のコンポーネント(クラス)名を動的に変更したり指定することが可能となった。また、該当クラスの次のメソッド呼出しを起点とし、該当クラスの呼出しに処理が戻ってくるまでのイベントログを出力させることができるようになった。
【0045】
次に、本実施の形態のシステム全体の設定と動作について、本システムを開発時に使用する場合と、運用時に使用する場合とに分けて説明する。まず、開発時について説明する。
【0046】
開発時には、まず、▲1▼出力させる可能性のあるイベントログを全てアプリケーションコンポーネント内に定義しておく。すなわち、イベントログに出力すべきログ情報を各アプリケーションコンポーネント内に定義しておくのである。次に、▲2▼ログ管理プログラムを実装する。そして、▲3▼各アプリケーションコンポーネントに、ログ管理プログラムへログ情報を送信するメソッド(プリコールメソッドおよびポストコールメソッド)を実装する。
【0047】
一方、運用時には、まず、▲1▼外部設定端末によって、ログ出力設定テーブルに所望のクラス名を設定する。▲2▼システム運転中は、▲1▼で設定したクラス(オブジェクト)のメソッドが呼出されるのを契機に、ログ出力が開始される。そして、▲3▼呼出されたメソッドに処理が戻るまでの間、ログ情報がファイル出力される。
【0048】
次に、図1〜図9を参照して説明した上記実施の形態の変形例について説明する。ここでは、(ア)ログ取得範囲を指定する方法のカスタマイズ、(イ)マルチスレッド対応、(ウ)アプリケーションコンポーネントへプリコールメソッド、ポストコールメソッドを自動挿入する場合の変形例、および、(エ)不安定な動作をするコンポーネントのログだけを取得する場合の変形例に分けて説明する。
【0049】
(ア)ログ取得範囲を指定する方法のカスタマイズ:上記実施の形態では、ログ取得範囲として、始点および終点となる「クラス名」を指定しているが、下記のように、クラス名以外の属性(▲1▼〜▲5▼)によってログ取得範囲を指定することも可能である。さらに、下記の1または複数の属性とクラス名、あるいは複数の属性を組み合わせることも可能である。各属性は、例えば、図1のログ出力設定テーブル12に、各属性に対応するフィールドを追加することで設定可能である。
【0050】
▲1▼メソッド指定:特定のメソッドを起点とする処理間のログを取得したい場合には、上記実施の形態に以下のカスタマイズを行うことで実現可能である。
【0051】
1)プリコールメソッドおよびポストコールメソッドの引数にアプリケーションクラスのメソッド名を含ませる。そして、2)出力設定テーブルに、クラス名フィールドに対応してメソッド名フィールドを追加する。そして、3)ログ管理プログラム11内では、クラス名とメソッド名を判定条件とすることで出力モードの設定を行うようにする。
【0052】
▲2▼トランザクション指定:DB(データベース)の更新、ロールバック等のトランザクション管理のため、一連のメソッド呼び出しに対してトランザクション境界を設定することがある。トランザクション境界の内側のログだけを出力させることは、以下のカスタマイズによって実現可能である。
【0053】
1)プリコールおよびポストコール毎に、アプリケーションメソッドにトランザクションが設定されているか否かを判定し、設定されている場合はトランザクションID(識別符号)を取得する。そして、2)同一のトランザクションIDが設定されたメソッドをログ出力するようにする。ただし、トランザクションIDを取得するメソッドをアプリケーションクラスで実装することが前提である。
【0054】
▲3▼セッション指定:HTTP(HyperText Transfer Protocol)セッション管理のために、複数のHTTPコネクションに渡る端末要求に対して、同一のセッションIDを付与して、一連のメソッド間でセッションIDを持ち回ることがある。同一セッションの呼び出しのみをログ出力させることは、前記のトランザクションIDの代わりにセッションIDを用いることで実現できる。
【0055】
▲4▼イベントレベル指定:システム運転へ影響の大きいイベントログだけを取得した場合がある。Fatal、Warning、Error、Information等のイベントレベルを閾値とし、閾値以上のイベントだけをログ出力させることが可能である。
【0056】
Fatal、Warning、Error、Informationのレベルの場合の例:1)プリコールイベントのイベントレベルは、全てinformation(エラーではない情報通知のレベル)とする。2)ポストコールイベントのイベントレベルは、各アプリケーションメソッドの返り値毎に定義する。返り値にはイベントレベルデータを含ませ、ポストコールメソッドの引数によってログ管理プログラムへ渡す。3)ログ出力設定テーブルに閾値レベルを追加する。4)ログ管理プログラムは、ログ出力設定テーブル内の閾値と、アプリケーションから渡されたレベルを比較し、適宜出力する。
【0057】
▲5▼のべ呼出し回数指定:ソフトウェア改造時、初期不良をチェックするために初期運転期間だけ、ログを取得したい場合がある。指定したのべ呼出し回数に達するまで、ログ出力させる。この場合、1)同一コンポーネント(もしくはメソッド)の呼び出しのべ回数に閾値を設け、ログ出力テーブルに設定する。2)コンポーネント(もしくはメソッド)毎にプリコールメソッドののべ呼出し回数を常時カウントする。そして、3)カウント数と閾値を比較して、適宜出力する。
【0058】
(イ)マルチスレッド対応:上記実施の形態では、アプリケーションクラスがシングルスレッドで動作することを前提とするが、マルチスレッド時には、イベント毎にスレッドIDを取得し、スレッドID毎にコールカウントを管理することで対応可能である。
【0059】
(ウ)アプリケーションコンポーネントへのプリコールメソッド、ポストコールメソッドの自動挿入:開発時に、各コンポーネントにプリコールメソッドとポストコールメソッドを挿入する作業はコンポーネント数が多い場合に煩雑な作業となるが、ソース解析機能と組み合わせれば、容易に該当クラスのメソッドの前後に両メソッドのテンプレートを自動挿入することができ、開発稼動を削減できる。以下、図12を参照して、プリコールメソッドおよびポストコールメソッドを自動挿入する場合の構成について説明する。
【0060】
図12を参照して説明するロギング用のメソッドをソースコード中に一括自動挿入する方法では、オブジェクト指向言語(Java(登録商標)、C++等)のソースコードに対して、ログ取得対象とするクラスを指定して、そのクラスのメソッドがソースコード中に存在した場合、その前後の行にロギングメソッド(プリコールメソッドおよびポストコールメソッド)を自動一括挿入する。より具体的に説明すると、例えば、取得する可能性のあるクラスを「ログ取得対象クラスリスト」に挙げ、そのクラスのうちから、運用中に特に指定して出力させるクラスを、上記実施の形態と同様にログ出力設定テーブルに記述するようにする。以下、1)および2)に項目分けして説明する。
【0061】
1)ログ取得対象クラスリスト作成:まず、図12(a)に示すように、自作したクラス名をすべて列挙して、ログ取得対象クラスリストを作成する。この自作したクラス名をすべて列挙するログ取得対象クラスリストは、その作成を省略することも可能である。ただし、このリストを作成しない場合、標準ライブラリとして提供されているクラスもログ取得され、煩雑になりかねないのでその点に留意する必要がある。ログ取得対象クラスリストの作成は、例えば、人が手作業で実施する。ログ取得対象クラスリストの内容は、クラス名もしくはパッケージ名+クラス名等のクラスを一意付ける文字を含むものとする。
【0062】
2)ソースコードへのロギングメソッド挿入:ロギングメソッド挿入は、以下のa)〜c)の処理によって行うことができる。
【0063】
a)ソースコード中、ログ取得対象クラスリスト内のクラスの型で宣言されたインスタンス変数を検出する。ここで、クラスの型とは、クラス名のことである。図12(b)に示す例では、「MyClass1」がクラスの型であり、「c1」がインスタンス変数名である。
【0064】
b)検出されたインスタンス変数へのメソッド呼出しを検出する。ただし、宣言された行と同一のスコープにあることを確認する。これはスコープの境界を示す文字「{}や「」」を検出することで実現可能である。ここで、スコープとは、カッコ等で挟まれた変数名の宣言が有効な範囲のことである。例えば、図12(c)に示す例では、Java(登録商標)言語の場合、「c1.methodA();」を検出し、C++言語の場合、「c1−>methodA();」を検出する。
【0065】
c)そして、検出されたメソッド呼出しの前後にロギングメソッドを挿入する。例えば、「c1.methodA();」に対しては、図12(d)に示すように、その前後に、「LogManager.preCall();」というプリコールメソッドを挿入するとともに、「LogManager.postCall();」というポストコールメソッドを挿入する。
【0066】
(エ)不安定な動作をするコンポーネントのログだけを取得する方法:この方法について、図13〜図15を参照して説明する。この方法では、複数のコンポーネント間の一連の呼出しにおいて、不安定なコンポーネントを「一連の呼び出しの中で最初にエラーを発生させたコンポーネント」と定義する。例えば、コンポーネントAから呼出しが開始し、正常動作の場合はコンポーネントA→B→C→D→E→D→C→B→AとコンポーネントAへ処理が返る場合、コンポーネントD内の処理がエラーとなると、コンポーネントDはコンポーネントEを呼び出さずにコンポーネントCへエラーを示すメッセージを返す。この時、一連の呼出し処理はコンポーネントA→B→C→D→C→B→Aとなる。コンポーネントDからエラーを返されたコンポーネントCもまた、エラーをコンポーネントBに返し、コンポーネントBも同様にコンポーネントAへエラーを返すが、この場合、コンポーネントC、Bの処理自体にはエラーはない。よって、不安定な動作をするコンポーネントのログだけを取得するにはエラーの発生源であるコンポーネントDのログだけを取得できればよい。
【0067】
実現方法:図1を参照して説明した上記実施の形態に対し、以下のa)〜c)のカスタマイズを施すことで実現可能である。
【0068】
a)各アプリケーションコンポーネントの全アプリケーションメソッドに対し、返り値に成功と失敗を定義し、ポストコールメソッドの引数にそのアプリケーションメソッドの返り値(成功/失敗)を含ませる。
【0069】
b)ログ管理プログラムは出力履歴値を変数として保持する。図13は、ログ管理プログラムの出力履歴値の状態遷移図である。初期状態(S71)で、システムが開始すると(71)、出力履歴値は「0」に設定された状態になる(S72)。出力履歴値が「0」の状態(S72)で、プリコールイベントが発生した場合(72)は、出力履歴値に変化は発生しない。一方、出力履歴値が「0」の状態(S72)で、ポストコールイベントが発生した場合に、ログ出力が実行される条件が整っているとき(72)は、出力履歴値が「1」に設定された状態になる(S73)。また、出力履歴値が「0」の状態(S72)で、ポストコールイベントが発生した場合に、ログ出力が実行される条件が整っていないとき(74)は、出力履歴値に変化は発生しない。
【0070】
出力履歴値が「1」の状態(S73)で、プリコールイベントが発生した場合(75)は、出力履歴値に変化は発生しない。また、出力履歴値が「1」の状態(S73)で、ポストコールイベントが発生した場合に、コールカウントが「0」より大きいとき(76)も、出力履歴値に変化は発生しない。一方、出力履歴値が「1」の状態(S73)で、ポストコールイベントが発生した場合に、コールカウントが「0」に等しいとき(77)は、出力履歴値は「1」に設定される状態になる(S72)。
【0071】
c)プリコールメソッド、ポストコールメソッドはそれぞれ図14、図15のフローチャートを実装する。図14は、プリコールメソッドのフローチャートであり、図15は、ポストコールメソッドのフローチャートである。
【0072】
図14に示すように、本変形例のプリコールメソッドでは、コールカウントがインクリメントされて、処理が返えるようになっている。一方、本変形例のポストコールメソッドでは、図15に示すように、まず、コールカウントがデクリメントする(ステップ211)。次に、ポストコールメソッド引数内のアプリケーションメソッドの返り値がエラーか否かが判定される(ステップ212)。ステップ212で返り値がエラーであると判定された場合、出力履歴値が「0」か否かが判定される(ステップ213)。ステップ213で出力履歴値が「0」であると判定された場合、ログ出力が行われ(ステップ214)、続いて出力履歴値が「1」に設定される(ステップ215)。次に、コールカウントが「0」か否かが判定され(ステップ216)、「0」である場合は、出力履歴値が「0」にされ(ステップ217)、処理が終了する。一方、ステップ212で返り値がエラーでないと判定された場合、および、ステップ213で出力履歴値が「0」でないと判定された場合、そのまま処理が終了する。
【0073】
不安定な動作をするコンポーネントのログだけを取得する方法については、上記実施の形態と比較した場合、図5の代わりに図13、図7の代わりに図14、そして、図9の代わりに図15に示す各機能あるいは構成を用いることになる。また、図10についてはログの出力タイミングが変わる。そして、図8に関しては、ポストコールメソッドの仕様が変わり、引数に「アプリケーションメソッドの返値(成功/失敗)」が追加になる。
【0074】
以上、本発明の実施の形態およびその変形例について説明したが、本発明の実施の形態は上記のものに限定されることなく、例えば、コンピュータ、端末等の各構成、プログラム、コンポーネントプログラム等のソフトウェアや、ログ管理テーブルやログファイルのファイルについては、それらをネットワーク等を介して分散して配置する等の変更を適宜、適用可能である。また、本発明の構成要素となるプログラムの全部または一部は、コンピュータ読み取り可能な記録媒体や通信回線を介して頒布することが可能である。
【0075】
また、特許請求の範囲の記載においては、装置、方法等のカテゴリを適宜変更可能である。例えば、請求項5や請求項6記載のシステムは、請求項1のシステムと請求項7記載の方法との間の関係と同様にして、方法の発明とすることが可能である。
【0076】
【発明の効果】
本発明によれば、イベントログの取得対象となるメソッドを指定するための情報を設定する出力設定テーブルを設け、ログ管理プログラムにおいてプリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、出力設定テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するようにしたので、イベントログに出力させる箇所を効率よく限定したり、指定したりすることができ、また、イベントログに出力させる箇所を効率良く動的に変更可能とすることができる。
【図面の簡単な説明】
【図1】本発明によるロギングシステムの一実施の形態のソフトウェア構成等の構成を示すシステム図。
【図2】図1に示す構成におけるイベントモデルを示す図。
【図3】図1に示すアプリケーションコンポーネントA(14)のソースコードの一例を示す図。
【図4】図1のログ出力設定テーブル12の一構成例を示す図。
【図5】図1のログ管理プログラム11内の変数である出力モードの状態遷移図。
【図6】図1のログ管理プログラム11内の関数であるプリコールメソッドの仕様を示す図表。
【図7】図1のログ管理プログラム11内の関数であるプリコールメソッドのフローチャート。
【図8】図1のログ管理プログラム11内の関数であるポストコールメソッドの仕様を示す図表。
【図9】図1のログ管理プログラム11内の関数であるポストコールメソッドのフローチャート。
【図10】図1のシステムにおけるイベントログに関する一連の処理のシークエンス図。
【図11】図10に示すイベントログに関する一連の処理におけるログファイル13への出力例を示す図。
【図12】図1に示す実施の形態の変形例(プリコールメソッドおよびポストコールメソッドを自動挿入する例)を説明するための図。
【図13】図1に示す実施の形態の他の変形例(不安定な動作をするコンポーネントのログだけを取得する例)における出力履歴値の状態遷移図。
【図14】図13の変形例におけるプリコールメソッドのフローチャート。
【図15】図13の変形例におけるポストコールメソッドのフローチャート。
【符号の説明】
11 ログ管理プログラム
12 ログ出力設定テーブル
13 ログファイル
14〜16 アプリケーションコンポーネント
21 設定端末
22 端末等
31 プリコールイベント(実装:プリコールメソッド)
32 ポストコールイベント(実装:ポストコールメソッド)
【発明の属する技術分野】
本発明は、オブジェクト指向プログラミング等によるシステムにおいてイベントをログする際に用いて好適なロギングシステムに関する。
【0002】
【従来の技術】
ロギングシステムは、システムの故障監視や故障時の解析のために、イベントログをシステムの中に定義して、適宜コンソール画面やファイルに出力させるものである。従来のロギングシステムには、▲1▼イベントログ出力部分のソースコードを改変し、リコンパイルする方式(以下、方式Aとする。)、▲2▼デバッガにより解析する方式(以下、方式Bとする。)、▲3▼プロファイラツールにより解析する方式(以下、方式Cとする。)等がある。
【0003】
【発明が解決しようとする課題】
ロギングシステムでは、ログの出力量が多すぎると記録用ディスクの逼迫やログ解析の困難につながるため、目的にあわせて必要なログだけを出力させることが重要である。例えば、故障監視のためには、安定動作しているソフトウェア部品のログは出力させず、動作不安定な部品のログだけを出力させたい、といったケースがある。これを実現するには、ログ出力させる箇所を所望の箇所に限定する仕組みが必要である。
【0004】
上述したような従来のシステムにおいて、開発時または運用時にログ出力させる箇所を所望の箇所に限定する場合には、次のような課題が考えられる。方式Aでは、要求条件にあわせたソース改変とリコンパイルの作業が必要で、煩雑である。またコンパイルしたモジュールを入れ替えるためにシステムの中断時間が生じ、運用制約となる。方式Bでは、デバッグ情報を出力可能とするために特殊なコンパイルが必要で、情報を詳細に渡って多く取得できる代わりにシステムの処理性能が劣化する。デバッグ目的で開発時に使うには便利だが、性能が要求される運用時には向かない。そして、方式Cでは、OS(オペレーティングシステム)レベルや、VM(仮想マシン)等ミドルウェアレベルの情報取得が可能だが、アプリケーションで定義したログを扱うことはできない。
【0005】
すなわち、上述したような従来のシステムでは、ログ出力させる箇所を所望の箇所に限定する際に、要求条件にあわせたソース改変とリコンパイルの作業が必要であったり、デバッグ情報を出力可能とするために特殊なコンパイルが必要であったり、あるいは、アプリケーションで定義したログを扱うことができなかったりという課題があった。例えば、従来方法において、ログ出力コードをソースに埋め込んで、直接ファイルに出力させる方法では、取得したいログが変わるたびに、ソース改造やリコンパイルおよびモジュール入換えが必要となるので、開発稼動面やシステム運用面で問題があった。
【0006】
本発明は、上記のような事情を考慮してなされたもので、イベントログに出力させる箇所を効率よく限定したり、指定したりすることができるロギングシステムを提供することを目的とする。また、本発明は、特に、イベントログに出力させる箇所を効率良く動的に変更可能とするロギングシステムを提供することを目的とする。
【0007】
【課題を解決するための手段】
上記課題を解決するため、請求項1記載の発明は、イベントログの取得対象となるメソッドを指定するための情報を設定する出力設定テーブルと、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、出力設定テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理プログラムと、ログ管理プログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後に有するアプリケーションコンポーネントとを備えることを特徴とする。
【0008】
請求項2記載の発明は、前記出力設定テーブルに設定される情報が、クラス名、メソッド名、トランザクション、セッション、イベントレベル又は当該メソッドの呼び出しのべ回数のしきい値の1又は複数であることを特徴とする。請求項3記載の発明は、前記ログ管理プログラムが、前記アプリケーションプログラム複数間のメソッド呼び出しの入れ子の階層数に基づいて、一連の前記複数のアプリケーションコンポーネントのメソッド呼び出しの起点と終点とを把握し、イベントログの出力状態をその起点と終点に応じて管理することを特徴とする。請求項4記載の発明は、前記アプリケーションコンポーネントにおけるログ管理プログラムのプリコールメソッド及びポストコールメソッドが、当該アプリケーションコンポーネントのソースファイルを解析することでイベントログの取得対象となるメソッドの前後に自動挿入されたものであることを特徴とする。
【0009】
請求項5記載の発明は、イベントログの取得対象となるメソッドのクラス名を設定する出力設定テーブルと、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有し、プリコールメソッド及びポストコールメソッドの呼び出し元のクラス名と、出力設定テーブルに設定されたクラス名とを比較し、その比較結果に基づいて、当該クラスのメソッドの処理開始から処理が返るまでのイベントログの出力状態を管理するログ管理プログラムと、ログ管理プログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後に有するアプリケーションコンポーネントとを備えることを特徴とする。
【0010】
請求項6記載の発明は、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有し、プリコールメソッド及びポストコールメソッドが呼び出されたときに、当該ポストコールメソッドの引数の情報に基づいてイベントログの出力状態を管理するログ管理プログラムと、ログ管理プログラムのプリコールメソッド及びポストコールメソッドをイベントログの取得対象となるメソッドの前後に有し、該ポストコールメソッドの呼び出し時にその引数に該イベントログの取得対象となるメソッドの成功又は失敗を示す情報を設定するアプリケーションコンポーネントとを備えることを特徴とする。
【0011】
請求項7記載の発明は、所定のテーブルにイベントログの取得対象となるメソッドを指定するための情報を設定する出力設定過程と、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有するプログラムを実行し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、前記出力設定過程で前記テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理過程と、アプリケーションコンポーネント内で、前記ログ管理過程で実行されるプログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後で呼び出す呼出過程とを有することを特徴とする。
【0012】
請求項8記載の発明は、所定のテーブルにイベントログの取得対象となるメソッドを指定するための情報を設定する出力設定過程と、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有するプログラムを実行し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、前記出力設定過程で前記テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理過程と、アプリケーションコンポーネント内で、前記ログ管理過程で実行されるプログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後で呼び出す呼出過程とをコンピュータを用いて実行するためのロギングプログラムである。請求項9記載の発明は、所定のテーブルにイベントログの取得対象となるメソッドを指定するための情報を設定する出力設定過程と、イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有するプログラムを実行し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、前記出力設定過程で前記テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理過程と、アプリケーションコンポーネント内で、前記ログ管理過程で実行されるプログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後で呼び出す呼出過程とをコンピュータを用いて実行するためのロギングプログラムを記録したコンピュータ読み取り可能な記録媒体である。
【0013】
【発明の実施の形態】
以下、図面を参照して本発明によるロギングシステムの実施の形態について説明する。図1を参照して説明する実施の形態は、1または複数のコンピュータと、その周辺機器と、そのコンピュータで実行されるプログラムとから構成されるものである。図1には、そのコンピュータの記憶装置10と、そのコンピュータに対して情報を入出力させるための設定端末21および端末等22とを示している。記憶装置10は、主記憶装置と補助記憶装置とから構成されている。記憶装置10内では、所定のOS上でログ管理プログラム11とアプリケーションコンポーネント14〜16とが実行され、また、ログ出力設定テーブル12とログファイル13とが記憶されるようになっている。
【0014】
アプリケーションコンポーネント14〜16は、アプリケーションシステムの機能を実装するプログラム(アプリケーションシステムを構成するソフトウェアの部品)であり、オブジェクト指向プログラミングにおけるクラスで実装されている。各コンポーネント中には、ログ管理プログラム11を介してイベントログに情報を出力するためのメソッドやデータが定義されている。そのメソッドによって、イベントログに記録されるログ情報が、ログ管理プログラム11へと渡されるようになっている。この場合、アプリケーションコンポーネント14、15、および16は、それぞれ、クラスA、B、およびC(=Aクラス、BクラスおよびCクラスあるいはアプリケーションクラスA、B、およびC)で定義されるオブジェクトa、b、およびcとして構成されている。各アプリケーションコンポーネント14〜16では、また、マウス、キーボード等からなる端末等22に対する操作者の操作に応じてイベントが発生するようになっている。
【0015】
ログ管理プログラム11は、各アプリケーションコンポーネント14〜16から渡されるログ情報を一括管理するプログラムであり、オブジェクト指向プログラミングにおけるクラスで実装されている。ログ管理プログラム11は、ログ出力設定テーブル12に設定された条件(情報)にもとづいて各アプリケーションコンポーネント14〜16から渡されたログ情報をイベントログに出力するかしないかを判定する。出力する場合には、各アプリケーションコンポーネント14〜16から渡されたログ情報は、複数のイベントログからなるログファイル13へと出力される。
【0016】
ログ出力設定テーブル12は、ログ出力の契機(起点および終点)となるクラス名を、出力設定クラス名として保持するファイルである。ログ出力設定テーブル12内のデータは、外部設定端末21から書き込むことができる。
【0017】
次に、本システムの設定方法および動作について図2〜図9を参照して説明する。図2は、図1に示した各アプリケーションコンポーネント14〜16においてイベントログに対してログ管理プログラム11を介して情報を出力するためのメソッドを起動するイベントのモデルを示す図である。図2に示すように、▲1▼各アプリケーションコンポーネント(オブジェクトa〜c)では、アプリケーションコンポーネント内の各メソッド呼出しの前後(呼び出し前および返り後)にそれぞれに対応するイベント(プリコールイベント31およびポストコールイベント32)が発生するように定義がなされている。▲2▼プリコールイベント31は、メソッド(アプリケーションメソッド)呼出し開始を通知するイベントで、ログ管理プログラム11のプリコールメソッドで実装される。▲3▼ポストコールイベント32は、アプリケーションメソッド呼出しの完了(返り時)を通知するイベントで、ログ管理プログラム11のポストコールメソッドで実装される。
【0018】
次に、図3を参照して、アプリケーションコンポーネント14〜16におけるプリコールメソッドおよびポストコールメソッドの実装例について説明する。本実施の形態では、ログ情報を取得する可能性のあるすべてのメソッドの前後に、ログ管理プログラム11のプリコールメソッドとポストコールメソッドを挿入するようにしている。
【0019】
図3は、ログ出力用に、図2に示すプリコールイベント31およびポストコールイベント32に対応するプリコールメソッドおよびポストコールメソッドを挿入して改変したアプリケーションクラスAのソースコードの一例を示す図である。図3では、AクラスがBクラスを呼び出す例を示している。図3において、“LogManager”はログ管理プログラム11のクラスであり、“b”はBクラスのオブジェクトである。図3に示すAクラスのソースコードでは、関数“someMethod()”内で、オブジェクトbの関数“getAccount(name)”を呼び出すソースコードの前にプリコールメソッド“LogManager.preCall(...)”を挿入し、その後にポストコールメソッド“LogManager.postCall(...)”を挿入している。
【0020】
図4は、ログ出力設定テーブル12の一例を示す図である。ログ出力設定テーブル12は、ログ出力契機となる(始点および終点となる)クラス名を保持する任意のレコード数からなるテーブルである。ログ出力設定テーブル12内のデータは、外部設定端末21等によって書き込まれる。ただし、システム内の任意のプログラムを経由してデータが書き込まれるようにしてもいい。
【0021】
次に、図5〜図9を参照して、ログ管理プログラム11について説明する。ログ管理プログラム11は、上述したように、クラスとして実装され、ログ出力設定テーブル12に設定された条件にもとづいて各アプリケーションコンポーネント14〜16から渡されたログ情報をイベントログに出力するかしないかを判定する機能を有している。ログ管理プログラム11のクラスは、出力モード(変数)と、コールカウント(変数)と、プリコードメソッド(関数)と、ポストコードメソッド(関数)とを有するように定義されている。
【0022】
出力モードは、イベントログにログ情報を出力するか否かの判定結果(出力モード)を示す値を保持する内部変数である。出力モードは、「ON」と「OFF」の2値の何れかを取りうる。出力モードが「ON」の間、イベントログが出力される。「OFF」の場合は、イベントログが出力されない。初期値は「OFF」で、ログ出力開始時に「ON」になる。出力開始契機となったメソッドの処理が返ると「OFF」になる。
【0023】
コールカウントは、自然数を、内部変数として保持するものである。コールカウントは、出力モードが「ON」の間、一連のメソッド呼出しの入れ子の階層数を表す。初期値は「0」で、出力モードが「ON」の間、プリコールイベント毎にインクリメントし、ポストコールイベント毎にデクリメントする。
【0024】
図5は、出力モードの状態遷移図である。初期状態(S51)では、コールカウントが「0」に設定され、システムが開始すると(51)、出力モードが「OFF」の状態(S52)になる。プリコールメソッドが呼び出されてプリコールイベントが発生した場合に、プリコールメソッドの呼出し元クラス名がログ出力設定テーブル12に設定された出力設定クラス名の何れかに一致したときは(52)、出力モードが「ON」の状態(S53)になり、一致しないときは出力モードは「OFF」の状態のままとなる。また、ポストコールメソッドが呼び出された場合は、出力モードは「OFF」の状態のままとなる。
【0025】
出力モードが「ON」の状態(S53)の場合に、さらにプリコールメソッドが呼び出されてプリコールイベントが発生したとき(53)には、出力モードは「ON」の状態(S53)で変化しない。ただし、コールカウントは、そのとき、プリコールイベント毎にインクリメントする。
【0026】
出力モードが「ON」の状態(S53)の場合に、ポストコールメソッドが呼び出されてポストコールイベントが発生したときには、コールカウントの値によって遷移する状態が変化する。すなわち、コールカウントが「0」より大きいとき(54)は、出力モードは「ON」の状態(S53)で変化しない。ただし、コールカウントは、ポストコールイベント毎にデクリメントする。一方、コールカウントが「0」のとき(55)は、出力モードは「OFF」の状態(S52)になる。
【0027】
出力モードが「OFF」の状態(S52)の場合に、システムが終了したときには、初期状態(S51)に遷移する。
【0028】
次に、図6および図7を参照して、ログ管理プログラム11のクラスのプリコールメソッドについて説明する。図6はプリコールメソッドの仕様を示す図表、図7はプリコールメソッドのフローチャートである。図6に示すように、プリコールメソッドは、返り値を「任意(なし、または成功/失敗)」とし、引数を「呼出し元クラス名」および「アプリケーションで定義した任意のログ情報」とする関数である。その処理内容は、▲1▼ログ出力設定テーブル12の設定内容とアプリケーションコンポーネントのクラス名を比較し、出力モードを判定・設定することと、▲2▼出力モードが「ON」の場合、コールカウントをインクリメントし、ログ出力を実行することである。
【0029】
図7を参照して、プリコールメソッドの処理の流れを説明する。プリコールメソッドでは、まず、ログ出力設定テーブル12にレコードが存在するか否かが判定される(ステップ101)。レコードが存在する場合、すなわち、ログ出力設定テーブル12に1以上の任意の出力設定クラス名が設定されている場合、次に、コールカウントが「0」か否かが判定される(ステップ102)。一方、レコードが存在しない場合は、コールカウントのインクリメント、ログ出力等の処理は行われずに、そのまま関数内の処理が終了する(ステップ101で「false」→終了)。
【0030】
次に、ステップ102で、コールカウントが「0」であると判定された場合は、ログ出力設定テーブル12からレコードを取得する処理が行われ(ステップ103)、次にプリコールメソッドのメソッド引数から呼び出し元クラス名を取得する処理が行われる(ステップ104)。続いてレコード内のクラス名のいずれかに呼出し元クラス名が一致するか否かが判定される(ステップ105)。一致した場合、出力モードを「ON」にする処理が行われ(ステップ106)、一致しなかった場合、関数内の処理が終了する(ステップ105で「false」→終了)。
【0031】
ステップ106で出力モードを「ON」にした場合、および、ステップ102でコールカウントが「0」でないと判定された場合、コールカウントをインクリメントする処理が行われる(ステップ107)。次に、次にプリコールメソッドのメソッド引数からアプリケーションコンポーネント内で定義された任意のログ情報を取得する処理が行われた後、取得したログ情報に基づいてログファイル13に対するログ出力が行われる(ステップ108)。ここで、関数内の処理が終了する。
【0032】
次に、図8および図9を参照して、ログ管理プログラム11のクラスのポストコールメソッドについて説明する。図8はポストコールメソッドの仕様を示す図表、図9はポストコールメソッドのフローチャートである。図8に示すように、ポストコールメソッドは、返り値を「任意(なし、または成功/失敗)」とし、引数を「アプリケーションで定義した任意のログ情報」とする関数である。その処理内容は、▲1▼出力モード「ON」の場合、コールカウントをデクリメントし、ログ出力することと、▲2▼デクリメントによってコールカウントが「0」になったら出力モードを「OFF」にすることである。
【0033】
図9を参照して、ポストコールメソッドの処理の流れを説明する。ポストコールメソッドでは、まず、出力モードが「ON」か否かが判定される(ステップ111)。出力モードが「ON」の場合、コールカウントをデクリメントする処理が行われ(ステップ112)、続いてログ出力が行われる(ステップ113)。次に、コールカウントが「0」か否かを判定する処理が行われる(ステップ114)。ステップ114でコールカウントが「0」と判定された場合、出力モードを「OFF」にする処理が行われて(ステップ115)、関数内の処理が終了する。
【0034】
一方、ステップ111で出力モードが「ON」でないと判定された場合、および、ステップ114でコールカウントが「0」でないと判定された場合、コールカウントのデクリメント、ログ出力等の処理は行われずに関数内の処理が終了する。
【0035】
次に、図10および図11を参照して、図1に示すロギングシステムにおける処理の流れについて具体例を示して説明する。図10は、図1のロギングシステムにおけるログ出力の際の一連の処理の流れを示すシークエンス図であり、図11は、図10に示す各ログ出力時の出力例を示す図である。この場合、ログ設定テーブル12には、クラスAを出力設定クラスとするレコードが存在するものとする。また、ログ管理プログラム11の遷移状態は図5に示す初期状態(S51)にあるものとする。
【0036】
また、図10に示す例は、Aクラスのオブジェクトa(図1の参照符号14)→Bクラスのオブジェクトb(15)→Cクラスのオブジェクトc(16)の順に各オブジェクトのメソッドが呼出される処理の一例である。この例では、アカウント××取得処理を行うために(「××」は任意のアカウント名を表す。)、Aクラスのオブジェクトa(14)がBクラスのオブジェクトb(15)のメソッド「getAccount」を呼び出し、Bクラスのオブジェクトb(15)のメソッド「getAccount」がアカウント××有効チェック処理を行うために、Cクラスのオブジェクトc(16)のメソッド「isVaid」を呼び出す処理を行うこととしている。
【0037】
また、Aクラスのオブジェクトa(14)からBクラスのオブジェクトb(15)のメソッド「getAccount」を呼び出すステップの前後には、図3に示すようにプリコールメソッドおよびポストコールメソッドが挿入されていて、同様に、Bクラスのオブジェクトb(15)のメソッド「getAccount」がCクラスのオブジェクトc(16)のメソッド「isVaid」を呼び出すステップの前後にも図3に示すようなプリコールメソッドおよびポストコールメソッドが挿入されているものとする。
【0038】
したがって、図10に示すように、Aクラスのオブジェクトa(14)がBクラスのオブジェクトb(15)のメソッド「getAccount」を呼び出す際には、ログ管理プログラム11のクラスのプリコールメソッドが呼び出されることになる(ステップ201)。ログ管理プログラム11では、この場合、図5および図7を参照して説明したように、出力モードが「OFF」から「ON」に変化するとともに、コールカウントに「1」がセットされる(ステップ202)。そして、ログ出力が行われて(ステップ203)、プリコールメソッドの引数に基づいて例えば図11のログ情報221(「アカウント××取得処理開始/呼び出し元:Aクラス/呼び出し先:Bクラス/メソッド:getAccount」)がログファイル13に記録される。
【0039】
次に、実際に、Aクラスのオブジェクトa(14)からBクラスのオブジェクトb(15)のメソッド「getAccount」の呼び出し処理が行われる(ステップ204)。この場合、Bクラスのオブジェクトb(15)のメソッド「getAccount」は、さらに、Cクラスのオブジェクトc(16)のメソッド「isVaid」を呼び出す処理を行う。その際、Bクラスのオブジェクトb(15)では、Cクラスのオブジェクトc(16)のメソッド「isVaid」を呼び出す処理の前に、ログ管理プログラム11のクラスのプリコールメソッドを呼び出す処理が行われる(ステップ205)。ログ管理プログラム11では、出力モードが「ON」となっているので、コールカウントがインクリメントされて値が「2」になり(ステップ206)、その後、ログ出力が行われる(ステップ207)。ここでは、プリコールメソッドの引数に基づいて、例えば図11のログ情報222(「アカウント××有効チェック処理開始/呼び出し元:Bクラス/呼び出し先:Cクラス/メソッド:isVaid」)がログファイル13に記録される。
【0040】
次に、実際に、Bクラスのオブジェクトb(15)のメソッド「getAccount」からCクラスのオブジェクトc(16)のメソッド「isVaid」を呼び出す処理が行われる(ステップ208)。ここで、Cクラスのオブジェクトc(16)のメソッド「isVaid」が実行されて(ステップ209)、応答信号がBクラスのオブジェクトb(15)に渡される(ステップ210)。次に、ログ管理プログラム11のクラスのポストコールメソッドが呼び出される(ステップ211)。
【0041】
ログ管理プログラム11では、この場合、図5および図9を参照して説明したように、コールカウントがデクリメントされて値が「1」になり(ステップ212)、その後、ログ出力が行われる(ステップ213)。この場合、ポストコールメソッドの引数に基づいて例えば図11のログ情報223(「アカウント××有効チェック処理失敗(アカウント名無効)/呼び出し元:Bクラス/呼び出し先:Cクラス/メソッド:isValid」)がログファイル13に記録される。
【0042】
次に、Bクラスのオブジェクトb(15)のメソッド「getAccount」が終了すると、応答信号がAクラスのオブジェクトa(14)に渡される(ステップ214)。次に、Aクラスのオブジェクトa(14)から、ログ管理プログラム11のクラスのポストコールメソッドが呼び出される(ステップ215)。
【0043】
ログ管理プログラム11では、この場合、図5および図9を参照して説明したように、出力モードが「ON」から「OFF」に変化するとともに、コールカウントがデクリメントされて「0」にリセットされる(ステップ216)。次に、ログ出力が行われて(ステップ217)、ポストコールメソッドの引数に基づいて例えば図11のログ情報224(「アカウント××取得処理失敗(アカウント取得不可)/呼び出し元:Aクラス/呼び出し先:Bクラス/メソッド:getAccount」)がログファイル13に記録される。
【0044】
以上説明したように、本実施の形態は、アプリケーションコンポーネント(アプリケーションプログラム)がログを直接外部出力せず、ログ管理プログラム11がログ出力設定テーブル12を参照しながら各アプリケーションコンポーネント14〜16からのログ情報を一括管理してログ出力するソフトウェア構成を採用している。また、ログ管理プログラム11における、メソッド呼出しの入れ子の階層数のカウントによって、一連の複数メソッド呼出しの起点と終点を把握する仕組みを用いるようにしている。そのため、クラス名を指定することでイベントログの取得範囲を指定することが可能となり、また、メソッド呼出しが入れ子状態となっていても、該当クラスのメソッドの処理開始から処理が返るまでのログを取得することが可能となった。さらに、システム動作中にログ出力設定テーブル12の内容を変更することで、ログ対象のコンポーネント(クラス)名を動的に変更したり指定することが可能となった。また、該当クラスの次のメソッド呼出しを起点とし、該当クラスの呼出しに処理が戻ってくるまでのイベントログを出力させることができるようになった。
【0045】
次に、本実施の形態のシステム全体の設定と動作について、本システムを開発時に使用する場合と、運用時に使用する場合とに分けて説明する。まず、開発時について説明する。
【0046】
開発時には、まず、▲1▼出力させる可能性のあるイベントログを全てアプリケーションコンポーネント内に定義しておく。すなわち、イベントログに出力すべきログ情報を各アプリケーションコンポーネント内に定義しておくのである。次に、▲2▼ログ管理プログラムを実装する。そして、▲3▼各アプリケーションコンポーネントに、ログ管理プログラムへログ情報を送信するメソッド(プリコールメソッドおよびポストコールメソッド)を実装する。
【0047】
一方、運用時には、まず、▲1▼外部設定端末によって、ログ出力設定テーブルに所望のクラス名を設定する。▲2▼システム運転中は、▲1▼で設定したクラス(オブジェクト)のメソッドが呼出されるのを契機に、ログ出力が開始される。そして、▲3▼呼出されたメソッドに処理が戻るまでの間、ログ情報がファイル出力される。
【0048】
次に、図1〜図9を参照して説明した上記実施の形態の変形例について説明する。ここでは、(ア)ログ取得範囲を指定する方法のカスタマイズ、(イ)マルチスレッド対応、(ウ)アプリケーションコンポーネントへプリコールメソッド、ポストコールメソッドを自動挿入する場合の変形例、および、(エ)不安定な動作をするコンポーネントのログだけを取得する場合の変形例に分けて説明する。
【0049】
(ア)ログ取得範囲を指定する方法のカスタマイズ:上記実施の形態では、ログ取得範囲として、始点および終点となる「クラス名」を指定しているが、下記のように、クラス名以外の属性(▲1▼〜▲5▼)によってログ取得範囲を指定することも可能である。さらに、下記の1または複数の属性とクラス名、あるいは複数の属性を組み合わせることも可能である。各属性は、例えば、図1のログ出力設定テーブル12に、各属性に対応するフィールドを追加することで設定可能である。
【0050】
▲1▼メソッド指定:特定のメソッドを起点とする処理間のログを取得したい場合には、上記実施の形態に以下のカスタマイズを行うことで実現可能である。
【0051】
1)プリコールメソッドおよびポストコールメソッドの引数にアプリケーションクラスのメソッド名を含ませる。そして、2)出力設定テーブルに、クラス名フィールドに対応してメソッド名フィールドを追加する。そして、3)ログ管理プログラム11内では、クラス名とメソッド名を判定条件とすることで出力モードの設定を行うようにする。
【0052】
▲2▼トランザクション指定:DB(データベース)の更新、ロールバック等のトランザクション管理のため、一連のメソッド呼び出しに対してトランザクション境界を設定することがある。トランザクション境界の内側のログだけを出力させることは、以下のカスタマイズによって実現可能である。
【0053】
1)プリコールおよびポストコール毎に、アプリケーションメソッドにトランザクションが設定されているか否かを判定し、設定されている場合はトランザクションID(識別符号)を取得する。そして、2)同一のトランザクションIDが設定されたメソッドをログ出力するようにする。ただし、トランザクションIDを取得するメソッドをアプリケーションクラスで実装することが前提である。
【0054】
▲3▼セッション指定:HTTP(HyperText Transfer Protocol)セッション管理のために、複数のHTTPコネクションに渡る端末要求に対して、同一のセッションIDを付与して、一連のメソッド間でセッションIDを持ち回ることがある。同一セッションの呼び出しのみをログ出力させることは、前記のトランザクションIDの代わりにセッションIDを用いることで実現できる。
【0055】
▲4▼イベントレベル指定:システム運転へ影響の大きいイベントログだけを取得した場合がある。Fatal、Warning、Error、Information等のイベントレベルを閾値とし、閾値以上のイベントだけをログ出力させることが可能である。
【0056】
Fatal、Warning、Error、Informationのレベルの場合の例:1)プリコールイベントのイベントレベルは、全てinformation(エラーではない情報通知のレベル)とする。2)ポストコールイベントのイベントレベルは、各アプリケーションメソッドの返り値毎に定義する。返り値にはイベントレベルデータを含ませ、ポストコールメソッドの引数によってログ管理プログラムへ渡す。3)ログ出力設定テーブルに閾値レベルを追加する。4)ログ管理プログラムは、ログ出力設定テーブル内の閾値と、アプリケーションから渡されたレベルを比較し、適宜出力する。
【0057】
▲5▼のべ呼出し回数指定:ソフトウェア改造時、初期不良をチェックするために初期運転期間だけ、ログを取得したい場合がある。指定したのべ呼出し回数に達するまで、ログ出力させる。この場合、1)同一コンポーネント(もしくはメソッド)の呼び出しのべ回数に閾値を設け、ログ出力テーブルに設定する。2)コンポーネント(もしくはメソッド)毎にプリコールメソッドののべ呼出し回数を常時カウントする。そして、3)カウント数と閾値を比較して、適宜出力する。
【0058】
(イ)マルチスレッド対応:上記実施の形態では、アプリケーションクラスがシングルスレッドで動作することを前提とするが、マルチスレッド時には、イベント毎にスレッドIDを取得し、スレッドID毎にコールカウントを管理することで対応可能である。
【0059】
(ウ)アプリケーションコンポーネントへのプリコールメソッド、ポストコールメソッドの自動挿入:開発時に、各コンポーネントにプリコールメソッドとポストコールメソッドを挿入する作業はコンポーネント数が多い場合に煩雑な作業となるが、ソース解析機能と組み合わせれば、容易に該当クラスのメソッドの前後に両メソッドのテンプレートを自動挿入することができ、開発稼動を削減できる。以下、図12を参照して、プリコールメソッドおよびポストコールメソッドを自動挿入する場合の構成について説明する。
【0060】
図12を参照して説明するロギング用のメソッドをソースコード中に一括自動挿入する方法では、オブジェクト指向言語(Java(登録商標)、C++等)のソースコードに対して、ログ取得対象とするクラスを指定して、そのクラスのメソッドがソースコード中に存在した場合、その前後の行にロギングメソッド(プリコールメソッドおよびポストコールメソッド)を自動一括挿入する。より具体的に説明すると、例えば、取得する可能性のあるクラスを「ログ取得対象クラスリスト」に挙げ、そのクラスのうちから、運用中に特に指定して出力させるクラスを、上記実施の形態と同様にログ出力設定テーブルに記述するようにする。以下、1)および2)に項目分けして説明する。
【0061】
1)ログ取得対象クラスリスト作成:まず、図12(a)に示すように、自作したクラス名をすべて列挙して、ログ取得対象クラスリストを作成する。この自作したクラス名をすべて列挙するログ取得対象クラスリストは、その作成を省略することも可能である。ただし、このリストを作成しない場合、標準ライブラリとして提供されているクラスもログ取得され、煩雑になりかねないのでその点に留意する必要がある。ログ取得対象クラスリストの作成は、例えば、人が手作業で実施する。ログ取得対象クラスリストの内容は、クラス名もしくはパッケージ名+クラス名等のクラスを一意付ける文字を含むものとする。
【0062】
2)ソースコードへのロギングメソッド挿入:ロギングメソッド挿入は、以下のa)〜c)の処理によって行うことができる。
【0063】
a)ソースコード中、ログ取得対象クラスリスト内のクラスの型で宣言されたインスタンス変数を検出する。ここで、クラスの型とは、クラス名のことである。図12(b)に示す例では、「MyClass1」がクラスの型であり、「c1」がインスタンス変数名である。
【0064】
b)検出されたインスタンス変数へのメソッド呼出しを検出する。ただし、宣言された行と同一のスコープにあることを確認する。これはスコープの境界を示す文字「{}や「」」を検出することで実現可能である。ここで、スコープとは、カッコ等で挟まれた変数名の宣言が有効な範囲のことである。例えば、図12(c)に示す例では、Java(登録商標)言語の場合、「c1.methodA();」を検出し、C++言語の場合、「c1−>methodA();」を検出する。
【0065】
c)そして、検出されたメソッド呼出しの前後にロギングメソッドを挿入する。例えば、「c1.methodA();」に対しては、図12(d)に示すように、その前後に、「LogManager.preCall();」というプリコールメソッドを挿入するとともに、「LogManager.postCall();」というポストコールメソッドを挿入する。
【0066】
(エ)不安定な動作をするコンポーネントのログだけを取得する方法:この方法について、図13〜図15を参照して説明する。この方法では、複数のコンポーネント間の一連の呼出しにおいて、不安定なコンポーネントを「一連の呼び出しの中で最初にエラーを発生させたコンポーネント」と定義する。例えば、コンポーネントAから呼出しが開始し、正常動作の場合はコンポーネントA→B→C→D→E→D→C→B→AとコンポーネントAへ処理が返る場合、コンポーネントD内の処理がエラーとなると、コンポーネントDはコンポーネントEを呼び出さずにコンポーネントCへエラーを示すメッセージを返す。この時、一連の呼出し処理はコンポーネントA→B→C→D→C→B→Aとなる。コンポーネントDからエラーを返されたコンポーネントCもまた、エラーをコンポーネントBに返し、コンポーネントBも同様にコンポーネントAへエラーを返すが、この場合、コンポーネントC、Bの処理自体にはエラーはない。よって、不安定な動作をするコンポーネントのログだけを取得するにはエラーの発生源であるコンポーネントDのログだけを取得できればよい。
【0067】
実現方法:図1を参照して説明した上記実施の形態に対し、以下のa)〜c)のカスタマイズを施すことで実現可能である。
【0068】
a)各アプリケーションコンポーネントの全アプリケーションメソッドに対し、返り値に成功と失敗を定義し、ポストコールメソッドの引数にそのアプリケーションメソッドの返り値(成功/失敗)を含ませる。
【0069】
b)ログ管理プログラムは出力履歴値を変数として保持する。図13は、ログ管理プログラムの出力履歴値の状態遷移図である。初期状態(S71)で、システムが開始すると(71)、出力履歴値は「0」に設定された状態になる(S72)。出力履歴値が「0」の状態(S72)で、プリコールイベントが発生した場合(72)は、出力履歴値に変化は発生しない。一方、出力履歴値が「0」の状態(S72)で、ポストコールイベントが発生した場合に、ログ出力が実行される条件が整っているとき(72)は、出力履歴値が「1」に設定された状態になる(S73)。また、出力履歴値が「0」の状態(S72)で、ポストコールイベントが発生した場合に、ログ出力が実行される条件が整っていないとき(74)は、出力履歴値に変化は発生しない。
【0070】
出力履歴値が「1」の状態(S73)で、プリコールイベントが発生した場合(75)は、出力履歴値に変化は発生しない。また、出力履歴値が「1」の状態(S73)で、ポストコールイベントが発生した場合に、コールカウントが「0」より大きいとき(76)も、出力履歴値に変化は発生しない。一方、出力履歴値が「1」の状態(S73)で、ポストコールイベントが発生した場合に、コールカウントが「0」に等しいとき(77)は、出力履歴値は「1」に設定される状態になる(S72)。
【0071】
c)プリコールメソッド、ポストコールメソッドはそれぞれ図14、図15のフローチャートを実装する。図14は、プリコールメソッドのフローチャートであり、図15は、ポストコールメソッドのフローチャートである。
【0072】
図14に示すように、本変形例のプリコールメソッドでは、コールカウントがインクリメントされて、処理が返えるようになっている。一方、本変形例のポストコールメソッドでは、図15に示すように、まず、コールカウントがデクリメントする(ステップ211)。次に、ポストコールメソッド引数内のアプリケーションメソッドの返り値がエラーか否かが判定される(ステップ212)。ステップ212で返り値がエラーであると判定された場合、出力履歴値が「0」か否かが判定される(ステップ213)。ステップ213で出力履歴値が「0」であると判定された場合、ログ出力が行われ(ステップ214)、続いて出力履歴値が「1」に設定される(ステップ215)。次に、コールカウントが「0」か否かが判定され(ステップ216)、「0」である場合は、出力履歴値が「0」にされ(ステップ217)、処理が終了する。一方、ステップ212で返り値がエラーでないと判定された場合、および、ステップ213で出力履歴値が「0」でないと判定された場合、そのまま処理が終了する。
【0073】
不安定な動作をするコンポーネントのログだけを取得する方法については、上記実施の形態と比較した場合、図5の代わりに図13、図7の代わりに図14、そして、図9の代わりに図15に示す各機能あるいは構成を用いることになる。また、図10についてはログの出力タイミングが変わる。そして、図8に関しては、ポストコールメソッドの仕様が変わり、引数に「アプリケーションメソッドの返値(成功/失敗)」が追加になる。
【0074】
以上、本発明の実施の形態およびその変形例について説明したが、本発明の実施の形態は上記のものに限定されることなく、例えば、コンピュータ、端末等の各構成、プログラム、コンポーネントプログラム等のソフトウェアや、ログ管理テーブルやログファイルのファイルについては、それらをネットワーク等を介して分散して配置する等の変更を適宜、適用可能である。また、本発明の構成要素となるプログラムの全部または一部は、コンピュータ読み取り可能な記録媒体や通信回線を介して頒布することが可能である。
【0075】
また、特許請求の範囲の記載においては、装置、方法等のカテゴリを適宜変更可能である。例えば、請求項5や請求項6記載のシステムは、請求項1のシステムと請求項7記載の方法との間の関係と同様にして、方法の発明とすることが可能である。
【0076】
【発明の効果】
本発明によれば、イベントログの取得対象となるメソッドを指定するための情報を設定する出力設定テーブルを設け、ログ管理プログラムにおいてプリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、出力設定テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するようにしたので、イベントログに出力させる箇所を効率よく限定したり、指定したりすることができ、また、イベントログに出力させる箇所を効率良く動的に変更可能とすることができる。
【図面の簡単な説明】
【図1】本発明によるロギングシステムの一実施の形態のソフトウェア構成等の構成を示すシステム図。
【図2】図1に示す構成におけるイベントモデルを示す図。
【図3】図1に示すアプリケーションコンポーネントA(14)のソースコードの一例を示す図。
【図4】図1のログ出力設定テーブル12の一構成例を示す図。
【図5】図1のログ管理プログラム11内の変数である出力モードの状態遷移図。
【図6】図1のログ管理プログラム11内の関数であるプリコールメソッドの仕様を示す図表。
【図7】図1のログ管理プログラム11内の関数であるプリコールメソッドのフローチャート。
【図8】図1のログ管理プログラム11内の関数であるポストコールメソッドの仕様を示す図表。
【図9】図1のログ管理プログラム11内の関数であるポストコールメソッドのフローチャート。
【図10】図1のシステムにおけるイベントログに関する一連の処理のシークエンス図。
【図11】図10に示すイベントログに関する一連の処理におけるログファイル13への出力例を示す図。
【図12】図1に示す実施の形態の変形例(プリコールメソッドおよびポストコールメソッドを自動挿入する例)を説明するための図。
【図13】図1に示す実施の形態の他の変形例(不安定な動作をするコンポーネントのログだけを取得する例)における出力履歴値の状態遷移図。
【図14】図13の変形例におけるプリコールメソッドのフローチャート。
【図15】図13の変形例におけるポストコールメソッドのフローチャート。
【符号の説明】
11 ログ管理プログラム
12 ログ出力設定テーブル
13 ログファイル
14〜16 アプリケーションコンポーネント
21 設定端末
22 端末等
31 プリコールイベント(実装:プリコールメソッド)
32 ポストコールイベント(実装:ポストコールメソッド)
Claims (9)
- イベントログの取得対象となるメソッドを指定するための情報を設定する出力設定テーブルと、
イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、出力設定テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理プログラムと、
ログ管理プログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後に有するアプリケーションコンポーネントと
を備えることを特徴とするロギングシステム。 - 前記出力設定テーブルに設定される情報が、クラス名、メソッド名、トランザクション、セッション、イベントレベル又は当該メソッドの呼び出しのべ回数のしきい値の1又は複数であることを特徴とする請求項1記載のロギングシステム。
- 前記ログ管理プログラムが、前記アプリケーションプログラム複数間のメソッド呼び出しの入れ子の階層数に基づいて、一連の前記複数のアプリケーションコンポーネントのメソッド呼び出しの起点と終点とを把握し、イベントログの出力状態をその起点と終点に応じて管理することを特徴とする請求項1又は2記載のロギングシステム。
- 前記アプリケーションコンポーネントにおけるログ管理プログラムのプリコールメソッド及びポストコールメソッドが、当該アプリケーションコンポーネントのソースファイルを解析することでイベントログの取得対象となるメソッドの前後に自動挿入されたものであることを特徴とする請求項1〜3のいずれか1項に記載のロギングシステム。
- イベントログの取得対象となるメソッドのクラス名を設定する出力設定テーブルと、
イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有し、プリコールメソッド及びポストコールメソッドの呼び出し元のクラス名と、出力設定テーブルに設定されたクラス名とを比較し、その比較結果に基づいて、当該クラスのメソッドの処理開始から処理が返るまでのイベントログの出力状態を管理するログ管理プログラムと、
ログ管理プログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後に有するアプリケーションコンポーネントと
を備えることを特徴とするロギングシステム。 - イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有し、プリコールメソッド及びポストコールメソッドが呼び出されたときに、当該ポストコールメソッドの引数の情報に基づいてイベントログの出力状態を管理するログ管理プログラムと、
ログ管理プログラムのプリコールメソッド及びポストコールメソッドをイベントログの取得対象となるメソッドの前後に有し、該ポストコールメソッドの呼び出し時にその引数に該イベントログの取得対象となるメソッドの成功又は失敗を示す情報を設定するアプリケーションコンポーネントと
を備えることを特徴とするロギングシステム。 - 所定のテーブルにイベントログの取得対象となるメソッドを指定するための情報を設定する出力設定過程と、
イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有するプログラムを実行し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、前記出力設定過程で前記テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理過程と、
アプリケーションコンポーネント内で、前記ログ管理過程で実行されるプログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後で呼び出す呼出過程と
を有することを特徴とするロギング方法。 - 所定のテーブルにイベントログの取得対象となるメソッドを指定するための情報を設定する出力設定過程と、
イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有するプログラムを実行し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、前記出力設定過程で前記テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理過程と、
アプリケーションコンポーネント内で、前記ログ管理過程で実行されるプログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後で呼び出す呼出過程と
をコンピュータを用いて実行するためのロギングプログラム。 - 所定のテーブルにイベントログの取得対象となるメソッドを指定するための情報を設定する出力設定過程と、
イベントログの取得対象となるメソッドの呼び出し前に呼び出されるプリコールメソッドと、当該メソッドの返り後に呼び出されるポストコールメソッドとを有するプログラムを実行し、プリコールメソッド及びポストコールメソッドの呼び出し元に係る情報と、前記出力設定過程で前記テーブルに設定された情報とを比較し、その比較結果に基づいてイベントログの出力状態を管理するログ管理過程と、
アプリケーションコンポーネント内で、前記ログ管理過程で実行されるプログラムのプリコールメソッド及びポストコールメソッドを、イベントログの取得対象となるメソッドの前後で呼び出す呼出過程と
をコンピュータを用いて実行するためのロギングプログラムを記録したコンピュータ読み取り可能な記録媒体。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002251637A JP2004094374A (ja) | 2002-08-29 | 2002-08-29 | ロギングシステム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002251637A JP2004094374A (ja) | 2002-08-29 | 2002-08-29 | ロギングシステム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2004094374A true JP2004094374A (ja) | 2004-03-25 |
Family
ID=32058175
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002251637A Pending JP2004094374A (ja) | 2002-08-29 | 2002-08-29 | ロギングシステム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2004094374A (ja) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2008056419A1 (fr) * | 2006-11-09 | 2008-05-15 | Panasonic Corporation | Dispositif de vérification de logiciel et procédé d'évaluation d'interface api |
JP2008217721A (ja) * | 2007-03-07 | 2008-09-18 | Ntt Data Corp | プログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラム |
JP2009042951A (ja) * | 2007-08-08 | 2009-02-26 | Hitachi Consulting Co Ltd | プログラム中のデータ抽出方法及び装置 |
JP2009245066A (ja) * | 2008-03-31 | 2009-10-22 | Nomura Research Institute Ltd | ソフトウェアマイグレーションシステム及び方法 |
US7657346B2 (en) | 2004-04-23 | 2010-02-02 | Fanuc Ltd | Object picking system |
JP2010033543A (ja) * | 2008-06-24 | 2010-02-12 | Smg Kk | ソフトウエア動作監視システム、そのクライアントコンピュータおよびサーバコンピュータ、並びに、そのプログラム |
JP2010152428A (ja) * | 2008-12-24 | 2010-07-08 | Hitachi Ltd | プログラム開発支援機器、方法およびプログラム |
JP2010528375A (ja) * | 2007-05-21 | 2010-08-19 | クゥアルコム・インコーポレイテッド | モバイルオペレーティング環境のための、イベント制御された連続的なロギングを提供すること |
US9804908B2 (en) | 2013-10-09 | 2017-10-31 | Fujitsu Limited | Log output condition setting method and apparatus |
-
2002
- 2002-08-29 JP JP2002251637A patent/JP2004094374A/ja active Pending
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7657346B2 (en) | 2004-04-23 | 2010-02-02 | Fanuc Ltd | Object picking system |
WO2008056419A1 (fr) * | 2006-11-09 | 2008-05-15 | Panasonic Corporation | Dispositif de vérification de logiciel et procédé d'évaluation d'interface api |
JP2008217721A (ja) * | 2007-03-07 | 2008-09-18 | Ntt Data Corp | プログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラム |
JP2010528375A (ja) * | 2007-05-21 | 2010-08-19 | クゥアルコム・インコーポレイテッド | モバイルオペレーティング環境のための、イベント制御された連続的なロギングを提供すること |
JP2013211019A (ja) * | 2007-05-21 | 2013-10-10 | Qualcomm Inc | モバイルオペレーティング環境のための、イベント制御された連続的なロギングを提供すること |
JP2015097107A (ja) * | 2007-05-21 | 2015-05-21 | クゥアルコム・インコーポレイテッドQualcomm Incorporated | モバイルオペレーティング環境のための、イベント制御された連続的なロギングを提供すること |
JP2009042951A (ja) * | 2007-08-08 | 2009-02-26 | Hitachi Consulting Co Ltd | プログラム中のデータ抽出方法及び装置 |
JP2009245066A (ja) * | 2008-03-31 | 2009-10-22 | Nomura Research Institute Ltd | ソフトウェアマイグレーションシステム及び方法 |
JP2010033543A (ja) * | 2008-06-24 | 2010-02-12 | Smg Kk | ソフトウエア動作監視システム、そのクライアントコンピュータおよびサーバコンピュータ、並びに、そのプログラム |
JP2010152428A (ja) * | 2008-12-24 | 2010-07-08 | Hitachi Ltd | プログラム開発支援機器、方法およびプログラム |
US9804908B2 (en) | 2013-10-09 | 2017-10-31 | Fujitsu Limited | Log output condition setting method and apparatus |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111124906B (zh) | 基于动态埋点的跟踪方法、编译方法、装置和电子设备 | |
US7275239B2 (en) | Run-time wait tracing using byte code insertion | |
US8423969B2 (en) | Inheritance breakpoints for use in debugging object-oriented computer programs | |
KR100868762B1 (ko) | 임베디드용 소프트웨어의 오류 검출 방법 | |
US8561034B2 (en) | Software fault injection in java enterprise applications | |
CN110941528B (zh) | 一种基于故障的日志埋点设置方法、装置及系统 | |
US7496903B2 (en) | Synthesizing application response measurement (ARM) instrumentation | |
US7966602B1 (en) | Incremental modification detector, and methods, systems, and apparatus for implementing the same | |
US9223681B2 (en) | Automated debug trace specification | |
US7493622B2 (en) | Use of thread-local storage to propagate application context in Java 2 enterprise edition (J2EE) applications | |
US7818721B2 (en) | Dynamic application tracing in virtual machine environments | |
US7484209B2 (en) | Instrumenting java code by modifying bytecodes | |
US8464225B2 (en) | Method and system for adaptive, generic code instrumentation using run-time or load-time generated inheritance information for diagnosis and monitoring application performance and failure | |
US7437734B2 (en) | Propagating web transaction context into common object model (COM) business logic components | |
US8402428B2 (en) | Method and apparatus for automatically generating source code files in a file storage unit | |
US20050273765A1 (en) | Object-oriented creation breakpoints | |
US8782607B2 (en) | Contract failure behavior with escalation policy | |
US10545852B2 (en) | Diagnostics of state transitions | |
US9652353B2 (en) | Monitoring business transaction failures involving database procedure calls | |
US9459991B2 (en) | Heap dump object identification in a heap dump analysis tool | |
US20150106659A1 (en) | Monitoring and diagnostics of business transaction failures | |
CN110879781A (zh) | 程序调试方法、装置、电子设备及计算机可读存储介质 | |
US7448039B2 (en) | Method and system for logging test data | |
JP2004094374A (ja) | ロギングシステム | |
CN110928777B (zh) | 测试用例的处理方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20041203 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20050104 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20050510 |