(57)【特許請求の範囲】
【請求項１】
コマンドの入力に応じて機器から出力される複数行の記述を含むログの各行を、構文が共通する記述ごとの識別子に変換して、前記識別子の第１の配列を生成する生成部と、
前記第１の配列の複数の部分に出現する、前記識別子を２以上含む第２の配列を、前記第１の配列から抽出し、前記第１の配列において前記第２の配列に該当する部分を、前記第２の配列ごとの識別子に置換する抽出部と、
を有することを特徴とする構造化ログ生成装置。
【請求項２】
前記抽出部は、前記第１の配列から前記第２の配列を再帰的に抽出する、
ことを特徴とする請求項１記載の構造化ログ生成装置。
【請求項３】
前記第２の配列は、当該第２の配列によって置換する前の配列の複数の部分に出現する、前記識別子を２以上含む配列の中で、当該第２の配列の前によって置換する前の配列の長さを最も減少させる配列である、
ことを特徴とする請求項１又は２記載の構造化ログ生成装置。
【請求項４】
前記第２の配列は、当該第２の配列の内部に前記識別子の繰り返しを含まない、
ことを特徴とする請求項１乃至３いずれか一項記載の構造化ログ生成装置。
【請求項５】
前記抽出部は、更に、前記第１の配列において前記第２の配列に該当する部分が前記第２の配列ごとの識別子に置換することで得られる識別子の配列において、同一の識別子が連続する部分を、当該識別子と当該連続の回数との組によって置換する、
ことを特徴とする請求項１乃至４いずれか一項記載の構造化ログ生成装置。
【請求項６】
コンピュータが、
コマンドの入力に応じて機器から出力される複数行の記述を含むログの各行を、構文が共通する記述ごとの識別子に変換して、前記識別子の第１の配列を生成する生成手順と、
前記第１の配列の複数の部分に出現する、前記識別子を２以上含む第２の配列を、前記第１の配列から抽出し、前記第１の配列において前記第２の配列に該当する部分を、前記第２の配列ごとの識別子に置換する抽出手順と、
を実行することを特徴とする構造化ログ生成方法。
【請求項７】
請求項１乃至５いずれか一項記載の各部としてコンピュータを機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、構造化ログ生成装置、構造化ログ生成方法、及びプログラム
に関する。
【背景技術】
【０００２】
ＩＰネットワーク、Ｗｅｂサービス等で用いられるサーバやルータ等の機器は、機器の異常発生時の対応や状態確認を目的として、一般に、ハードウェアやソフトウェアに関するログを出力するコマンドを具備している。運用者・管理者等の利用者は必要に応じてこれらのコマンドを実施し、出力されたログを収集後、故障回復措置やベンダへの解析依頼の送付といった行動をとる。これらのコマンドによって出力されるログ（以下、「コマンド出力ログ」という。）は、一般に、Ｓｙｓｌｏｇやエラー情報では出力されない、機器の詳細な現在の状態が記述されたログであるため、まだルール化されていない未知の故障の検知や詳細な事象の原因究明に非常に有用である。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１５−３６８９１号公報
【非特許文献】
【０００４】
【非特許文献１】Splunk，［online］、［平成２７年７月８日検索］、インターネット〈URL：http://www.splunk.com/〉
【非特許文献２】Kasai, T.; Lee, G.; Arimura, H.; Arikawa, S.; Park, K. (2001). Linear-Time Longest-Common-Prefix Computation in Suffix Arrays and Its Applications. Proceedings of the 12th Annual Symposium on Combinatorial Pattern Matching. Lecture Notes in Computer Science 2089. pp. 181-192
【非特許文献３】G. H. Gonnet, R. Baeza-yates, T. Snider, New indices for text: Pat tree and Pat arrays. Information Retrieval, Prentice Hall (1992).
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、コマンド出力ログは、数値やステータス等の多岐に渡る情報が記述されたテキストフォーマットであり、一度の出力で数千から数万行に至るものがある。したがって、コマンド出力ログの実際の利用には、利用者の知識と経験に依存するところが多く、自動分析が難しいという課題がある。
【０００６】
Ｓｙｓｌｏｇやアプリケーションログなど、稼働中の機器で発生したイベントが契機で追記されていくログ（以下、コマンド出力ログと区別するため、「逐次型ログ」という。）については、近年において、特に故障監視の高度化を目的として、分析のニーズが高まったため、多くの研究や市中製品が存在する。例えば、Ｓｐｌｕｎｋ（非特許文献１）は、逐次型ログの分析を簡略化するための分析基盤であり、蓄積されるデータの可視化や検索を高速に実施可能なツールである。
【０００７】
しかし、このツール利用するためには、個々の逐次型ログの意味やメッセージの内容に関しての事前知識が必要となる。また、コマンド出力ログのような、複数行に渡る、膨大で複雑なログに対しての適用は考慮されていない。
【０００８】
一方、特許文献１では、逐次型ログを対象とし、メッセージ内に含まれるＩＤやＩＰアドレス等のパラメータを除去した、テンプレートの自動的な抽出法が開示されている。この手法では、逐次型ログのメッセージフォーマットに関する事前知識を特に必要とせず、また、逐次的にテンプレートを抽出できるという利点があるが、上述したコマンド出力ログのような複数行に渡るログに対しての適用は困難である。
【０００９】
本発明は、上記の点に鑑みてなされたものであって、機器が出力する複数行から成るログを利用者にとって扱いやすい形式へ変換することを目的とする。
【課題を解決するための手段】
【００１０】
そこで上記課題を解決するため、構造化ログ生成装置は、コマンドの入力に応じて機器から出力される複数行の記述を含むログの各行を、構文が共通する記述ごとの識別子に変換して、前記識別子の第１の配列を生成する生成部と、前記第１の配列の複数の部分に出現する、前記識別子を２以上含む第２の配列を、前記第１の配列から抽出し、前記第１の配列において前記第２の配列に該当する部分を、前記第２の配列ごとの識別子に置換する抽出部と、を有する。
【発明の効果】
【００１１】
機器が出力する複数行から成るログを利用者にとって扱いやすい形式へ変換することができる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態におけるシステム構成例を示す図である。
【図２】コマンド出力ログの第１の例を示す図である。
【図３】コマンド出力ログの第２の例を示す図である。
【図４】第１の実施の形態における構造化ログ生成装置のハードウェア構成例を示す図である。
【図５】第１の実施の形態における構造化ログ生成装置の機能構成例を示す図である。
【図６】構造化ログ生成装置が実行する処理手順の一例を説明するためのフローチャートである。
【図７】頻出パターンの抽出法の一例を説明するためのフローチャートである。
【図８】文字列ｂａｎａｎａｎａ＄のｓｕｆｆｉｘ  ａｒｒａｙの例を示す図である。
【図９】改変した高さ配列ＨＧＴ'の生成手順の一例を示す図である。
【図１０】最もＩＤ削減率の高い頻出パターンの探索手順の一例を示す図である。
【図１１】第２の実施の形態における構造化ログ生成装置の機能構成例を示す図である。
【図１２】第３の実施の形態における構造化ログ生成装置の機能構成例を示す図である。
【発明を実施するための形態】
【００１３】
以下、図面に基づいて本発明の実施の形態を説明する。図１は、第１の実施の形態におけるシステム構成例を示す図である。図１において、構造化ログ生成装置１０は、ＬＡＮ（Local Area Network）又はインターネット等のネットワークを介して、機器２０−１〜機器２０−ｎ等の１以上の機器２０とネットワークを介して接続されている。
【００１４】
機器２０は、その稼働状態等について監視対象とされている機器２０である。各機器２０は、コマンドの入力に応じて、当該機器２０のハードウェア又はソフトウェアの状態等を示すログ情報（以下、「コマンド出力ログ」という。）を生成し、出力する。機器２０の監視は、コマンド出力ログに基づいて行われる。１回のコマンドの入力によって出力されるコマンド出力ログは、例えば、図２又は図３に示されるように、複数行の記述を含む。なお、図２は、「http://www.alaxala.com/jp/techinfo/archive/manual/AX7800S/HTML/10_10_/COMREF/0103.HTM」から引用されたものである。図３は、「http://www.cisco.com/cisco/web/support/JP/100/1007/1007955_crashes_router_troubleshooting-j.html」から引用されたものである。
【００１５】
構造化ログ生成装置１０は、各機器２０等の機器から出力されるコマンド出力ログについて、利用者が当該コマンド出力ログの生成則を直接的に知らなくても、その利用者にとって扱いやすい形式へ変換する１以上のコンピュータである。例えば、構造化ログ生成装置１０は、各機器２０から出力されるコマンド出力ログを収集し、収集されたコマンド出力ログについて変換処理を行う。
【００１６】
図４は、第１の実施の形態における構造化ログ生成装置のハードウェア構成例を示す図である。図４の構造化ログ生成装置１０は、それぞれバスＢで相互に接続されているドライブ装置１００、補助記憶装置１０２、メモリ装置１０３、ＣＰＵ１０４、及びインタフェース装置１０５等を有する。
【００１７】
構造化ログ生成装置１０での処理を実現するプログラムは、ＣＤ−ＲＯＭ等の記録媒体１０１によって提供される。プログラムを記憶した記録媒体１０１がドライブ装置１００にセットされると、プログラムが記録媒体１０１からドライブ装置１００を介して補助記憶装置１０２にインストールされる。但し、プログラムのインストールは必ずしも記録媒体１０１より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置１０２は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
【００１８】
メモリ装置１０３は、プログラムの起動指示があった場合に、補助記憶装置１０２からプログラムを読み出して格納する。ＣＰＵ１０４は、メモリ装置１０３に格納されたプログラムに従って構造化ログ生成装置１０に係る機能を実行する。インタフェース装置１０５は、ネットワークに接続するためのインタフェースとして用いられる。
【００１９】
図５は、第１の実施の形態における構造化ログ生成装置の機能構成例を示す図である。図５において、構造化ログ生成装置１０は、ＵＩ部１１、テンプレート抽出部１２、及びパターン抽出部１３等を有する。これら各部は、構造化ログ生成装置１０にインストールされた１以上のプログラムが、ＣＰＵ１０４に実行させる処理により実現される。構造化ログ生成装置１０は、また、コマンド出力ログ記憶部１２１、テンプレート記憶部１２２、パターン情報記憶部１２３、及び構造化ログ記憶部１２４等を利用する。コマンド出力ログ記憶部１２１、テンプレート記憶部１２２、パターン情報記憶部１２３、及び構造化ログ記憶部１２４等は、例えば、図４の補助記憶装置１０２、又は構造化ログ生成装置１０にネットワークを介して接続可能な記憶装置等を用いて実現可能である。なお、図５において「利用者」を示すブロックは、利用者が利用するＰＣ（Personal Computer）、タブレッツ端末、又はスマートフォン等の端末であってもよい。
【００２０】
ＵＩ部１１は、利用者からの指示の受け付けや、当該指示に応じた処理結果について、利用者に対する出力等を行う。第１の実施の形態において、ＵＩ部１１は、利用者からの指示に応じ、各機器２０によって出力されるコマンド出力ログを収集し、収集されたコマンド出力ログを、コマンド出力ログ記憶部１２１に記憶する。例えば、利用者は、或るコマンド（ログの出力コマンド）を、監視対象の１つ又は複数の機器２０に対して実行する。ＵＩ部１１は、実行されたコマンドによって出力されるコマンド出力ログを逐次的に収集して、コマンド出力ログ記憶部１２１に記憶する。なお、ＵＩ部１１は、コマンドのリストの提示や、後述されるテンプレートの抽出に必要なパラメータの設定や、後述されるパターンの手動での入力の受け付け等を行ってもよい。
【００２１】
テンプレート抽出部１２は、各コマンド出力ログの各行の記述（メッセージ）からテンプレートを抽出する。
【００２２】
テンプレートとは、各記述（メッセージ）をその形式又は構文の共通性に基づいて分類するための雛形情報であり、メッセージの種別を示す情報であるともいえる。テンプレートは、例えば、同じ事象を示す複数のメッセージに関して、値が一定である単語、パラメータ、又はメッセージ等の項目（以下、「固定部分」という。）については具体的な記述を含み、値が一定ではない項目（以下、「変動部分」という。）については、変数化された（例えば、＊（アスタリスク）によって表現された）文字列である。テンプレートは、例えば、特許文献１に開示された技術を利用して、メッセージから自動的に抽出されてもよい。特許文献１の図３には、テンプレートの一例が示されている。なお、テンプレートの抽出方法は、ログの各行を分類できる方法であれば所定のものに限定されない。
【００２３】
テンプレート抽出部１２は、コマンド出力ログの各行を、当該行から抽出されたテンプレートに対応するＩＤ（以下、「テンプレートＩＤ」という。）に置換する。その結果、コマンド出力ログは、テンプレートＩＤの配列（以下、「テンプレート系列」という。）に変換される。同一のテンプレートが抽出される各行は、同一のテンプレートＩＤに置換される。また、テンプレート抽出部１２は、各行から抽出されたテンプレートを、当該テンプレートのテンプレートＩＤに対応付けてテンプレート記憶部１２２に記憶する。テンプレート抽出部１２は、処理対象のコマンド出力ログと同一コマンドによって出力されたコマンド出力ログから抽出されたテンプレートがテンプレート記憶部１２２に記憶されている場合には、当該テンプレートを利用して、処理対象のコマンド出力ログのテンプレート化を行う。したがって、テンプレートは、同一コマンドに係る複数のコマンド出力ログに対して有効である。
【００２４】
パターン抽出部１３は、テンプレート系列ごとに、当該テンプレート系列の複数の部分に出現する、２以上のＩＤを含むＩＤの配列（以下、「頻出パターン」という。）を抽出し、当該テンプレート系列において、頻出パターンに該当する部分を、頻出パターンごとのＩＤ（以下、「パターンＩＤ」という。）によって置換する。その結果、コマンド出力ログが構造化（ブロック化）される。パターン抽出部１３は、各頻出パターンをそれぞれのパターンＩＤに対応付けてパターン情報記憶部１２３に記憶する。パターン抽出部１３は、また、構造化されたコマンド出力ログ（以下、「構造化ログ」という。）を、構造化ログ記憶部１２４に記憶する。
【００２５】
以下、構造化ログ生成装置１０が実行する処理手順について説明する。図６は、構造化ログ生成装置が実行する処理手順の一例を説明するためのフローチャートである。
【００２６】
図６では、或る１つのコマンドに対する、複数の機器２０からの複数のコマンド出力ログ又は単一の機器２０からの１以上のコマンド出力ログが処理対象とされる。或る１つのコマンドに対する結果であるコマンド出力ログ群をＸｉ（ｉ＝１，２，…，Ｉ）と表現する。異なるＸｉは異なる機器２０から取得された同一コマンドに基づくコマンド出力ログであってもよいし、同一機器２０において別時刻に出力された同一コマンドに基づくコマンド出力ログであってもよく、その総回数がＩ（≧１）であるとする。
【００２７】
図６では、各コマンド出力ログＸｉの各行のメッセージについてテンプレート抽出が行われ、得られたテンプレートの列から頻出パターンを列挙することで、コマンド出力ログの構造化が行われる。なお、各コマンド出力ログＸｉ内のｎ行目のログをｘｉ，ｎ（ｎ＝１，２，…，Ｎｉ）とする。但し、ＮｉはＸｉ内の総行数である。同一コマンドから出力されたコマンド出力ログであっても、Ｎｉが同じであるとは限らない。
【００２８】
ステップＳ１０１において、テンプレート抽出部１２は、コマンド出力ログＸｉの各行ｘｉ，ｎから、テンプレートを抽出し、各行ｘｉ，ｎを当該行に関して抽出されたテンプレートに対応するテンプレートＩＤによって置換する。
【００２９】
テンプレート抽出部１２は、或る行に関して抽出されたテンプレートの当該テンプレートのテンプレートＩＤとの組を、テンプレート記憶部１２２に記憶し、当該行より後の行において、既にテンプレート記憶部１２２に記憶されているテンプレートに該当する行は、当該テンプレートのテンプレートＩＤに置換する。したがって、同様の構文を有する各行は、共通のテンプレートＩＤに置換される。
【００３０】
抽出されたテンプレートＩＤをｔｉ，ｎ∈｛１，２，…，Ｔ｝で表現する。但し、Ｔは総テンプレート数である。コマンド出力ログＸｉの各行ｘｉ，ｎが、テンプレートＩＤが置換されるとこで、テンプレートＩＤの配列ｔｉ＝（ｔ１，ｉ，ｔ２，ｉ，ｔ３，ｉ，…，ｔＮｉ，ｉ）が得られる。以下、コマンド出力ログＸｉから得られる当該配列をテンプレート系列ｔｉという。ステップＳ１０１では、各コマンド出力ログＸｉについて、テンプレート系列ｔｉが生成される。
【００３１】
続いて、テンプレート系列ｔｉごとに、ステップＳ１０２以降が実行される。ステップＳ１０２において、パターン抽出部１３は、テンプレート系列ｔｉの中から、頻出パターンを探索する。頻出パターンが発見された場合（ステップＳ１０３でＹｅｓ）、パターン抽出部１３は、テンプレート系列ｔｉ内において、当該頻出パターンに該当する部分を、当該頻出パターンに対応するパターンＩＤに置換することで、テンプレート系列ｔｉの構造化を行う（ステップＳ１０４）。
【００３２】
頻出パターンの発見と置換えには様々な方法が考えられるが、本実施の形態では、一例として、以下の２つの条件を満たすパターンが発見対象とされる。
（１）２回以上出現している、連続する２以上のＩＤ列（但し、同一のＩＤの連続であることは要されない。）を頻出パターンとみなし、テンプレート系列ｔｉを先頭から順に参照して発見された頻出パターンを、逐次、テンプレートＩＤとは別の１つのパターンＩＤで置き換えるという操作を行った時に、元のテンプレート系列ｔｉの総ＩＤ数と比較して総ＩＤ数が最も減少するもの。ここで、総ＩＤ数とは、テンプレート系列ｔｉの長さをいい、重複するＩＤであっても、それぞれ個別にカウントされることで得られる値である。
【００３３】
例えば、［１，２，３，４，１，２，３，４］を、５＝（１，２，３，４）というパターンで置き換え［５，５］とする。パターン６＝（１，２，３）でも置き換えが可能であるが、その場合の置換結果は［６，４，６，４］となるため、条件（１）より、総ＩＤ数が相対的に減少する前者のパターンが採用される。
【００３４】
（２）但し、置き換えを行う連続するＩＤ列の内部に繰り返し構造は存在しない（ＩＤ列の繰り返しを含まない）とする。
【００３５】
例えば、［１，２，３，４，１，２，３，４，１，２，３，４，１，２，３，４］列に対して、パターン７＝［１，２，３，４，１，２，３，４］とすると、［７，７］への置換えが可能であり、パターン５＝（１，２，３，４）で置換としたときの［５，５，５，５］と比較するとＩＤ数が削減できるが、（１，２，３，４）を一つのパターンと捉えたほうが、構造化された後のログの意味を見出す上で都合がよいため、（１，２，３，４）をパターンとして捉える。
【００３６】
なお、上記の（１）及び（２）の条件を満たす頻出パターンの発見法の詳細については後述される。以下、テンプレート系列ｔｉの一部又は全部が、パターンＩＤによって置き換えられることにより得られるテンプレートＩＤ又はパターンＩＤによって構成されるＩＤの配列を、「ＩＤ系列ｔｉ'」という。
【００３７】
ステップＳ１０２は、ＩＤ系列ｔｉ'において頻出パターンが発見されなくなるまで繰り返される。なお、一つのテンプレート系列ｔｉについて２回目以降に実行されるステップＳ１０２においては、パターンＩＤを含むＩＤ列も、頻出パターンの対象となる。すなわち、一つのテンプレート系列ｔｉからの頻出パターンの抽出は、再帰的に実行される。パターン抽出部１３は、頻出パターンが発見されるたびに、当該頻出パターンと、当該頻出パターンのパターンＩＤとの組を、パターン情報記憶部１２３に記憶する。
【００３８】
なお、或るテンプレート系列ｔｉに関して抽出された頻出パターンとパターンＩＤとの対応は、当該テンプレート系列ｔｉに関してのみ有効である。例えば、テンプレート系列ｔｉに関して抽出された頻出パターンと、テンプレート系列ｔｉ＋１に関して抽出された頻出パターンとが同じであっても、それぞれに対するパターンＩＤは、異なっていてもよい。
【００３９】
ＩＤ系列ｔｉ'において頻出パターンが発見されなくなると（Ｓ１０３でＮｏ）、パターン抽出部１３は、ＩＤ系列ｔｉ'において、連続するＩＤ列（同一ＩＤが連続する部分）を当該ＩＤと連続発生数（連続回数）とのタプル（組）で置き換える（ステップＳ１０５）。例えば、［１，２，２，２，３］は、［１，（２，３），３］に置き換えられる。但し、ステップＳ１０５は行われなくてもよい。
【００４０】
続いて、パターン抽出部１３は、ステップＳ１０５によって得られる構造化ログを、構造化ログ記憶部１２４に記憶し、当該構造化ログと、パターン情報記憶部１２３に記憶されている情報とを出力する（ステップＳ１０６）。
【００４１】
続いて、上記の条件（１）及び条件（２）を満たす頻出パターンの発見法について説明する。
【００４２】
連続する文字列の頻出パターン発見法については、ｓｕｆｆｉｘ  ａｒｒａｙ（接尾辞配列）を用いた効率的な手法が知られているが（非特許文献３）、これら手法では、通常、パターンの発生回数の計算時に、同一位置の文字（同一位置のＩＤ）の重複カウントを許して頻出パターンを発見する。例えば、［２，３，２，３，２］という列において、［２，３，２］というパターンは、位置１から開始するものと位置３から開始するものがある。したがって、この場合、同一位置のＩＤの重複カウントを許せば、当該パターンは２回発生しているといえる。ＩＤ列をパターンＩＤに置き換える場合には、同一位置のＩＤについて重複カウントを行うのは適切ではない。したがって、このようなパターン（同一位置のＩＤの重複カウントが許容されたパターン）が抽出されてしまうと、［２，３，２，３，２］という列は、先頭の［２，３，２］の部分しかパターンＩＤに置換することができない。そこで、本実施の形態では、同一位置のＩＤについての重複カウントを回避するため、ｓｕｆｆｉｘ  ａｒｒａｙを用いたパターンの発見方法に変更を加えた新たな手法を説明する。
【００４３】
以下では簡単のため、対象とするテンプレート系列ｔｉ又はＩＤ系列ｔｉ'を、ＩＤ系列ｔ＝［ｔ１，…，ｔｎ］といい、添字ｉを省略して表記する。
【００４４】
図７は、頻出パターンの抽出法の一例を説明するためのフローチャートである。なお、任意のｊに対して、ＩＤ系列ｔの部分系列［ｔｊ，…，ｔｎ］を、出現位置ｊにおけるｔの接尾辞という。
【００４５】
ステップＳ２０１において、パターン抽出部１３は、ＩＤ系列ｔのｓｕｆｆｉｘ  ａｒｒａｙ（接尾辞配列）を構築する。
【００４６】
ｓｕｆｆｉｘ  ａｒｒａｙ（接尾辞配列）とは、ＩＤ系列ｔの各接尾辞へのポインタを格納した配列であり、各ポインタは、それが示す接尾辞の辞書式順序（例えば、アルファベット順等）でソートされる。ｓｕｆｆｉｘ  ａｒｒａｙの生成には、Ｏ（ｎｌｏｇｎ）のアルゴリズムが一般的に用いられることが知られている（非特許文献３）。文字列ｂａｎａｎａｎａ＄（＄は終端文字）のｓｕｆｆｉｘ  ａｒｒａｙの例を図８に示す。図８において、「ｓｕｆｆｉｘ  ａｒｒａｙ」の列は、ｓｕｆｆｉｘ  ａｒｒａｙの要素の値（すなわち、接尾辞へのポインタ）である。また、「接尾辞」の列は、「ｓｕｆｆｉｘ  ａｒｒａｙ」の列によって示されるポインタを先頭とする接尾辞を示す。図８では、接尾辞が、辞書式順序でソートされた結果が示されている。したがって、「ｓｕｆｆｉｘ  ａｒｒａｙ」の列の値を上から順に並べることで得られる配列が、ｂａｎａｎａｎａ＄のｓｕｆｆｉｘ  ａｒｒａｙに相当する。なお、「ＨＧＴ'」の列については後述される。
【００４７】
以下では、ｓｕｆｆｉｘ  ａｒｒａｙを、Ｐｏｓ［１．．ｎ］で表現する。すなわち、任意の１≦ｊ≦ｎに対し、Ｐｏｓ［ｊ］は、辞書式順序でのｊ番目の接尾辞の、ＩＤ系列ｔにおける開始位置となる。
【００４８】
続いて、パターン抽出部１３は、構築されたｓｕｆｆｉｘ  ａｒｒａｙに対して、改変した高さ配列ＨＧＴ'を構築する（ステップＳ２０２）。
【００４９】
改変した高さ配列ＨＧＴ'とは、ｓｕｆｆｉｘ  ａｒｒａｙ上で隣接する接尾辞同士における、先頭から単語位置の重複なしに一致する文字数又はＩＤ数をカウントしたものであり、非特許文献３で述べられる高さ配列に対し、位置に関する重複なしの条件を加えたものである。
【００５０】
更に厳密に定義すると、改変した高さ配列ＨＧＴ'とは、隣接する接尾辞ｔＰｏｓ［ｊ］とｔｐｏｓ［ｊ＋１］が、それぞれｕ＝Ｐｏｓ［ｊ］、ｖ＝Ｐｏｓ［ｊ＋１］、すなわちｔＰｏｓ［ｊ］＝｛ｔｕ，ｔｕ＋１，…，ｔｕ＋ｈ−１，…ｔｎ｝、ｔｐｏｓ［ｊ＋１］＝｛ｔｖ＋１，…，ｔｖ＋ｈ−１，…ｔｎ｝のとき、
ＨＧＴ'［ｊ］＝ｍａｘ｛ｈ；ｔｕ＝ｔｖ，ｔｕ＋１＝ｔｖ＋１，ｔｕ＋ｈ−１＝ｔｖ＋ｈ−１，｛ｕ，…，ｕ＋ｈ−１｝∩｛ｖ，…，ｖ＋ｈ−１｝＝φ｝
と定義される（φは空集合を表す）。また、ＨＧＴ'［ｎ］＝−１と定義する。ここで、ｍａｘ｛ｈ；・・・｝は、「；」以降の条件を満たすｈの中で最大のｈを出力する関数である。「；」以降の条件のうち、「｛ｕ，…，ｕ＋ｈ−１｝∩｛ｖ，…，ｖ＋ｈ−１｝＝φ」によって、同一位置に関する重複カウントが回避されている。例えば、図８において、ｊ＝３である場合、ｕ＝６、ｖ＝４である。すなわち、ｔＰｏｓ［ｊ］＝｛ａｎａ＄｝であり、ｔｐｏｓ［ｊ＋１］＝｛ａｎａｎａ＄｝である。これら２つの文字列について、先頭から一致する文字数は、３である。但し、ｈが３である場合について、「｛ｕ，…，ｕ＋ｈ−１｝∩｛ｖ，…，ｖ＋ｈ−１｝＝φ」を評価すると、｛６，７，８｝∩｛４，５，６｝＝６であり、空集合にならない。一方、ｈが２であれば、｛６，７｝∩｛４，５｝＝φである。したがって、この場合の改変した高さ配列ＨＧＴ'は、図８に示される通り、２となる。
【００５１】
より簡易に表現すれば、相互に隣接する或る接尾辞同士についての改変した高さ配列ＨＧＴ'の値は、相互に隣接する他の接尾辞同士においてカウントされる一致部分はカウントされないということである。例えば、図８において、３番目の接尾辞「ａｎａ＄」と４番目の接尾辞「ａｎａｎａ＄」とについて、３番目の「ａ」は、２番目の接尾辞「ａ＄」と３番目の接尾辞「ａｎａ＄」との改変した高さ配列ＨＧＴ'においてカウントされる。したがって、当該３番目の「ａ」は、３番目の接尾辞「ａｎａ＄」と４番目の接尾辞「ａｎａｎａ＄」に関する改変した高さ配列ＨＧＴ'においてはカウントされないのである。
【００５２】
なお、図９は、改変した高さ配列ＨＧＴ'の生成手順の一例を示す図である。図９では、まず、Ｐｏｓ［１．．ｎ］に対する逆関数（逆接尾辞）である配列Ｓｕｆ［１．．ｎ］が、Ｓｕｆ［Ｐｏｓ［ｊ］］＝ｊとなるよう計算される。すなわち、Ｓｕｆ［ｊ］は、Ｐｏｓ［ｊ］の順番である。
【００５３】
続いて、ｊを１〜ｎに変えながら、ステップａ〜ステップｅが実行される。ステップＤｂにおいて、ｖに代入される値は、ｓｕｆｆｉｘ  ａｒｒｅｙにおいて、ｊに隣接するポインタである。すなわち、ステップｃ以降において呼び出されるＬＣＰ'（ｊ，ｖ，ｈ）によって、隣接する接尾辞同士の改変した高さ配列ＨＧＴ'が算出される。
【００５４】
ここで、ＬＣＰ（ｓ、ｔ）を、文字列ｓ、ｔにおいて共通する最長の接頭辞長を表すとする。非引用文献３で紹介されているように、通常の高さ配列の構築は、
ＬＣＰ（ｔＰｏｓ［ｊ］，ｔＰｏｓ［ｊ＋１］）−１≦ＬＣＰ（ｔＰｏｓ［ｊ］＋１，ｔＰｏｓ［ｊ＋１］＋１）
という性質に着目し、隣接する接尾辞間で比較を行えば、全体Ｏ（Ｎ）で構築可能であることが知られている。これと同様に、ＬＣＰ'（ｊ，ｖ，ｈ）では、隣接する接尾辞間で、同時に｛ｉ，…，ｉ＋ｈ−１｝∩｛ｊ，…，ｊ＋ｈ−１｝＝φという条件が満たされるようにすることで、文字の位置に関して重複がないように比較を行っている。すなわち、ＬＣＰ'（ｔｉ，ｔｊ，ｈ）は、接尾辞ｔｉとｔｊとで同一位置の文字の重複カウントを許さない共通接頭辞の長さ（すなわち、改変した高さ配列ＨＧＴ'）である。
【００５５】
続いて、パターン抽出部１３は、ｓｕｆｆｉｘ  ａｒｒａｙとＨＧＴ'とに基づいて、ｍ回以上発生している、最もＩＤ削減率の高い頻出パターンを、ＩＤ系列ｔから探す（ステップＳ２０３）。なお、ｍの値は、例えば、予め設定される。
【００５６】
非特許文献２で述べられているとおり、ｓｕｆｆｉｘ  ａｒｒａｙと高さ配列とを使ってｓｕｆｆｉｘ  ｔｒｅｅを模擬することができ、ｓｕｆｆｉｘｔ  ｔｒｅｅを巡回することで、最長の頻出パターンを探すことが可能である。しかし、前述の通り、通常のｓｕｆｆｉｘｔ  ｔｒｅｅの巡回では、パターンの発生回数を、位置の重複を許してカウントしてしまうという問題がある。また、改変した高さ配列ＨＧＴ'は、隣接する接尾辞間で位置の重複カウントがないことを保証するが、例えば、ｓｕｆｆｉｘ  ａｒｒａｙ上で２つ先の接尾辞と位置の重複がないことは保証されていない。これは、パターン列挙の条件が全順序関係を持たないことに起因する。
【００５７】
そこで、本実施の形態では、ｓｕｆｆｉｘ  ａｒｒａｙと改変した高さ配列ＨＧＴ'とを用いつつｓｕｆｆｉｘｔ  ｔｒｅｅを巡回する際、パターンの出現する開始位置のリストを各葉及び節で保持しておくことにより、上記の条件（１）及び条件（２）を満たすようにする。
【００５８】
図１０は、最もＩＤ削減率の高い頻出パターンの探索手順の一例を示す図である。図１０において、スタックＳは、葉の個数、高さ、及び出現位置のリストの３つの要素を一組とするデータのスタックである。ｓｉｚｅは、対象とするＩＤ系列ｔの総ＩＤ数である。Ｃｋは、節の下の葉の個数を格納する変数である。Ｃｐｏｓは、当該節の下の葉、すなわちＩＤ系列ｔの部分ＩＤ列のＩＤ系列ｔにおける出現位置（開始位置）の集合を格納する変数である。ｒＣｋは、節の出現位置の重複が解消された場合の節の下の葉の個数を格納する変数である。ｒＣｐｏｓは、当該節の下の葉、すなわちＩＤ系列ｔの部分ＩＤ列のＩＤ系列ｔにおける出現位置（開始位置）のうち、節の出現位置に重複がないものの集合を格納する変数である。また、ｔｏｐ（Ｓ）は、スタックＳの最上位のデータを示す。Ｐｏｓ（Ｓ）は、スタックＳの最上位のデータを取り出して削除することを示す。Ｐｕｓｈ（ａ，ｂ，ｃ，Ｓ）は、ａ、ｂ、及びｃの３つの要素を一組とするデータを、スタックＳの最上位に格納することを示す。
【００５９】
以下に手順を簡単に説明する。各接尾辞をｓｕｆｆｉｘｔ  ｔｒｅｅにおける葉と見立て、各接尾辞間の共通接頭辞を節と見立て、これを順に巡回しつつ、最もＩＤ削減率の高い節を探す。この際、改変した高さ配列ＨＧＴ'を用いることで所望のパターンを探す。例えば、ｋ−１番目の葉、すなわち、接尾辞を考えると、ＨＧＴ'［ｋ］の値Ｈが０よりも大きければ、節（以下、当該節を「節Ａ」という。）が存在することが分かる。スタック（Ｓ）を用いることで、葉の巡回の帰りがけに節Ｈｋのチェックを行う。
【００６０】
まず、Ｈが０の場合は節が存在しないため、何もしない。
【００６１】
ＨＧＴ'［ｋ］の値ＨｋがＨよりも大きい場合、その節は、節Ａの子となるため、スタックに節（Ｃｋ，Ｈ，Ｃｐｏｓ）を積む（ステップｇ）。
【００６２】
ＨＧＴ'［ｋ］の値ＨｋがＨよりも短い場合、その節はスタックに格納されている節の祖先となる。すなわちｒｏｏｔ方向へ戻ってきたことになるので、スタックを順に調べ、スタックに格納されている節のうち、Ｈｋよりも長い節が見つかるまでスタックをｐｏｐする（ステップｅ）。
【００６３】
このとき、スタックを減らし、節をｒｏｏｔ方向へ遡る過程において、ＰｏｓＣｈｅｃｋ（Ｃｐｏｓ，ＰＯＳ、Ｈ）を実行することで、節の出現位置に重複がないように調べつつ節の情報（ｒＣｋ，ｒＣｐｏｓ）を更新する。ＰｏｓＣｈｅｃｋ関数は、Ｃｐｏｓ、Ｐｏｓ内に格納された開始位置から始まるＨの長さを持つパターンが、出現位置に関して重複がないかを調べ、もし重複があればこれを除去する関数である（ステップｅ−ｉｉ）。
【００６４】
また、葉、すなわち、部分ＩＤ列の開始位置の集合ｒＣｐｏｓの調査と同時に条件ｒＣｋ≧ｍａｎｄｍｉｎ＿ＩＤｓ＞（ｓｉｚｅ−ｌｅｎｇｔｈ（ｒＣｐｏｓ）×Ｈ）をチェックし、ｍ回以上出現しており、かつ、最もＩＤ削減率の高い節、パターンであるかを調べていく（ステップｅ−ｉｉｉ）。
【００６５】
ＨＧＴ'［ｋ］の値ＨｋがＨと一致する場合、節Ａに戻ったことになるので、スタックの最上位に格納されている値、すわなち、節Ａの葉に関する情報を更新する（ステップｆ）。
【００６６】
以上により、ｍ回以上出現する、最もＩＤ削減率の高いパターンの出現位置および出現回数を得ることができる（ステップＳ２０４）。
【００６７】
上述したように、第１の実施の形態によれば、複数行を含むコマンド出力ログは、テンプレート系列に変換された後、構造化（ブロック化）される。その結果、機器２０が出力する複数行から成るコマンド出力ログを、利用者が機器のログの生成則を直接的に知ることなく、その利用者にとって扱いやすい形式へ変換することができる。
【００６８】
例えば、利用者は、機器２０が正常に動作している状態において、或るコマンド（以下、「コマンドＡ」という）を実行することで得られるコマンド出力ログについて、構造化ログを予め獲得しておく。機器２０に異常が発生した場合、利用者は、コマンドＡを実行することで得られるコマンド出力ログについて構造化ログを獲得し、当該構造化ログと正常時の構造化ログとを比較することで、頻出パターン単位で、相違点を把握することができ、異常箇所の絞り込みの効率化を期待することができる。
【００６９】
また、利用者は、或る状態における機器２０に対してコマンドＢを実行することで獲得された構造化ログを監視対象のフィルタとして設定しておき、機器２０に対してコマンドＢが実行されるたびに、コマンド出力ログが構造化されるようにすることで、機器２０における当該或る状態の発生を容易に検知することもできる。
【００７０】
なお、採用されるパターンの性質を決定する条件（１）及び条件（２）のうち、条件（１）における「元のテンプレート系列ｔｉの総ＩＤ数と比較して総ＩＤ数が最も減少する」という条件は、以下のような条件に置き換えられても良い。
・最も出現頻度が高い。
・ｉ回以上発生しているパターンのうち最もＩＤ長の長い。
このように条件が変更される場合、図１０に示したパターンの抽出手順が、所望の条件に即した内容に適宜変更されればよい。
【００７１】
次に，第２の実施の形態について説明する。第２の実施の形態では第１の実施の形態と異なる点について説明する。第２の実施の形態において特に言及されない点については，第１の実施の形態と同様でもよい。
【００７２】
図１１は、第２の実施の形態における構造化ログ生成装置の機能構成例を示す図である。図１１中、図５と同一又は対応する部分には同一符号を付し、その説明は適宜省略する。
【００７３】
図１１において、構造化ログ生成装置１０は、更に、ログ収集部１４を有する。ログ収集部１４は、構造化ログ生成装置１０にインストールされた１以上のプログラムが、ＣＰＵ１０４に実行させる処理により実現される。
【００７４】
ログ収集部１４は、例えば、自動的に（予め設定された時期に）、予め設定された１以上のコマンドを、予め設定された機器２０に対して実行して、当該機器２０からコマンド出力ログを収集する。ログ収集部１４は、収集されたコマンド出力ログをコマンド出力ログ記憶部１２１に記憶する。
【００７５】
テンプレート抽出部１２及びパターン抽出部１３は、自動的に（例えば、定期的に）処理を実行する。その結果、構造化ログが自動的に生成される。但し、テンプレート抽出部１２及びパターン抽出部１３は、利用者による指示に応じて処理を実行してもよい。利用者は、定期的、又は任意のタイミングで、構造化ログ等を利用することができる。
【００７６】
次に，第３の実施の形態について説明する。第３の実施の形態では第２の実施の形態と異なる点について説明する。第３の実施の形態において特に言及されない点については，第２の実施の形態と同様でもよい。
【００７７】
図１２は、第３の実施の形態における構造化ログ生成装置の機能構成例を示す図である。図１２中、図１１と同一又は対応する部分には同一符号を付し、その説明は適宜省略する。
【００７８】
図１２において、構造化ログ生成装置１０は、更に、可視化部１５を有する。可視化部１５は、構造化ログ生成装置１０にインストールされた１以上のプログラムが、ＣＰＵ１０４に実行させる処理により実現される。
【００７９】
可視化部１５は、ＵＩ部１１を経由して入力される利用者からの指示に応じ、例えば、構造化ログを、利用者が見易いように加工して出力する。例えば、以下のような加工が行われてもよい。
・特定のパターンをハイライト表示する。
・コマンド出力ログを表示する際に、各頻出パターンに対応する部分をパターンの階層に従って階層的に（例えば、ツリー形式で）表示することにより、効果的な可視化を行う。
・或るパターンに注目したパラメータ群の変化量のグラフ化や、パターンの出現数の可視化を行う。ここでのパラメータ群とは、頻出パターンに含まれる各テンプレートにおける変動部分に該当する部分の値である。
・２つの異なる時点のブロックＩＤ列間の差分抽出を行う。例えば、過去に取得したブロックＩＤ列と現時点で取得したブロックＩＤ列に対して、曖昧性を考慮した比較を行う系列アライメントと呼ばれる手法を用いることで、ブロック構造としてどの部分が変化したかを抽出することができる。
【００８０】
なお、上記各実施の形態において、テンプレート抽出部１２は、生成部の一例である。パターン抽出部１３は、抽出部の一例である。テンプレートＩＤは、構文が共通する記述ごとの識別子の一例である。テンプレート系列は、第１の配列の一例である。頻出パターンは、第２の配列の一例である。パターンＩＤは、第２の配列ごとの識別子の一例である。
【００８１】
以上，本発明の実施例について詳述したが，本発明は斯かる特定の実施形態に限定されるものではなく，特許請求の範囲に記載された本発明の要旨の範囲内において，種々の変形・変更が可能である。
【符号の説明】
【００８２】
１０          構造化ログ生成装置
１１          ＵＩ部
１２          テンプレート抽出部
１３          パターン抽出部
１４          ログ収集部
１５          可視化部
２０          機器
１００        ドライブ装置
１０１        記録媒体
１０２        補助記憶装置
１０３        メモリ装置
１０４        ＣＰＵ
１０５        インタフェース装置
１２１        コマンド出力ログ記憶部
１２２        テンプレート記憶部
１２３        パターン情報記憶部
１２４        構造化ログ記憶部
Ｂ            バス
【図１】
0006353816.tif 000002
【図２】
0006353816.tif 000003
【図３】
0006353816.tif 000004
【図４】
0006353816.tif 000005
【図５】
0006353816.tif 000006
【図６】
0006353816.tif 000007
【図７】
0006353816.tif 000008
【図８】
0006353816.tif 000009
【図９】
0006353816.tif 000010
【図１０】
0006353816.tif 000011
【図１１】
0006353816.tif 000012
【図１２】
0006353816.tif 000013