アプリケーションの障害原因の特定作業支援システム
【課題】 アプリケーションに障害が発生した際、障害の根本的な原因となる処理を行っている箇所を特定する作業を支援するためのシステムを提供すること。
【解決手段】 対象となるアプリケーションに追跡ログを出力するための処理を実装し、エラー発生時にアプリケーションが出力した追跡ログをログ分析手段で読み込み、そのエラーが発生するに至った処理経路を示すログと、同様の処理経路を示しているエラー発生時点以前のログとを比較し、呼び出し関係が異なる処理部分を抽出して出力する。
【解決手段】 対象となるアプリケーションに追跡ログを出力するための処理を実装し、エラー発生時にアプリケーションが出力した追跡ログをログ分析手段で読み込み、そのエラーが発生するに至った処理経路を示すログと、同様の処理経路を示しているエラー発生時点以前のログとを比較し、呼び出し関係が異なる処理部分を抽出して出力する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、アプリケーションのログから当該アプリケーションの動作を追跡し、障害が発生した原因を特定する作業を支援するアプリケーションの障害原因の特定作業支援システムに関するものである。
【背景技術】
【0002】
アプリケーションに含まれるバグが原因で障害が発生し、ユーザに大きな損害を与えるという事例がよく見られる。このため、バグを一切含まないアプリケーションを開発することが求められるが、そのようなアプリケーションを開発するのは非常に困難である。そこで、仮にアプリケーションが障害を起こしたとしても、早急に障害の原因を突き止め、対策をとるための手段が重要となる。
アプリケーションの障害の原因を突き止めるための効果的な手段の1つとして、アプリケーションにログを出力する処理を実装する方法がある。この方法によれば、アプリケーション管理者は、アプリケーションが出力するログを監視することでアプリケーションに障害が発生したことを検知できる。また、ログには障害の直接の原因となった処理を行っている箇所(ソースコードの行番号)の情報が記録されているため、アプリケーション管理者はログを確認し、ログとアプリケーションのソースコードを比較することで、ソースコード中から障害の直接の原因箇所を突き止めることが可能となる。
【0003】
しかし、上述の作業は全てアプリケーション管理者の目視と推測によって行われるため、アプリケーションの規模、もしくは出力されるログの量が大きくなるにつれて、作業のコストは増大し、また人手による作業であるためミスが発生する可能性も高まる。
【0004】
上述の問題を解決するために、ログ分析ツールなどを使用して障害の原因を突き止める方法がある。ログ分析ツールとは、アプリケーションが出力したログを読み込み、ログを確認し易いような形式で一覧表示し、各ログとアプリケーションのソースコードを関連付けて表示するツールである。障害の発生を示すログを一覧から選択することで、その障害の直接の原因となった処理を行っているソースコード中の箇所をツールが強調表示(ハイライト表示)するため、迅速な障害追跡が可能となる。
【0005】
なお、本発明に関連する公知技術文献としては下記の特許文献1が挙げられる。
特許文献1では、保守用端末が計算機から受け取ったメッセージのログと、保守用端末が計算機へ送信したメッセージのログがあり、一方のログを閲覧する際、もう一方のログも同時に表示し、さらに一方のログに含まれる時刻情報から、近い時間帯に出力されたもう一方のログのメッセージを追従して表示している。同時間帯に出力された複数のログ同士の関係を即座に把握することができるため、障害追跡の支援に有効である。
【0006】
【特許文献1】特開2001−101035号公報
【発明の開示】
【発明が解決しようとする課題】
【0007】
しかしながら、上述のログ分析ツールにあっては、障害の直接の原因となった処理を行っている箇所は発見できるものの、その障害が発生した根本的な原因は発見できない。
すなわち、多くのアプリケーションでは、障害の直接の原因となった処理を行っている一箇所のみを修正するだけで障害が解決するようなケースは稀である。障害の直接の原因となった処理を行っている箇所以外に、その障害の根本的な原因となる処理を行っている箇所が別に存在し、その部分を修正して初めて障害が完全に解決する、といったケースが多々見られる。
上述のツールでは、障害発生を示すログと、そのログが出力される直前のログを見ることで、根本的な原因を大まかに突き止めることは可能であるが、これは比較的困難な作業である。また、特許文献1においても、この問題は解決できていない。
【0008】
本発明の目的は、アプリケーションの障害の根本的な原因箇所を突き止めるために、アプリケーションが出力するログを分析し、障害の根本的な原因箇所を突き止める作業を大幅に軽減することができるアプリケーションの障害原因の特定作業支援システムを提供することにある。
【課題を解決するための手段】
【0009】
上記目的を達成するために、本発明のアプリケーション障害原因の特定支援システムは、対象となるアプリケーションに処理単位毎のログ出力処理を実装するログ出力処理実装手段と、前記対象となるアプリケーションが処理単位毎に出力したログデータを読み込み、そのログデータを分析するログ分析手段とから構成され、
前記ログ分析手段が、
前記処理単位毎のログデータから前記アプリケーションを構成する各処理単位の呼び出し関係を示すコールフローグラフを作成し、コールフローグラフ記憶手段に記憶させるコールフローグラフ作成手段と、前記コールフローグラフ作成手段が作成したコールフローグラフを表示し、当該コールフローグラフ中において前記アプリケーションの障害原因の一要因となる処理単位のログデータを比較元ログデータとしてユーザ選択操作によって受け付けるコールフローグラフ表示手段と、ユーザ操作によって選択された比較元ログデータの処理単位と同一処理単位を含む他の処理単位群のログデータを前記コールフローグラフ記憶手段から取得し、当該他の処理単位群のログデータを比較先ログデータリストとして生成する比較ログデータリスト生成手段と、前記比較元ログデータと前記比較先ログデータリスト内の各ログデータとを比較し、処理単位の呼び出し関係が異なるログデータを抽出して出力するログデータ比較手段とを備えることを特徴とする。
また、前記アプリケーションが処理単位毎に出力したログデータには当該処理単位のソースコード中の行番号を含み、前記ログデータ比較手段は前記比較元ログデータと前記比較先ログデータリスト内の各ログデータとの比較により、処理単位の呼び出し関係が異なるログデータを抽出すると共に、同一処理が異なるソースコード行に存在することを抽出して出力することを特徴とする。
また、前記対象となるアプリケーションのソースコードを記憶したソースコード記憶手段と、前記ログデータ比較手段が出力した処理単位の呼び出し関係が異なるログデータ及び同一処理が異なるソースコード行に存在する処理単位のログデータの行番号により、前記ソースコード記憶手段から該当する行のソースコードを取得し、表示画面に予め設定した表示形式で強調表示出力する出力手段をさらに備えることを特徴とする。
【発明の効果】
【0010】
本発明のアプリケーションの障害原因の特定作業支援システムによれば、次のような効果がある。
(1)アプリケーションに障害が発生した場合、アプリケーションが出力するログを分析することで、障害の根本的な原因を突き止める作業を容易なものにし、作業の負担を大幅に軽減することができる。
【発明を実施するための最良の形態】
【0011】
以下、本発明の実施の形態を図面を参照して詳細に説明する。
図1は、本発明に係るアプリケーションの障害原因の特定作業支援システムの全体構成図である。
本実施形態のシステムは、障害原因の特定対象となるアプリケーション(101)にログ出力処理を実装し、ログ出力処理実装済みアプリケーション(103)を作成するログ出力処理実装装置(102)と、対象アプリケーション(101)が出力したログファイルを格納するログファイル格納部(104)と、ログファイル格納部(104)に格納されているログを読み込み、分析し、対象アプリケーション(101)の障害の根本的な原因箇所を特定するためのログ分析装置(105)と、対象アプリケーション(101)のソースコードを格納した対象アプリケーションソースコード格納部(118)とから構成される。
【0012】
ログ分析装置(105)は、ログファイル格納部(104)に格納されているログファイルをログデータとしてメモリ上に読み込むための、ログ読み込み部(106)と、読み込んだログデータを一時的に記憶しておくメモリ上の領域である、ログデータ記憶部(107)と、ログデータ記憶部(107)に記憶されたログデータを読み込み、分類処理を行うためのログデータ分類部(108)と、ログデータ分類部(108)で分類したログデータを一時的に記憶しておくメモリ上の領域である分類済みログデータ記憶部(109)と、分類済みログデータ記憶部(109)に記憶されているログデータから、メソッドの呼び出し関係を表すコールグラフデータを構築するコールグラフデータ構築部(110)と、コールグラフ構築部(110)で作成したコールグラフデータを一時的に記憶しておくメモリ上の領域であるコールグラフデータ記憶部(111)と、コールグラフデータをツリー構造のコールグラフとしてディスプレイ(117)に表示するためのコールグラフ表示装置(112)と、ユーザが指定したログ同士を比較するための比較範囲を計算するためのログ比較範囲計算部(113)と、比較処理を行うための比較ログデータリストを作成する比較ログデータリスト生成部(114)と、生成した比較ログデータを元に比較処理を行う比較処理部(115)と、比較処理部(115)で処理された結果を記憶する比較結果記憶部(115M)と、比較処理部(115)で処理された結果をディスプレイ(117)に表示するログ比較結果表示装置(116)と、コールグラフツリー、ログデータ比較結果を表示するためのディスプレイ(117)、ディスプレイ(117)に表示されたコールグラフから任意のログデータを選択するなどの操作を行う入力装置(119)から構成される。
【0013】
なお、本実施例はJava言語(Javaは登録商標)によるアプリケーション開発を前提としている。
また、ログ分析装置(105)は具体的にはコンピュータで構成され、各要素のうち記憶部以外の要素は、コンピュータプログラムによって構成されるものである。
【0014】
本システムでは、対象となるアプリケーション(101)が出力する、本システム特有のフォーマットを持つログ(以下、追跡ログと表記する)を分析し、障害の根本的な原因箇所を特定する作業を支援する。そのため、予め対象となるアプリケーション(101)に追跡ログの出力処理を実装しておく必要があり、それを実現するのがログ出力処理実装装置(102)である。ビルド済みの対象アプリケーション(101)をログ出力処理実装装置(102)の入力として与えることで、同装置(102)は対象アプリケーション(101)に追跡ログ出力処理を実装し、ログ出力処理実装済みアプリケーション(103)として出力する。
本実施形態では、例えばバイトコード操作ライブラリであるJavassistを使用し、追跡ログ出力処理の実装を行っている。これにより、対象アプリケーション(101)を構成するクラスのソースコードには一切変更を加えることなく、追跡ログ出力処理を実装することが可能となる。
【0015】
図2は、SampleクラスのソースコードであるSample.java(201)と、そのクラスに対し追跡ログ出力処理の実装を行った場合に出力される追跡ログ(202)の例を示したものである。
ログ出力処理実装装置(102)は、ソースコード上の全ての行に対応する処理の直前に、追跡ログ出力処理を実装する(ただし、空行、コメント行や、クラスの動作とは直接対応しない行に対しては、同処理は実装されない)。例えば、図2のSampleクラスに追跡ログ出力処理を実装した場合は、ソースコード上の2,3,5,6,7,9行目に対応する処理の直前に追跡ログ出力処理が実装される。4,8行目はクラスの動作には直接対応していない行であり、追跡ログ出力処理は実装されない。
【0016】
図3は、追跡ログファイルのフォーマットを示したものである。
追跡ログファイルは各項目がカンマで区切られたテキストファイルであり、追跡ログファイル中の1行が、1件の追跡ログに対応する。
スレッドID(301)には、この追跡ログの出力処理が実行されたスレッドの識別子(スレッドID)が出力される。スレッドさえ識別できれば、この項目はどのような形式であってもよい。本実施形態では3桁の整数値をスレッドIDとして使用している。
ファイル名(302)は、この追跡ログ出力処理が実装されたクラスに紐づくソースコードのファイル名が出力される。
同様に、行番号(303)には、この追跡ログ出力処理が実装されたソースコード上の行番号が出力される。
分類(304)は、この追跡ログの出力処理が設定された箇所の種類を示す文字列が出力される。この追跡ログがメソッドの開始時に出力されるよう実装されていれば、“ENTRY”、メソッドの終了時に出力されるよう実装されていれば“EXIT”、例外オブジェクトのキャッチ時に出力されるよう実装されていれば、“CATCH”が出力され、それら以外は“-”が出力される。
クラス名(305)、メソッド名(306)は、この追跡ログの出力処理が実装されたクラス名とメソッド名を示す。
最後に、エラー情報(307)は、分類(304)が“CATCH”の時にだけ出力される項目であり、キャッチした例外オブジェクトのエラー情報(エラーメッセージやスタックトレース情報)を出力する。このフォーマットにしたがって出力された追跡ログは、図2の(202)に示すようなものとなる。
【0017】
図4は、対象アプリケーション(101)が出力した追跡ログをログ分析装置(105)が読み込む処理を図示したものである。
ログ読み込み部(106)は、出力された追跡ログ(202)を1行ずつ読み込み、各項目をカンマごとに区切り、各項目の値を抽出し、それらの値からログデータ(401)を生成し、ログデータ記憶部(107)に格納する。
ログデータ(401)は、追跡ログ(202)と同じようなデータをもつデータ構造であり、スレッドID、ファイル名、行番号、分類、クラス名、メソッド名、エラー情報をデータとして保持する。
上記のログ読み込み処理を繰り返し、全ての追跡ログ(202)をログデータとしてログデータ記憶部(107)に格納する。
【0018】
図5は、ログデータ記憶部(107)に格納された複数のログデータをログデータ分類部(108)が読み込み、ログデータ分類部(108)はそれぞれのログデータが保持するスレッドIDの値ごとにログデータを分類し、分類済みログデータ(501)、(502)、(503)を作成し、分類済みログデータ記憶部(107)に格納する処理を示している。
分類済みログデータのデータ構造は、図6に示すように、スレッドID(601)と、ログデータのリスト(602)を保持する。
例えば、図5では分類済みログデータ(501)は、“スレッドID”として“001”を保持しており、そのログデータのリストには、ログデータ記憶部(107)に格納されているログデータのうち、“スレッドID”データが“001”であるもののみを格納している。
【0019】
図7は、コールグラフデータ構築部(110)が、分類済みログデータ記憶部(109)から分類済みログデータ(701)を読み込み、コールグラフデータ(702)を作成する処理を示している。
コールグラフデータ(702)はツリー構造のデータであり、ツリーの頂点に「ルート」オブジェクト(7021)があり、その子要素として「スレッド」オブジェクト(7022)が複数結合している。さらに、「スレッド」オブジェクト(7022)の子要素としてログデータ(7023)が複数結合している)。
ログデータ同士の間にも、メソッドを呼び出した側/呼び出された側の関係に対応したツリーの親子関係が存在する。生成したコールグラフデータ(702)は、コールグラフデータ記憶部(111)に格納される。
【0020】
図8は、「ルート」オブジェクト、「スレッド」オブジェクトのデータ構造を示したものである。
「ルート」オブジェクト(7021)は内部にデータを持たないオブジェクトであり、「スレッド」オブジェクト(7022)はスレッドID(70221)を保持するオブジェクトである。
【0021】
図9は、コールグラフデータ構築部(110)がコールグラフデータ(702)を構築するアルゴリズムを示すフローチャートである。
まず、コールグラフデータ構築部(110)は「ルート」オブジェクトを1つ作成する(ステップ901)。
次に、分類済みログデータ記憶部(109)から分類済みログデータ(701)を1件取得する(ステップ902)。
次に、取得した分類済みログデータ(702)が保持する“スレッドID”を取得し、その値を使用して「スレッド」オブジェクトを作成し、ステップ901で作成した「ルート」オブジェクトの子要素として設定する(ステップ903)。
次に、一時変数“直前の要素”にステップ903で作成した「スレッド」オブジェクトを設定する(ステップ904)。これはコールグラフデータのツリー構造を構築するために使用する一時的な変数である。
次に、ステップ902で取得した分類済みログデータ(701)が保持するログデータを1件取得する(ステップ905)。
次に、取得したログデータ(701)の“分類”の値を取得し、この値を評価する(ステップ906)。
【0022】
“分類”が“ENTRY”である場合は、一時変数“親要素”に、一時変数“直前の要素”に格納されている要素を設定する(ステップ907)。そして、一時変数“親要素”に設定されている要素の子要素として、ステップ905で取得したログデータを設定する(ステップ910)。
“分類”が“EXIT”である場合は、ステップ905で取得したログデータを、一時変数“親要素”に設定されている要素の子要素として設定する(ステップ908)。そして、一時変数“親要素”に、一時変数“親要素”に設定されている要素の親要素を設定する(ステップ909)。
“分類”が“EXIT”“ENTRY”以外である場合は、ステップ905で取得したログデータを、一時変数“親要素”に設定されている要素の子要素として設定する(ステップ910)。
以上の処理が完成したならば、次に、一時変数“直前の要素”に、ステップ905で取得したログデータを設定する(ステップ911)。
以上、ステップ902で取得した分類済みログデータ(701)が保持する全てのログデータに関して、ステップ905からステップ911までの処理を繰り返し行う(ステップ912)。
また、分類済みログデータ記憶部(109)に記憶されている全ての分類済みログデータ(701)に関して、ステップ902からステップ912までの処理を繰り返し行う(ステップ913)。
以上で、コールグラフデータの構築処理は完了である。
【0023】
図10は、コールグラフ表示装置(112)が、コールグラフデータ構築部(110)が構築したコールグラフデータを読み込み、ディスプレイ(117)に表示したコールグラフ(1001)の例を示す図である。
コールグラフデータはツリー構造をもつデータであるため、コールグラフ表示装置(112)はツリー構造をそのままツリー形式で表示している。
図10では、はじめに「スレッド[001]」(1002)、「スレッド[002](1003)、「スレッド[003](1004)のノードが表示されており、そのうち「スレッド[001]」(1002)のツリーノードを展開すると、スレッドIDが001であるスレッド上で実行された処理に関する全てのログ(1005)が表示される。
このツリーを見れば、アプリケーションの実行経路を用意に把握することができ、また、メソッドの呼び出し関係がツリー構造で表現されているため、例えば、あるメソッドが、どのメソッドから呼び出されたものであるか、などといった関係を容易に把握することができる。
【0024】
図11は、対象アプリケーション(101)にエラーが発生した際の追跡ログを読み込み、コールグラフ表示装置(112)で表示したものの一部を示す図である。
コールグラフ表示装置(112)は、ログデータの“分類”データの値が“CATCH”であるものは、コールグラフを表示する際に、そのログデータにエラーが発生したことを示すマーク(1101)を表示する。
このように表示することにより、多数の追跡ログの中からエラーの発生を示すログを探し易くなる。この場合、エラーが発生したことを示すマーク(1101)はログデータ「Sample.run(String):21」(1103)に表示されているため、当該Sampleクラス(1103)のソースコード(1104)上の21行目(1105)で例外オブジェクトをキャッチしていることがわかり、このログデータの1つ前のログデータ「Sample.run(String):20」(1102)を参照すると、Sampleクラス(1103)のソースコード(1104)上の20行目(1106)に記述されている処理の実行中にエラーが発生したことが推測できる。
【0025】
しかしこの場合、何故20行目で例外が発生したのか、根本的な原因を明確にすることはできない。そこで、本発明では「比較」機能を用いて、ログを比較することにより、例外の根本的な原因を特定する。「比較」機能は、指定したエラーログが示す例外が発生するまでの一連のログと、その一連のログと同一の動作経路を示す別の一連のログとを比較し、その差分を表示することで、障害の根本的な原因を特定する作業を支援する機能を提供する。
【0026】
図12は、「比較」機能を実行している様子を示している。「比較」機能を実行するには、エラーを示すマークが表示されているログデータ(1201)を選択し、表示されるメニューから「比較」(1202)を指定する。すると、ログ比較範囲計算部(113)は図13のフロ−チャ−トに示すアルゴリズムに従って処理を行う。
【0027】
図13に示すアルゴリズムでは、まずコールグラフで選択されているログデータを取得する(ステップ1301)。
次に、一時変数“対象データ”に選択されたログデータを設定する(ステップ1302)。
次に、一時変数“対象データ”に設定されているデータが「スレッド」オブジェクトであるかどうかを評価する(ステップ1303)。
「スレッド」オブジェクトでない場合は、一時変数“対象データ”に設定されているログデータを、対象ログデータリストに追加する(ステップ1304)。対象ログデータリストはリスト構造をもつ一時データである。
次に、一時変数“対象データ”に、“対象データ”に設定されているデータの親要素のデータを設定する(ステップ1305)。そして、一時変数“対象データ”に設定されているデータが「スレッド」オブジェクトになるまで、ステップ1303からステップ1305の処理を繰り返し、ステップ1303の判定処理において、対象データが「スレッド」オブジェクトであると評価された場合は、対象ログデータリストに格納されたログデータを、「比較範囲設定」ダイアログ上にツリー形式で表示する(ステップ1306)。
すると、「比較範囲設定」ダイアログ(1401)が図14のように表示される。
【0028】
図14は、「比較範囲の設定」ダイアログ(1401)が表示され、コールグラフデータ表示装置(112)でユーザが選択指定したログデータ(1405)と、その全ての親要素のログデータ(1402、1403、1404)がツリー形式で表示される様子を示している。
このダイアログ(1401)では、図12のコールグラフでユーザが選択指定したエラーログが出力されるまでに、どのようなメソッドの呼び出し経路を辿ったかを示している。
例えば、図14の例では、まずSampleクラスのmain(String[])メソッド内の処理中(ソースコードの300行目に記述されている処理)でservice()メソッドが呼び出され、呼び出されたservice()メソッドはさらにメソッド内の処理中(ソースコードの250行目に記述されている処理)で、action()メソッドを呼び出し、さらにaction()メソッドの処理中(ソースコードの16行目に記述されている処理)で、run(String)メソッドを呼び出し、run(String)メソッド内の処理(ソースコードの21行目に記述されている処理)で、例外が発生したことを示している。
【0029】
次に、「比較範囲の設定」ダイアログ(1401)に表示されているメソッドの呼び出し関係から、比較を行うログの範囲を決定する。ここで選択したメソッド呼び出しの経路と同一の処理経路を示すログが比較の対象となる。例えば図14の場合は「Sample.service():250」(1403)と「Sample.action():16」(1404)と「Sample.run(String):21」(1405)を選択しており、この場合は「Sampleクラスのserviceメソッドが実行され、250行目の処理でaction(String)メソッドを呼び出し、actionメソッドが実行され、16行目の処理でrun(String)メソッドを呼び出し、run(String)メソッドが実行され、run(String)メソッドが終了するまで」を示すログを、比較の対象として指定していることになる。
この状態で「比較開始」ボタン(1406)を押す操作を行う。
すると、比較ログデータリスト生成部(114)は、図15のフロ−チャ−トに示す処理を行い、比較先ログデータリストを作成する。
【0030】
図15では、まず「比較範囲の設定」ダイアログ(1401)で指定したログデータのリスト(比較範囲データ)を取得する(ステップ1501)。比較範囲データ(1601)は、図16に示すようなツリー構造のデータであり、「比較範囲の設定」ダイアログ(1401)で指定したログデータと同様の構造を持っている。
次に、取得した比較範囲データ(1601)から、葉のデータ(つまりツリー構造のデータの末端に存在するデータ)を取得する(ステップ1502)。図16の例では、ログデータ(1604)が、葉のデータに該当する。
次に、コールグラフデータ記憶部(111)からコールグラフデータを1件ずつ取得する(ステップ1503)。
次に、取得したコールグラフデータが保持するログデータを1件ずつ取得する(ステップ1504)。
次に、ステップ1504で取得したログデータの“分類”データが“ENTRY”であり、かつ“クラス名”“メソッド名”データが、ステップ1502で取得した葉データの“クラス名”“メソッド名”データと一致するかどうか、評価する(ステップ1505)。
【0031】
図16を例にとると、取得したログデータの“分類”データが“ENTRY”であり、かつ“クラス名”データが“C”、“メソッド名”データが“c()”であるかどうかを評価する。
ステップ1505の評価結果が“真”であれば、次にステップ1504で取得したログデータの親ノードの構造と、ステップ1502で取得した葉データの親ノードの構造が一致しているかどうかを評価する(ステップ1506)。
一致している場合は、一致している部分の最上位の親ノードが示すメソッドの、開始時を示すログデータから、ステップ1504で取得したログデータが示すメソッドの終了時を示すログデータまでの一連のログデータ(一致ログデータ)を、一致ログデータリストに追加する(ステップ1507)。
なお、一致ログデータリストとは、一致ログデータを格納するリストである。
例えば、図16では、(1601)に示す比較範囲データがある。これは、(行番号=“40”、分類=”-“、クラス名=“C”、メソッド名=“c()”」というデータを持つ葉ログデータ(1604)があり、その親ノードとして(行番号=“30”、種別=”-“、クラス名=“B”、メソッド名=“b()”」というデータをもつログデータ(1603)が存在し、さらにその親ノードとして、(行番号=“20”、種別=”-“、クラス名=“A”、メソッド名=“a()”」というデータをもつログデータ(1602)が存在する、という構造を持つ比較範囲データである。
【0032】
このような比較範囲データ(1601)に対して、図15に示す処理を適用すると、ステップ1505の評価の結果、図17に示すような、(1701)、(1704)という2つのログデータが抽出されたとする。これらのデータに対し、ステップ1506の評価を適用する。
ログデータ(1701)の親ノードを見てみると、その親ノードは、(行番号=“30”、分類=”-“、クラス名=“B”、メソッド名=“b()”」というデータをもつログデータ(1702)であり、さらにその親ノードは(行番号=“20”、分類=”-“、クラス名=“A”、メソッド名=“a()”」というデータを持つログデータ(1703)であるため、比較範囲データの葉ノード(1604)と、ログデータ(1701)の親ノードの構造は一致しているといえる。
【0033】
一方、ログデータ(1704)の親ノードを見てみると、その親ノードは、(行番号=“99”、分類=”-“、クラス名=“Z”、メソッド名=“z()”)というデータを持つログデータ(1705)であり、さらにその親ノードは(行番号=“60”、分類=”-“、クラス名=“E”、メソッド名=“e()”」というデータを持つログデータ(1706)であるため、比較範囲データの葉ノード(1604)と、ログデータ(1704)の親ノードの構造は一致しない。
これにより、(1707)が示す範囲の一連のログデータが一致ログデータとして抽出される。この一致ログデータは、一致ログデータリストに格納される。
コールグラフデータ記憶部(111)が保持する全てのコールグラフデータを取得し、さらにそのコールグラフデータが保持する全てのログデータに関して、ステップ1503からステップ1509までの処理を繰り返し、全て完了したら、比較先ログデータリストの作成に関する処理は全て終了である。
【0034】
ところで、図15に示す処理では、全てのログデータから、比較範囲データ(1601)が保持するログデータと親データの構造が一致するものを取得していたため、当然、比較元となる一連のログデータも、その他の一致ログデータと一緒に一致ログリストに格納されてしまっている。
そのため、図15に示す処理の完了後に、一致ログデータリストから、比較元の一連のログデータを分離する必要がある。この処理は、一致ログデータリストに格納されている一致ログデータの中から、比較範囲データが保持する各ログデータを構成要素としている一致ログデータを探し出すことにより実現できる。
【0035】
例えば、図18では、一致ログデータリスト(1812)に格納されている、一致ログデータ(1813)を構成しているログデータ(1801、1802、1803)と、比較範囲データ(1807)が保持するログデータ(1804,1805,1806)は、それぞれ同一のオブジェクトであるため、一致ログデータ(1813)は比較元の一連のログデータ(比較元ログデータ)であることがわかる。そこで、一致ログデータ(1813)を一致ログデータリストから取り出す(1811)。
以降、一致ログデータリスト(1812)から取り出した一致ログデータ(1813)を、“比較元ログデータ”(1814)、そして比較元ログデータを取り除いた状態の一致ログデータリストを“比較先ログデータリスト”(1815)と称する。
【0036】
比較元ログデータ(1814)と、比較先ログデータリスト(1815)の取得が完了したならば、次に実際にこれらのログデータを比較する処理を行うが、その前に、図19に示すように比較元ログデータ(1814)と、比較先ログデータリスト(1815)に格納されている全ての比較先ログデータに関して、そのデータ構造を、一旦、非階層構造のフラットなリスト構造に変換する(1903、1904)。ログデータは、枝の分岐を持たないツリー構造のデータであるため、リスト構造に変換する場合は、単純に先頭ノードのログデータから順番に、リスト構造のデータに値を格納するだけである。
【0037】
ログデータのデータ構造の変換が完了したならば、比較処理部(115)を使用して、フラット化した比較元ログデータ(1903)と、比較先ログデータリスト(1904)に格納されている全ての比較先ログデータの比較を行う。
比較処理部(115)は、diffプログラムと同等機能のプログラムである。diffプログラムとは2つのデータの相違点を取得するためのプログラムであり、有名なものとしてはUNIX(登録商標)のdiffコマンドなどが挙げられる。diffプログラムは通常2つのテキストファイルに対し、それぞれの各行の文字列を比較の対象とし、その相違を取得するが、比較処理部(115)は比較元ログデータ(1903)と比較先ログデータリスト(1904)に格納されるログデータのデータの相違を取得する。なお、diffプログラムの比較アルゴリズムに関しては、公知の技術であるため説明を省略する。
【0038】
図20〜図22は、比較元ログデータ(1903)と、比較先ログデータリスト(1904)から取得した比較先ログデータ(1)(2002)との比較処理の様子を示したものである。
図20では、比較処理部(115)が、比較元ログデータ(1903)のログデータ(2003)と、比較先ログデータ(1)(2002)のログデータ(2004)とが“衝突”していることを検知している様子を示している。“衝突”とは、同様の行に存在するデータが異なっている状態を示す。この例では比較元のログデータ(2003)の行番号データは“8”であるのに対し、比較先のログデータ(2004)の行番号データは“10”であるため、衝突が発生している。この場合、比較処理部(115)、比較情報データ(2006)を作成し、比較情報データリスト(2005)に追加する。比較情報データリスト(2005)は、ログデータを比較した結果に関する情報を格納するためのデータリストであり、“相違の種類”(2007)、“比較元の相違開始インデックス”(2008)、“比較元の相違終了インデックス”(2009)、“比較先の相違開始インデックス”(2010)、“比較先の相違終了インデックス”(2011)というデータを保持する。
【0039】
“相違の種類”データには、“衝突”、“追加”、“削除”のいずれかの値が格納される。
“比較元の相違開始インデックス”、“比較元の相違終了インデックス”、“比較先の相違開始インデックス”、“比較先の相違終了インデックス”データには、相違箇所を特定するためのインデックス情報が格納される。なお、比較元ログデータ、比較先ログデータはリスト構造を持ったデータであり、要素の位置を示すためのインデックス情報を持っている。
図20の場合は、“相違の種類”データ(2007)には“衝突”を格納し、また比較元ログデータのインデックス2〜3の間のログデータと、比較先ログデータのインデックス2〜3の間のログデータに関して衝突が発生しているため、“比較元の相違開始インデックス”(2008)には“2”を、“比較元の相違終了インデックス”(2009)には“3”を、“比較先の相違開始インデックス”(2010)には“2”を、“比較先の相違終了インデックス”(2011)には“3”を格納している。
【0040】
図21は、比較処理部(115)が“挿入”を検知している様子を示している。
“挿入”とは、ある箇所において、比較元ログデータ(1903)には存在せず、比較先のログデータ(1)(2002)には存在するログデータがある状態を示す。
図21の例では、比較元ログデータ(1903)の(2101)の位置(インデックス5の位置)にはログデータは存在しないが、比較先ログデータ(2002)の同じ位置には(2102)に示すログデータが存在するため、挿入が発生していることがわかる。このような場合、比較処理部(115)は比較情報データ(2103)を、比較情報データリスト(2005)に追加する。
【0041】
図22は、比較処理部(115)が“削除”を検知している様子を示している。
“削除”とは、ある箇所において、比較元ログデータ(1903)には存在しているが、比較先のログデータ(2002)には存在しないログデータがある状態を示す。
図22の例では、比較元ログデータ(1903)の(2201)の位置(インデックス8〜10の間)には存在するが、比較先ログデータ(2002)の(2202)の位置(インデックス9の位置)には存在しないログデータがあるため、削除が発生していることがわかる。このような場合、比較処理部(115)は比較情報データ(2203)を比較情報データリスト(2005)に追加する。
【0042】
このように、比較元ログデータ(1903)と、比較先ログデータ(1)(2002)を比較して作成した比較情報データは、比較先ログデータ(1)(2002)に紐付けられ、保存される。
比較処理部(115)は、上記と同様の手順で全ての比較先ログデータ(1904)と、比較元ログデータ(1903)に関して比較処理を行い、それぞれの比較先ログデータに対応する比較情報データ(2303)を作成する。そして、図23に示すように、比較情報データ(2303)はフラット化前の比較先ログデータ(1815)と紐付け、フラット化前の比較元ログデータ(1814)と共に比較結果記憶部(115M)に保存する。
比較元ログデータと、比較先データリスト、そしてそれに紐づく比較情報データ、それぞれが作成できたならば、最後にこれらのデータをログ比較結果表示装置(116)に渡し、ディスプレイ(117)に表示する。
【0043】
図24に示すように、比較元ログデータ(1814)は比較元ビュー(2401)に表示し、比較先ログデータリストに格納されている比較先ログデータ(1815)は、それぞれ比較先ビュー(2402)の各タブビュー(2403)に表示する。
タブ(2404)を切り替えることにより、それぞれの比較先ログデータを見ることができる。また、比較情報データを元に、各ビュー内のログデータをハイライト表示することで、“衝突”、“挿入”、“削除”の状況が容易に把握できる。なお、“衝突”の箇所は黄色(2405)、“挿入”の箇所は青色(2406)、“削除”の箇所は赤色(2407)で表示される。
また、この状態でソースコードエディタを用いてソースコード記憶部118から対象アプリケーション(101)のソースコードを読み出し、ログ比較結果表示装置(116)に渡すと、ログ比較結果表示装置(116)はハイライト表示されているログデータが示すソースコード行を図25に示すようにハイライト表示して明示する。
【0044】
図25では、Sampleクラスのソースコードをソースコードエディタ(2501)で取得してログ比較結果表示装置(116)で表示した例を示したものである。
ここでは、図24でハイライト表示されているログデータが示す行(8,10,14,21,22行目)が(2502)、(2503)、(2504)、(2505)で示すように同色でハイライト表示される。また、図24におけるタブ(2404)を切り替えることにより、別の比較先ログデータとの比較結果が同じようにハイライト表示される。
【0045】
以上の機能により、対象アプリケーション(101)にエラーが発生した場合、そのエラーが発生するに至った処理経路を示すログと、同様の処理経路を示している過去のログを比較することができ、さらにその比較結果に基づきエラーが発生している処理経路中のソースコードをハイライト表示することにより、エラーの根本的な原因を解決する支援が可能となる。
【0046】
例えば、対象アプリケーション(101)の運用者がエラーの原因追跡を行う場合は、まず対象アプリケーション(101)が出力するログをログ分析装置(105)に読み込み、「比較」機能を実行する。すると図24、25に示したように、エラー発生時点以前の過去のログとの比較結果が、ログ比較結果表示装置(112)でディスプレイ(117)にハイライト表示される。
図25の例では21,22行目がハイライト表示されているため、この行で例外をキャッチしたことがエラーの直接の原因である、ということが即座に把握できる。
さらに、なぜ例外が発生したのか、すなわちこのエラーの根本的な原因は何なのかを調査する場合は、その他のハイライト表示箇所が根本的な原因を特定する手がかりとなる。
図25のソースコードを見ると、8、10行目に黄色のハイライト表示(2502)、(2503)があり、言い換えると、以前にこのメソッドが実行した際は10行目が実行されたが、今回(エラーが発生時)は、8行目が実行されていた、ということがわかる。そこで、アプリケーション開発者は8,10行目の処理を中心にソースコードを精査することで、エラーの根本的な原因を突き止めることができる。
【0047】
なお、上記の説明では対象アプリケーションのエラーの原因箇所を特定する作業を行う場合の処理について説明したが、エラーが発生しない場合において、ユーザが設定した特定の処理経路を持つメソッドを抽出する場合にも利用することができる。この場合には、図11のコールグラフ中で任意のスレッドを選択し、このスレッド内の処理でエラーが発生したものと擬似的に設定した後、エラーが発生した場合と同様の処理を行えばよい。
また、比較結果については、ディスプレイ画面に出力しているが、印刷装置で印刷出力する構成にすることができることは言うまでもない。
【図面の簡単な説明】
【0048】
【図1】本発明に係るアプリケーションの障害原因の特定作業支援システムの実施形態を示す全体構成図である。
【図2】Sampleクラスのソースコードとそのクラスに対し追跡ログ出力処理の実装を行った場合に出力される追跡ログの例を示す図である。
【図3】追跡ログファイルのフォーマットの例を示す図である。
【図4】対象アプリケーションが出力した追跡ログをログ分析装置が読み込む処理の概要を示す図である。
【図5】ログデータ記憶部に格納された複数のログデータをログデータ分類部が読み込み、それぞれのログデータが保持するスレッドIDの値ごとにログデータを分類し、分類済みログデータを作成し、分類済みログデータ記憶部に格納する処理の概要を示す図である。
【図6】分類済みログデータのデータ構造の例を示す図である。
【図7】コールグラフデータ構築部が分類済みログデータ記憶部から分類済みログデータを読み込み、コールグラフデータを作成する処理の概要を示す図である。
【図8】「ルート」オブジェクト、「スレッド」オブジェクトのデータ構造の例を示す図である。
【図9】コールグラフデータ構築部がコールグラフデータを構築するアルゴリズムを示すフローチャートである。
【図10】コールグラフ表示装置がコールグラフデータ構築部で構築したコールグラフデータを読み込み、ディスプレイに表示したコールグラフの例を示す図である。
【図11】対象アプリケーションにエラーが発生した際の追跡ログを読み込み、コールグラフ表示装置で表示したものの一部を示す図である。
【図12】「比較」機能を実行させる様子を示す図である。
【図13】ログ比較範囲計算部のアルゴリズムを示すフローチャートである。
【図14】「比較範囲の設定」ダイアログ上にユーザが選択指定したログデータとその全ての親要素のログデータがツリー形式で表示される例を示す図である。
【図15】比較ログデータリスト生成部のアルゴリズムを示すフローチャートである。
【図16】比較範囲データのツリー構造を示す図である。
【図17】比較範囲データに対して抽出される2つのログデータの例を示す図である。
【図18】比較元ログデータと比較先ログデータの生成処理の概要を示す図である。
【図19】比較元ログデータと比較先ログデータリストに格納されている全ての比較先ログデータのデータ構造を、非階層構造のフラットなリスト構造に変換する処理の概要を示す図である。
【図20】比較元ログデータと比較先ログデータリストから取得した比較先ログデータとの比較処理の概要を示す図である。
【図21】比較処理部が“挿入”を検知した例を示す図である。
【図22】比較処理部が“削除”を検知した例を示す図である。
【図23】比較先ログデータと比較情報データの紐付けを示す図である。
【図24】ログ比較結果の表示例を示す図である。
【図25】エラー原因と考えられるソースコードの行をハイライト表示した例を示す図である。
【符号の説明】
【0049】
101…対象アプリケーション、102…ログ出力処理実装装置、103…ログ出力処理実装済みアプリケーション、104…ログファイル格納部、105…ログ分析装置、106…ログ読み込み部、107…ログデータ記憶部、108…ログデータ分類部、109…分類済みログデータ記憶部、110…コールグラフデータ構築部、111…コールグラフデータ記憶部、112…コールグラフ表示装置、113…ログ比較範囲計算部、114…比較ログデータリスト生成部、115…比較処理部、116…ログ比較結果表示装置、117…ディスプレイ、118…アプリケーションソースコード格納部。
【技術分野】
【0001】
本発明は、アプリケーションのログから当該アプリケーションの動作を追跡し、障害が発生した原因を特定する作業を支援するアプリケーションの障害原因の特定作業支援システムに関するものである。
【背景技術】
【0002】
アプリケーションに含まれるバグが原因で障害が発生し、ユーザに大きな損害を与えるという事例がよく見られる。このため、バグを一切含まないアプリケーションを開発することが求められるが、そのようなアプリケーションを開発するのは非常に困難である。そこで、仮にアプリケーションが障害を起こしたとしても、早急に障害の原因を突き止め、対策をとるための手段が重要となる。
アプリケーションの障害の原因を突き止めるための効果的な手段の1つとして、アプリケーションにログを出力する処理を実装する方法がある。この方法によれば、アプリケーション管理者は、アプリケーションが出力するログを監視することでアプリケーションに障害が発生したことを検知できる。また、ログには障害の直接の原因となった処理を行っている箇所(ソースコードの行番号)の情報が記録されているため、アプリケーション管理者はログを確認し、ログとアプリケーションのソースコードを比較することで、ソースコード中から障害の直接の原因箇所を突き止めることが可能となる。
【0003】
しかし、上述の作業は全てアプリケーション管理者の目視と推測によって行われるため、アプリケーションの規模、もしくは出力されるログの量が大きくなるにつれて、作業のコストは増大し、また人手による作業であるためミスが発生する可能性も高まる。
【0004】
上述の問題を解決するために、ログ分析ツールなどを使用して障害の原因を突き止める方法がある。ログ分析ツールとは、アプリケーションが出力したログを読み込み、ログを確認し易いような形式で一覧表示し、各ログとアプリケーションのソースコードを関連付けて表示するツールである。障害の発生を示すログを一覧から選択することで、その障害の直接の原因となった処理を行っているソースコード中の箇所をツールが強調表示(ハイライト表示)するため、迅速な障害追跡が可能となる。
【0005】
なお、本発明に関連する公知技術文献としては下記の特許文献1が挙げられる。
特許文献1では、保守用端末が計算機から受け取ったメッセージのログと、保守用端末が計算機へ送信したメッセージのログがあり、一方のログを閲覧する際、もう一方のログも同時に表示し、さらに一方のログに含まれる時刻情報から、近い時間帯に出力されたもう一方のログのメッセージを追従して表示している。同時間帯に出力された複数のログ同士の関係を即座に把握することができるため、障害追跡の支援に有効である。
【0006】
【特許文献1】特開2001−101035号公報
【発明の開示】
【発明が解決しようとする課題】
【0007】
しかしながら、上述のログ分析ツールにあっては、障害の直接の原因となった処理を行っている箇所は発見できるものの、その障害が発生した根本的な原因は発見できない。
すなわち、多くのアプリケーションでは、障害の直接の原因となった処理を行っている一箇所のみを修正するだけで障害が解決するようなケースは稀である。障害の直接の原因となった処理を行っている箇所以外に、その障害の根本的な原因となる処理を行っている箇所が別に存在し、その部分を修正して初めて障害が完全に解決する、といったケースが多々見られる。
上述のツールでは、障害発生を示すログと、そのログが出力される直前のログを見ることで、根本的な原因を大まかに突き止めることは可能であるが、これは比較的困難な作業である。また、特許文献1においても、この問題は解決できていない。
【0008】
本発明の目的は、アプリケーションの障害の根本的な原因箇所を突き止めるために、アプリケーションが出力するログを分析し、障害の根本的な原因箇所を突き止める作業を大幅に軽減することができるアプリケーションの障害原因の特定作業支援システムを提供することにある。
【課題を解決するための手段】
【0009】
上記目的を達成するために、本発明のアプリケーション障害原因の特定支援システムは、対象となるアプリケーションに処理単位毎のログ出力処理を実装するログ出力処理実装手段と、前記対象となるアプリケーションが処理単位毎に出力したログデータを読み込み、そのログデータを分析するログ分析手段とから構成され、
前記ログ分析手段が、
前記処理単位毎のログデータから前記アプリケーションを構成する各処理単位の呼び出し関係を示すコールフローグラフを作成し、コールフローグラフ記憶手段に記憶させるコールフローグラフ作成手段と、前記コールフローグラフ作成手段が作成したコールフローグラフを表示し、当該コールフローグラフ中において前記アプリケーションの障害原因の一要因となる処理単位のログデータを比較元ログデータとしてユーザ選択操作によって受け付けるコールフローグラフ表示手段と、ユーザ操作によって選択された比較元ログデータの処理単位と同一処理単位を含む他の処理単位群のログデータを前記コールフローグラフ記憶手段から取得し、当該他の処理単位群のログデータを比較先ログデータリストとして生成する比較ログデータリスト生成手段と、前記比較元ログデータと前記比較先ログデータリスト内の各ログデータとを比較し、処理単位の呼び出し関係が異なるログデータを抽出して出力するログデータ比較手段とを備えることを特徴とする。
また、前記アプリケーションが処理単位毎に出力したログデータには当該処理単位のソースコード中の行番号を含み、前記ログデータ比較手段は前記比較元ログデータと前記比較先ログデータリスト内の各ログデータとの比較により、処理単位の呼び出し関係が異なるログデータを抽出すると共に、同一処理が異なるソースコード行に存在することを抽出して出力することを特徴とする。
また、前記対象となるアプリケーションのソースコードを記憶したソースコード記憶手段と、前記ログデータ比較手段が出力した処理単位の呼び出し関係が異なるログデータ及び同一処理が異なるソースコード行に存在する処理単位のログデータの行番号により、前記ソースコード記憶手段から該当する行のソースコードを取得し、表示画面に予め設定した表示形式で強調表示出力する出力手段をさらに備えることを特徴とする。
【発明の効果】
【0010】
本発明のアプリケーションの障害原因の特定作業支援システムによれば、次のような効果がある。
(1)アプリケーションに障害が発生した場合、アプリケーションが出力するログを分析することで、障害の根本的な原因を突き止める作業を容易なものにし、作業の負担を大幅に軽減することができる。
【発明を実施するための最良の形態】
【0011】
以下、本発明の実施の形態を図面を参照して詳細に説明する。
図1は、本発明に係るアプリケーションの障害原因の特定作業支援システムの全体構成図である。
本実施形態のシステムは、障害原因の特定対象となるアプリケーション(101)にログ出力処理を実装し、ログ出力処理実装済みアプリケーション(103)を作成するログ出力処理実装装置(102)と、対象アプリケーション(101)が出力したログファイルを格納するログファイル格納部(104)と、ログファイル格納部(104)に格納されているログを読み込み、分析し、対象アプリケーション(101)の障害の根本的な原因箇所を特定するためのログ分析装置(105)と、対象アプリケーション(101)のソースコードを格納した対象アプリケーションソースコード格納部(118)とから構成される。
【0012】
ログ分析装置(105)は、ログファイル格納部(104)に格納されているログファイルをログデータとしてメモリ上に読み込むための、ログ読み込み部(106)と、読み込んだログデータを一時的に記憶しておくメモリ上の領域である、ログデータ記憶部(107)と、ログデータ記憶部(107)に記憶されたログデータを読み込み、分類処理を行うためのログデータ分類部(108)と、ログデータ分類部(108)で分類したログデータを一時的に記憶しておくメモリ上の領域である分類済みログデータ記憶部(109)と、分類済みログデータ記憶部(109)に記憶されているログデータから、メソッドの呼び出し関係を表すコールグラフデータを構築するコールグラフデータ構築部(110)と、コールグラフ構築部(110)で作成したコールグラフデータを一時的に記憶しておくメモリ上の領域であるコールグラフデータ記憶部(111)と、コールグラフデータをツリー構造のコールグラフとしてディスプレイ(117)に表示するためのコールグラフ表示装置(112)と、ユーザが指定したログ同士を比較するための比較範囲を計算するためのログ比較範囲計算部(113)と、比較処理を行うための比較ログデータリストを作成する比較ログデータリスト生成部(114)と、生成した比較ログデータを元に比較処理を行う比較処理部(115)と、比較処理部(115)で処理された結果を記憶する比較結果記憶部(115M)と、比較処理部(115)で処理された結果をディスプレイ(117)に表示するログ比較結果表示装置(116)と、コールグラフツリー、ログデータ比較結果を表示するためのディスプレイ(117)、ディスプレイ(117)に表示されたコールグラフから任意のログデータを選択するなどの操作を行う入力装置(119)から構成される。
【0013】
なお、本実施例はJava言語(Javaは登録商標)によるアプリケーション開発を前提としている。
また、ログ分析装置(105)は具体的にはコンピュータで構成され、各要素のうち記憶部以外の要素は、コンピュータプログラムによって構成されるものである。
【0014】
本システムでは、対象となるアプリケーション(101)が出力する、本システム特有のフォーマットを持つログ(以下、追跡ログと表記する)を分析し、障害の根本的な原因箇所を特定する作業を支援する。そのため、予め対象となるアプリケーション(101)に追跡ログの出力処理を実装しておく必要があり、それを実現するのがログ出力処理実装装置(102)である。ビルド済みの対象アプリケーション(101)をログ出力処理実装装置(102)の入力として与えることで、同装置(102)は対象アプリケーション(101)に追跡ログ出力処理を実装し、ログ出力処理実装済みアプリケーション(103)として出力する。
本実施形態では、例えばバイトコード操作ライブラリであるJavassistを使用し、追跡ログ出力処理の実装を行っている。これにより、対象アプリケーション(101)を構成するクラスのソースコードには一切変更を加えることなく、追跡ログ出力処理を実装することが可能となる。
【0015】
図2は、SampleクラスのソースコードであるSample.java(201)と、そのクラスに対し追跡ログ出力処理の実装を行った場合に出力される追跡ログ(202)の例を示したものである。
ログ出力処理実装装置(102)は、ソースコード上の全ての行に対応する処理の直前に、追跡ログ出力処理を実装する(ただし、空行、コメント行や、クラスの動作とは直接対応しない行に対しては、同処理は実装されない)。例えば、図2のSampleクラスに追跡ログ出力処理を実装した場合は、ソースコード上の2,3,5,6,7,9行目に対応する処理の直前に追跡ログ出力処理が実装される。4,8行目はクラスの動作には直接対応していない行であり、追跡ログ出力処理は実装されない。
【0016】
図3は、追跡ログファイルのフォーマットを示したものである。
追跡ログファイルは各項目がカンマで区切られたテキストファイルであり、追跡ログファイル中の1行が、1件の追跡ログに対応する。
スレッドID(301)には、この追跡ログの出力処理が実行されたスレッドの識別子(スレッドID)が出力される。スレッドさえ識別できれば、この項目はどのような形式であってもよい。本実施形態では3桁の整数値をスレッドIDとして使用している。
ファイル名(302)は、この追跡ログ出力処理が実装されたクラスに紐づくソースコードのファイル名が出力される。
同様に、行番号(303)には、この追跡ログ出力処理が実装されたソースコード上の行番号が出力される。
分類(304)は、この追跡ログの出力処理が設定された箇所の種類を示す文字列が出力される。この追跡ログがメソッドの開始時に出力されるよう実装されていれば、“ENTRY”、メソッドの終了時に出力されるよう実装されていれば“EXIT”、例外オブジェクトのキャッチ時に出力されるよう実装されていれば、“CATCH”が出力され、それら以外は“-”が出力される。
クラス名(305)、メソッド名(306)は、この追跡ログの出力処理が実装されたクラス名とメソッド名を示す。
最後に、エラー情報(307)は、分類(304)が“CATCH”の時にだけ出力される項目であり、キャッチした例外オブジェクトのエラー情報(エラーメッセージやスタックトレース情報)を出力する。このフォーマットにしたがって出力された追跡ログは、図2の(202)に示すようなものとなる。
【0017】
図4は、対象アプリケーション(101)が出力した追跡ログをログ分析装置(105)が読み込む処理を図示したものである。
ログ読み込み部(106)は、出力された追跡ログ(202)を1行ずつ読み込み、各項目をカンマごとに区切り、各項目の値を抽出し、それらの値からログデータ(401)を生成し、ログデータ記憶部(107)に格納する。
ログデータ(401)は、追跡ログ(202)と同じようなデータをもつデータ構造であり、スレッドID、ファイル名、行番号、分類、クラス名、メソッド名、エラー情報をデータとして保持する。
上記のログ読み込み処理を繰り返し、全ての追跡ログ(202)をログデータとしてログデータ記憶部(107)に格納する。
【0018】
図5は、ログデータ記憶部(107)に格納された複数のログデータをログデータ分類部(108)が読み込み、ログデータ分類部(108)はそれぞれのログデータが保持するスレッドIDの値ごとにログデータを分類し、分類済みログデータ(501)、(502)、(503)を作成し、分類済みログデータ記憶部(107)に格納する処理を示している。
分類済みログデータのデータ構造は、図6に示すように、スレッドID(601)と、ログデータのリスト(602)を保持する。
例えば、図5では分類済みログデータ(501)は、“スレッドID”として“001”を保持しており、そのログデータのリストには、ログデータ記憶部(107)に格納されているログデータのうち、“スレッドID”データが“001”であるもののみを格納している。
【0019】
図7は、コールグラフデータ構築部(110)が、分類済みログデータ記憶部(109)から分類済みログデータ(701)を読み込み、コールグラフデータ(702)を作成する処理を示している。
コールグラフデータ(702)はツリー構造のデータであり、ツリーの頂点に「ルート」オブジェクト(7021)があり、その子要素として「スレッド」オブジェクト(7022)が複数結合している。さらに、「スレッド」オブジェクト(7022)の子要素としてログデータ(7023)が複数結合している)。
ログデータ同士の間にも、メソッドを呼び出した側/呼び出された側の関係に対応したツリーの親子関係が存在する。生成したコールグラフデータ(702)は、コールグラフデータ記憶部(111)に格納される。
【0020】
図8は、「ルート」オブジェクト、「スレッド」オブジェクトのデータ構造を示したものである。
「ルート」オブジェクト(7021)は内部にデータを持たないオブジェクトであり、「スレッド」オブジェクト(7022)はスレッドID(70221)を保持するオブジェクトである。
【0021】
図9は、コールグラフデータ構築部(110)がコールグラフデータ(702)を構築するアルゴリズムを示すフローチャートである。
まず、コールグラフデータ構築部(110)は「ルート」オブジェクトを1つ作成する(ステップ901)。
次に、分類済みログデータ記憶部(109)から分類済みログデータ(701)を1件取得する(ステップ902)。
次に、取得した分類済みログデータ(702)が保持する“スレッドID”を取得し、その値を使用して「スレッド」オブジェクトを作成し、ステップ901で作成した「ルート」オブジェクトの子要素として設定する(ステップ903)。
次に、一時変数“直前の要素”にステップ903で作成した「スレッド」オブジェクトを設定する(ステップ904)。これはコールグラフデータのツリー構造を構築するために使用する一時的な変数である。
次に、ステップ902で取得した分類済みログデータ(701)が保持するログデータを1件取得する(ステップ905)。
次に、取得したログデータ(701)の“分類”の値を取得し、この値を評価する(ステップ906)。
【0022】
“分類”が“ENTRY”である場合は、一時変数“親要素”に、一時変数“直前の要素”に格納されている要素を設定する(ステップ907)。そして、一時変数“親要素”に設定されている要素の子要素として、ステップ905で取得したログデータを設定する(ステップ910)。
“分類”が“EXIT”である場合は、ステップ905で取得したログデータを、一時変数“親要素”に設定されている要素の子要素として設定する(ステップ908)。そして、一時変数“親要素”に、一時変数“親要素”に設定されている要素の親要素を設定する(ステップ909)。
“分類”が“EXIT”“ENTRY”以外である場合は、ステップ905で取得したログデータを、一時変数“親要素”に設定されている要素の子要素として設定する(ステップ910)。
以上の処理が完成したならば、次に、一時変数“直前の要素”に、ステップ905で取得したログデータを設定する(ステップ911)。
以上、ステップ902で取得した分類済みログデータ(701)が保持する全てのログデータに関して、ステップ905からステップ911までの処理を繰り返し行う(ステップ912)。
また、分類済みログデータ記憶部(109)に記憶されている全ての分類済みログデータ(701)に関して、ステップ902からステップ912までの処理を繰り返し行う(ステップ913)。
以上で、コールグラフデータの構築処理は完了である。
【0023】
図10は、コールグラフ表示装置(112)が、コールグラフデータ構築部(110)が構築したコールグラフデータを読み込み、ディスプレイ(117)に表示したコールグラフ(1001)の例を示す図である。
コールグラフデータはツリー構造をもつデータであるため、コールグラフ表示装置(112)はツリー構造をそのままツリー形式で表示している。
図10では、はじめに「スレッド[001]」(1002)、「スレッド[002](1003)、「スレッド[003](1004)のノードが表示されており、そのうち「スレッド[001]」(1002)のツリーノードを展開すると、スレッドIDが001であるスレッド上で実行された処理に関する全てのログ(1005)が表示される。
このツリーを見れば、アプリケーションの実行経路を用意に把握することができ、また、メソッドの呼び出し関係がツリー構造で表現されているため、例えば、あるメソッドが、どのメソッドから呼び出されたものであるか、などといった関係を容易に把握することができる。
【0024】
図11は、対象アプリケーション(101)にエラーが発生した際の追跡ログを読み込み、コールグラフ表示装置(112)で表示したものの一部を示す図である。
コールグラフ表示装置(112)は、ログデータの“分類”データの値が“CATCH”であるものは、コールグラフを表示する際に、そのログデータにエラーが発生したことを示すマーク(1101)を表示する。
このように表示することにより、多数の追跡ログの中からエラーの発生を示すログを探し易くなる。この場合、エラーが発生したことを示すマーク(1101)はログデータ「Sample.run(String):21」(1103)に表示されているため、当該Sampleクラス(1103)のソースコード(1104)上の21行目(1105)で例外オブジェクトをキャッチしていることがわかり、このログデータの1つ前のログデータ「Sample.run(String):20」(1102)を参照すると、Sampleクラス(1103)のソースコード(1104)上の20行目(1106)に記述されている処理の実行中にエラーが発生したことが推測できる。
【0025】
しかしこの場合、何故20行目で例外が発生したのか、根本的な原因を明確にすることはできない。そこで、本発明では「比較」機能を用いて、ログを比較することにより、例外の根本的な原因を特定する。「比較」機能は、指定したエラーログが示す例外が発生するまでの一連のログと、その一連のログと同一の動作経路を示す別の一連のログとを比較し、その差分を表示することで、障害の根本的な原因を特定する作業を支援する機能を提供する。
【0026】
図12は、「比較」機能を実行している様子を示している。「比較」機能を実行するには、エラーを示すマークが表示されているログデータ(1201)を選択し、表示されるメニューから「比較」(1202)を指定する。すると、ログ比較範囲計算部(113)は図13のフロ−チャ−トに示すアルゴリズムに従って処理を行う。
【0027】
図13に示すアルゴリズムでは、まずコールグラフで選択されているログデータを取得する(ステップ1301)。
次に、一時変数“対象データ”に選択されたログデータを設定する(ステップ1302)。
次に、一時変数“対象データ”に設定されているデータが「スレッド」オブジェクトであるかどうかを評価する(ステップ1303)。
「スレッド」オブジェクトでない場合は、一時変数“対象データ”に設定されているログデータを、対象ログデータリストに追加する(ステップ1304)。対象ログデータリストはリスト構造をもつ一時データである。
次に、一時変数“対象データ”に、“対象データ”に設定されているデータの親要素のデータを設定する(ステップ1305)。そして、一時変数“対象データ”に設定されているデータが「スレッド」オブジェクトになるまで、ステップ1303からステップ1305の処理を繰り返し、ステップ1303の判定処理において、対象データが「スレッド」オブジェクトであると評価された場合は、対象ログデータリストに格納されたログデータを、「比較範囲設定」ダイアログ上にツリー形式で表示する(ステップ1306)。
すると、「比較範囲設定」ダイアログ(1401)が図14のように表示される。
【0028】
図14は、「比較範囲の設定」ダイアログ(1401)が表示され、コールグラフデータ表示装置(112)でユーザが選択指定したログデータ(1405)と、その全ての親要素のログデータ(1402、1403、1404)がツリー形式で表示される様子を示している。
このダイアログ(1401)では、図12のコールグラフでユーザが選択指定したエラーログが出力されるまでに、どのようなメソッドの呼び出し経路を辿ったかを示している。
例えば、図14の例では、まずSampleクラスのmain(String[])メソッド内の処理中(ソースコードの300行目に記述されている処理)でservice()メソッドが呼び出され、呼び出されたservice()メソッドはさらにメソッド内の処理中(ソースコードの250行目に記述されている処理)で、action()メソッドを呼び出し、さらにaction()メソッドの処理中(ソースコードの16行目に記述されている処理)で、run(String)メソッドを呼び出し、run(String)メソッド内の処理(ソースコードの21行目に記述されている処理)で、例外が発生したことを示している。
【0029】
次に、「比較範囲の設定」ダイアログ(1401)に表示されているメソッドの呼び出し関係から、比較を行うログの範囲を決定する。ここで選択したメソッド呼び出しの経路と同一の処理経路を示すログが比較の対象となる。例えば図14の場合は「Sample.service():250」(1403)と「Sample.action():16」(1404)と「Sample.run(String):21」(1405)を選択しており、この場合は「Sampleクラスのserviceメソッドが実行され、250行目の処理でaction(String)メソッドを呼び出し、actionメソッドが実行され、16行目の処理でrun(String)メソッドを呼び出し、run(String)メソッドが実行され、run(String)メソッドが終了するまで」を示すログを、比較の対象として指定していることになる。
この状態で「比較開始」ボタン(1406)を押す操作を行う。
すると、比較ログデータリスト生成部(114)は、図15のフロ−チャ−トに示す処理を行い、比較先ログデータリストを作成する。
【0030】
図15では、まず「比較範囲の設定」ダイアログ(1401)で指定したログデータのリスト(比較範囲データ)を取得する(ステップ1501)。比較範囲データ(1601)は、図16に示すようなツリー構造のデータであり、「比較範囲の設定」ダイアログ(1401)で指定したログデータと同様の構造を持っている。
次に、取得した比較範囲データ(1601)から、葉のデータ(つまりツリー構造のデータの末端に存在するデータ)を取得する(ステップ1502)。図16の例では、ログデータ(1604)が、葉のデータに該当する。
次に、コールグラフデータ記憶部(111)からコールグラフデータを1件ずつ取得する(ステップ1503)。
次に、取得したコールグラフデータが保持するログデータを1件ずつ取得する(ステップ1504)。
次に、ステップ1504で取得したログデータの“分類”データが“ENTRY”であり、かつ“クラス名”“メソッド名”データが、ステップ1502で取得した葉データの“クラス名”“メソッド名”データと一致するかどうか、評価する(ステップ1505)。
【0031】
図16を例にとると、取得したログデータの“分類”データが“ENTRY”であり、かつ“クラス名”データが“C”、“メソッド名”データが“c()”であるかどうかを評価する。
ステップ1505の評価結果が“真”であれば、次にステップ1504で取得したログデータの親ノードの構造と、ステップ1502で取得した葉データの親ノードの構造が一致しているかどうかを評価する(ステップ1506)。
一致している場合は、一致している部分の最上位の親ノードが示すメソッドの、開始時を示すログデータから、ステップ1504で取得したログデータが示すメソッドの終了時を示すログデータまでの一連のログデータ(一致ログデータ)を、一致ログデータリストに追加する(ステップ1507)。
なお、一致ログデータリストとは、一致ログデータを格納するリストである。
例えば、図16では、(1601)に示す比較範囲データがある。これは、(行番号=“40”、分類=”-“、クラス名=“C”、メソッド名=“c()”」というデータを持つ葉ログデータ(1604)があり、その親ノードとして(行番号=“30”、種別=”-“、クラス名=“B”、メソッド名=“b()”」というデータをもつログデータ(1603)が存在し、さらにその親ノードとして、(行番号=“20”、種別=”-“、クラス名=“A”、メソッド名=“a()”」というデータをもつログデータ(1602)が存在する、という構造を持つ比較範囲データである。
【0032】
このような比較範囲データ(1601)に対して、図15に示す処理を適用すると、ステップ1505の評価の結果、図17に示すような、(1701)、(1704)という2つのログデータが抽出されたとする。これらのデータに対し、ステップ1506の評価を適用する。
ログデータ(1701)の親ノードを見てみると、その親ノードは、(行番号=“30”、分類=”-“、クラス名=“B”、メソッド名=“b()”」というデータをもつログデータ(1702)であり、さらにその親ノードは(行番号=“20”、分類=”-“、クラス名=“A”、メソッド名=“a()”」というデータを持つログデータ(1703)であるため、比較範囲データの葉ノード(1604)と、ログデータ(1701)の親ノードの構造は一致しているといえる。
【0033】
一方、ログデータ(1704)の親ノードを見てみると、その親ノードは、(行番号=“99”、分類=”-“、クラス名=“Z”、メソッド名=“z()”)というデータを持つログデータ(1705)であり、さらにその親ノードは(行番号=“60”、分類=”-“、クラス名=“E”、メソッド名=“e()”」というデータを持つログデータ(1706)であるため、比較範囲データの葉ノード(1604)と、ログデータ(1704)の親ノードの構造は一致しない。
これにより、(1707)が示す範囲の一連のログデータが一致ログデータとして抽出される。この一致ログデータは、一致ログデータリストに格納される。
コールグラフデータ記憶部(111)が保持する全てのコールグラフデータを取得し、さらにそのコールグラフデータが保持する全てのログデータに関して、ステップ1503からステップ1509までの処理を繰り返し、全て完了したら、比較先ログデータリストの作成に関する処理は全て終了である。
【0034】
ところで、図15に示す処理では、全てのログデータから、比較範囲データ(1601)が保持するログデータと親データの構造が一致するものを取得していたため、当然、比較元となる一連のログデータも、その他の一致ログデータと一緒に一致ログリストに格納されてしまっている。
そのため、図15に示す処理の完了後に、一致ログデータリストから、比較元の一連のログデータを分離する必要がある。この処理は、一致ログデータリストに格納されている一致ログデータの中から、比較範囲データが保持する各ログデータを構成要素としている一致ログデータを探し出すことにより実現できる。
【0035】
例えば、図18では、一致ログデータリスト(1812)に格納されている、一致ログデータ(1813)を構成しているログデータ(1801、1802、1803)と、比較範囲データ(1807)が保持するログデータ(1804,1805,1806)は、それぞれ同一のオブジェクトであるため、一致ログデータ(1813)は比較元の一連のログデータ(比較元ログデータ)であることがわかる。そこで、一致ログデータ(1813)を一致ログデータリストから取り出す(1811)。
以降、一致ログデータリスト(1812)から取り出した一致ログデータ(1813)を、“比較元ログデータ”(1814)、そして比較元ログデータを取り除いた状態の一致ログデータリストを“比較先ログデータリスト”(1815)と称する。
【0036】
比較元ログデータ(1814)と、比較先ログデータリスト(1815)の取得が完了したならば、次に実際にこれらのログデータを比較する処理を行うが、その前に、図19に示すように比較元ログデータ(1814)と、比較先ログデータリスト(1815)に格納されている全ての比較先ログデータに関して、そのデータ構造を、一旦、非階層構造のフラットなリスト構造に変換する(1903、1904)。ログデータは、枝の分岐を持たないツリー構造のデータであるため、リスト構造に変換する場合は、単純に先頭ノードのログデータから順番に、リスト構造のデータに値を格納するだけである。
【0037】
ログデータのデータ構造の変換が完了したならば、比較処理部(115)を使用して、フラット化した比較元ログデータ(1903)と、比較先ログデータリスト(1904)に格納されている全ての比較先ログデータの比較を行う。
比較処理部(115)は、diffプログラムと同等機能のプログラムである。diffプログラムとは2つのデータの相違点を取得するためのプログラムであり、有名なものとしてはUNIX(登録商標)のdiffコマンドなどが挙げられる。diffプログラムは通常2つのテキストファイルに対し、それぞれの各行の文字列を比較の対象とし、その相違を取得するが、比較処理部(115)は比較元ログデータ(1903)と比較先ログデータリスト(1904)に格納されるログデータのデータの相違を取得する。なお、diffプログラムの比較アルゴリズムに関しては、公知の技術であるため説明を省略する。
【0038】
図20〜図22は、比較元ログデータ(1903)と、比較先ログデータリスト(1904)から取得した比較先ログデータ(1)(2002)との比較処理の様子を示したものである。
図20では、比較処理部(115)が、比較元ログデータ(1903)のログデータ(2003)と、比較先ログデータ(1)(2002)のログデータ(2004)とが“衝突”していることを検知している様子を示している。“衝突”とは、同様の行に存在するデータが異なっている状態を示す。この例では比較元のログデータ(2003)の行番号データは“8”であるのに対し、比較先のログデータ(2004)の行番号データは“10”であるため、衝突が発生している。この場合、比較処理部(115)、比較情報データ(2006)を作成し、比較情報データリスト(2005)に追加する。比較情報データリスト(2005)は、ログデータを比較した結果に関する情報を格納するためのデータリストであり、“相違の種類”(2007)、“比較元の相違開始インデックス”(2008)、“比較元の相違終了インデックス”(2009)、“比較先の相違開始インデックス”(2010)、“比較先の相違終了インデックス”(2011)というデータを保持する。
【0039】
“相違の種類”データには、“衝突”、“追加”、“削除”のいずれかの値が格納される。
“比較元の相違開始インデックス”、“比較元の相違終了インデックス”、“比較先の相違開始インデックス”、“比較先の相違終了インデックス”データには、相違箇所を特定するためのインデックス情報が格納される。なお、比較元ログデータ、比較先ログデータはリスト構造を持ったデータであり、要素の位置を示すためのインデックス情報を持っている。
図20の場合は、“相違の種類”データ(2007)には“衝突”を格納し、また比較元ログデータのインデックス2〜3の間のログデータと、比較先ログデータのインデックス2〜3の間のログデータに関して衝突が発生しているため、“比較元の相違開始インデックス”(2008)には“2”を、“比較元の相違終了インデックス”(2009)には“3”を、“比較先の相違開始インデックス”(2010)には“2”を、“比較先の相違終了インデックス”(2011)には“3”を格納している。
【0040】
図21は、比較処理部(115)が“挿入”を検知している様子を示している。
“挿入”とは、ある箇所において、比較元ログデータ(1903)には存在せず、比較先のログデータ(1)(2002)には存在するログデータがある状態を示す。
図21の例では、比較元ログデータ(1903)の(2101)の位置(インデックス5の位置)にはログデータは存在しないが、比較先ログデータ(2002)の同じ位置には(2102)に示すログデータが存在するため、挿入が発生していることがわかる。このような場合、比較処理部(115)は比較情報データ(2103)を、比較情報データリスト(2005)に追加する。
【0041】
図22は、比較処理部(115)が“削除”を検知している様子を示している。
“削除”とは、ある箇所において、比較元ログデータ(1903)には存在しているが、比較先のログデータ(2002)には存在しないログデータがある状態を示す。
図22の例では、比較元ログデータ(1903)の(2201)の位置(インデックス8〜10の間)には存在するが、比較先ログデータ(2002)の(2202)の位置(インデックス9の位置)には存在しないログデータがあるため、削除が発生していることがわかる。このような場合、比較処理部(115)は比較情報データ(2203)を比較情報データリスト(2005)に追加する。
【0042】
このように、比較元ログデータ(1903)と、比較先ログデータ(1)(2002)を比較して作成した比較情報データは、比較先ログデータ(1)(2002)に紐付けられ、保存される。
比較処理部(115)は、上記と同様の手順で全ての比較先ログデータ(1904)と、比較元ログデータ(1903)に関して比較処理を行い、それぞれの比較先ログデータに対応する比較情報データ(2303)を作成する。そして、図23に示すように、比較情報データ(2303)はフラット化前の比較先ログデータ(1815)と紐付け、フラット化前の比較元ログデータ(1814)と共に比較結果記憶部(115M)に保存する。
比較元ログデータと、比較先データリスト、そしてそれに紐づく比較情報データ、それぞれが作成できたならば、最後にこれらのデータをログ比較結果表示装置(116)に渡し、ディスプレイ(117)に表示する。
【0043】
図24に示すように、比較元ログデータ(1814)は比較元ビュー(2401)に表示し、比較先ログデータリストに格納されている比較先ログデータ(1815)は、それぞれ比較先ビュー(2402)の各タブビュー(2403)に表示する。
タブ(2404)を切り替えることにより、それぞれの比較先ログデータを見ることができる。また、比較情報データを元に、各ビュー内のログデータをハイライト表示することで、“衝突”、“挿入”、“削除”の状況が容易に把握できる。なお、“衝突”の箇所は黄色(2405)、“挿入”の箇所は青色(2406)、“削除”の箇所は赤色(2407)で表示される。
また、この状態でソースコードエディタを用いてソースコード記憶部118から対象アプリケーション(101)のソースコードを読み出し、ログ比較結果表示装置(116)に渡すと、ログ比較結果表示装置(116)はハイライト表示されているログデータが示すソースコード行を図25に示すようにハイライト表示して明示する。
【0044】
図25では、Sampleクラスのソースコードをソースコードエディタ(2501)で取得してログ比較結果表示装置(116)で表示した例を示したものである。
ここでは、図24でハイライト表示されているログデータが示す行(8,10,14,21,22行目)が(2502)、(2503)、(2504)、(2505)で示すように同色でハイライト表示される。また、図24におけるタブ(2404)を切り替えることにより、別の比較先ログデータとの比較結果が同じようにハイライト表示される。
【0045】
以上の機能により、対象アプリケーション(101)にエラーが発生した場合、そのエラーが発生するに至った処理経路を示すログと、同様の処理経路を示している過去のログを比較することができ、さらにその比較結果に基づきエラーが発生している処理経路中のソースコードをハイライト表示することにより、エラーの根本的な原因を解決する支援が可能となる。
【0046】
例えば、対象アプリケーション(101)の運用者がエラーの原因追跡を行う場合は、まず対象アプリケーション(101)が出力するログをログ分析装置(105)に読み込み、「比較」機能を実行する。すると図24、25に示したように、エラー発生時点以前の過去のログとの比較結果が、ログ比較結果表示装置(112)でディスプレイ(117)にハイライト表示される。
図25の例では21,22行目がハイライト表示されているため、この行で例外をキャッチしたことがエラーの直接の原因である、ということが即座に把握できる。
さらに、なぜ例外が発生したのか、すなわちこのエラーの根本的な原因は何なのかを調査する場合は、その他のハイライト表示箇所が根本的な原因を特定する手がかりとなる。
図25のソースコードを見ると、8、10行目に黄色のハイライト表示(2502)、(2503)があり、言い換えると、以前にこのメソッドが実行した際は10行目が実行されたが、今回(エラーが発生時)は、8行目が実行されていた、ということがわかる。そこで、アプリケーション開発者は8,10行目の処理を中心にソースコードを精査することで、エラーの根本的な原因を突き止めることができる。
【0047】
なお、上記の説明では対象アプリケーションのエラーの原因箇所を特定する作業を行う場合の処理について説明したが、エラーが発生しない場合において、ユーザが設定した特定の処理経路を持つメソッドを抽出する場合にも利用することができる。この場合には、図11のコールグラフ中で任意のスレッドを選択し、このスレッド内の処理でエラーが発生したものと擬似的に設定した後、エラーが発生した場合と同様の処理を行えばよい。
また、比較結果については、ディスプレイ画面に出力しているが、印刷装置で印刷出力する構成にすることができることは言うまでもない。
【図面の簡単な説明】
【0048】
【図1】本発明に係るアプリケーションの障害原因の特定作業支援システムの実施形態を示す全体構成図である。
【図2】Sampleクラスのソースコードとそのクラスに対し追跡ログ出力処理の実装を行った場合に出力される追跡ログの例を示す図である。
【図3】追跡ログファイルのフォーマットの例を示す図である。
【図4】対象アプリケーションが出力した追跡ログをログ分析装置が読み込む処理の概要を示す図である。
【図5】ログデータ記憶部に格納された複数のログデータをログデータ分類部が読み込み、それぞれのログデータが保持するスレッドIDの値ごとにログデータを分類し、分類済みログデータを作成し、分類済みログデータ記憶部に格納する処理の概要を示す図である。
【図6】分類済みログデータのデータ構造の例を示す図である。
【図7】コールグラフデータ構築部が分類済みログデータ記憶部から分類済みログデータを読み込み、コールグラフデータを作成する処理の概要を示す図である。
【図8】「ルート」オブジェクト、「スレッド」オブジェクトのデータ構造の例を示す図である。
【図9】コールグラフデータ構築部がコールグラフデータを構築するアルゴリズムを示すフローチャートである。
【図10】コールグラフ表示装置がコールグラフデータ構築部で構築したコールグラフデータを読み込み、ディスプレイに表示したコールグラフの例を示す図である。
【図11】対象アプリケーションにエラーが発生した際の追跡ログを読み込み、コールグラフ表示装置で表示したものの一部を示す図である。
【図12】「比較」機能を実行させる様子を示す図である。
【図13】ログ比較範囲計算部のアルゴリズムを示すフローチャートである。
【図14】「比較範囲の設定」ダイアログ上にユーザが選択指定したログデータとその全ての親要素のログデータがツリー形式で表示される例を示す図である。
【図15】比較ログデータリスト生成部のアルゴリズムを示すフローチャートである。
【図16】比較範囲データのツリー構造を示す図である。
【図17】比較範囲データに対して抽出される2つのログデータの例を示す図である。
【図18】比較元ログデータと比較先ログデータの生成処理の概要を示す図である。
【図19】比較元ログデータと比較先ログデータリストに格納されている全ての比較先ログデータのデータ構造を、非階層構造のフラットなリスト構造に変換する処理の概要を示す図である。
【図20】比較元ログデータと比較先ログデータリストから取得した比較先ログデータとの比較処理の概要を示す図である。
【図21】比較処理部が“挿入”を検知した例を示す図である。
【図22】比較処理部が“削除”を検知した例を示す図である。
【図23】比較先ログデータと比較情報データの紐付けを示す図である。
【図24】ログ比較結果の表示例を示す図である。
【図25】エラー原因と考えられるソースコードの行をハイライト表示した例を示す図である。
【符号の説明】
【0049】
101…対象アプリケーション、102…ログ出力処理実装装置、103…ログ出力処理実装済みアプリケーション、104…ログファイル格納部、105…ログ分析装置、106…ログ読み込み部、107…ログデータ記憶部、108…ログデータ分類部、109…分類済みログデータ記憶部、110…コールグラフデータ構築部、111…コールグラフデータ記憶部、112…コールグラフ表示装置、113…ログ比較範囲計算部、114…比較ログデータリスト生成部、115…比較処理部、116…ログ比較結果表示装置、117…ディスプレイ、118…アプリケーションソースコード格納部。
【特許請求の範囲】
【請求項1】
対象となるアプリケーションに処理単位毎のログ出力処理を実装するログ出力処理実装手段と、前記対象となるアプリケーションが処理単位毎に出力したログデータを読み込み、そのログデータを分析するログ分析手段とから構成され、
前記ログ分析手段が、
前記処理単位毎のログデータから前記アプリケーションを構成する各処理単位の呼び出し関係を示すコールフローグラフを作成し、コールフローグラフ記憶手段に記憶させるコールフローグラフ作成手段と、
前記コールフローグラフ作成手段が作成したコールフローグラフを表示し、当該コールフローグラフ中において前記アプリケーションの障害原因の一要因となる処理単位のログデータを比較元ログデータとしてユーザ選択操作によって受け付けるコールフローグラフ表示手段と、
ユーザ操作によって選択された比較元ログデータの処理単位と同一処理単位を含む他の処理単位群のログデータを前記コールフローグラフ記憶手段から取得し、当該他の処理単位群のログデータを比較先ログデータリストとして生成する比較ログデータリスト生成手段と、
前記比較元ログデータと前記比較先ログデータリスト内の各ログデータとを比較し、処理単位の呼び出し関係が異なるログデータを抽出して出力するログデータ比較手段と
を備えることを特徴とするアプリケーションの障害原因の特定作業支援システム。
【請求項2】
前記アプリケーションが処理単位毎に出力したログデータには当該処理単位のソースコード中の行番号を含み、前記ログデータ比較手段は前記比較元ログデータと前記比較先ログデータリスト内の各ログデータとの比較により、処理単位の呼び出し関係が異なるログデータを抽出すると共に、同一処理が異なるソースコード行に存在することを抽出して出力することを特徴とする請求項1に記載のアプリケーションの障害原因の特定作業支援システム。
【請求項3】
前記対象となるアプリケーションのソースコードを記憶したソースコード記憶手段と、前記ログデータ比較手段が出力した処理単位の呼び出し関係が異なるログデータ及び同一処理が異なるソースコード行に存在する処理単位のログデータの行番号により、前記ソースコード記憶手段から該当する行のソースコードを取得し、表示画面に予め設定した表示形式で強調表示出力する出力手段をさらに備えることを特徴とする請求項2に記載のアプリケーションの障害原因の特定作業支援システム。
【請求項1】
対象となるアプリケーションに処理単位毎のログ出力処理を実装するログ出力処理実装手段と、前記対象となるアプリケーションが処理単位毎に出力したログデータを読み込み、そのログデータを分析するログ分析手段とから構成され、
前記ログ分析手段が、
前記処理単位毎のログデータから前記アプリケーションを構成する各処理単位の呼び出し関係を示すコールフローグラフを作成し、コールフローグラフ記憶手段に記憶させるコールフローグラフ作成手段と、
前記コールフローグラフ作成手段が作成したコールフローグラフを表示し、当該コールフローグラフ中において前記アプリケーションの障害原因の一要因となる処理単位のログデータを比較元ログデータとしてユーザ選択操作によって受け付けるコールフローグラフ表示手段と、
ユーザ操作によって選択された比較元ログデータの処理単位と同一処理単位を含む他の処理単位群のログデータを前記コールフローグラフ記憶手段から取得し、当該他の処理単位群のログデータを比較先ログデータリストとして生成する比較ログデータリスト生成手段と、
前記比較元ログデータと前記比較先ログデータリスト内の各ログデータとを比較し、処理単位の呼び出し関係が異なるログデータを抽出して出力するログデータ比較手段と
を備えることを特徴とするアプリケーションの障害原因の特定作業支援システム。
【請求項2】
前記アプリケーションが処理単位毎に出力したログデータには当該処理単位のソースコード中の行番号を含み、前記ログデータ比較手段は前記比較元ログデータと前記比較先ログデータリスト内の各ログデータとの比較により、処理単位の呼び出し関係が異なるログデータを抽出すると共に、同一処理が異なるソースコード行に存在することを抽出して出力することを特徴とする請求項1に記載のアプリケーションの障害原因の特定作業支援システム。
【請求項3】
前記対象となるアプリケーションのソースコードを記憶したソースコード記憶手段と、前記ログデータ比較手段が出力した処理単位の呼び出し関係が異なるログデータ及び同一処理が異なるソースコード行に存在する処理単位のログデータの行番号により、前記ソースコード記憶手段から該当する行のソースコードを取得し、表示画面に予め設定した表示形式で強調表示出力する出力手段をさらに備えることを特徴とする請求項2に記載のアプリケーションの障害原因の特定作業支援システム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【公開番号】特開2007−241426(P2007−241426A)
【公開日】平成19年9月20日(2007.9.20)
【国際特許分類】
【出願番号】特願2006−59682(P2006−59682)
【出願日】平成18年3月6日(2006.3.6)
【出願人】(000233055)日立ソフトウエアエンジニアリング株式会社 (1,610)
【Fターム(参考)】
【公開日】平成19年9月20日(2007.9.20)
【国際特許分類】
【出願日】平成18年3月6日(2006.3.6)
【出願人】(000233055)日立ソフトウエアエンジニアリング株式会社 (1,610)
【Fターム(参考)】
[ Back to top ]