(57)【要約】【課題】バンドル毎にまたバンドル内のクラス毎に出力ログレベルを設定可能にする。【解決手段】出力ログレベル比較要求受付機能１は、調べたいログレベル情報（比較対象の出力ログレベル）と、そのロガーが保持するロガー名をログレベル判定機能７に渡す。ログレベル判定機能７は、出力ログレベル管理機能５が保持する「各ロガーの出力ログレベルについての設定情報」に記載された、「該当ロガーが保持するバンドル情報とロガー名」に該当する出力ログレベルを入手する。ログレベル判定機能７は、入手した出力ログレベルと、調べたいログレベルを比較し、その比較結果を出力ログレベル比較要求受付機能１に返す。出力ログレベル比較要求受付機能１は、ログレベル判定機能７から返された結果をクライアントバンドルに返す。【選択図】図２
2011039774.tif 000002
【特許請求の範囲】
【請求項１】
バンドルの実行時にログを出力するロギング手段と、
バンドルの識別情報であるバンドル情報と当該バンドルに提供されたロガー名とに対応づけて、当該バンドルの実行時に出力されるログのレベルを示す出力ログレベルが記憶される出力ログレベル記憶手段と、
バンドルから出力ログレベルの比較要求を受け付け、当該バンドルに提供されたロガー名と、比較対象の出力ログレベルと、を取得する出力ログレベル比較要求受付手段と、
バンドルからログの出力要求を受け付け、当該バンドルに提供されたロガー名と、比較対象の出力ログレベルと、を取得するログ要求受付手段と、
前記出力ログレベルの比較要求と前記ログの出力要求との際に取得された前記ロガー名と、当該出力ログレベルの比較要求と前記ログの出力要求とを送信したバンドルを示すバンドル情報と、に対応づけられた出力ログレベルを前記出力ログレベル記憶手段から取得し、当該取得した出力ログレベルと前記比較対象の出力ログレベルとを比較するログレベル判定手段とを備え、
前記出力ログレベル比較要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、ログ出力可能であることをバンドルに応答し、
前記ログ要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギング手段を制御してログを出力させる
ことを特徴とするロガーライブラリ実装装置。
【請求項２】
バンドルの実行時にログを出力するロギング手段と、
バンドルの識別情報であるバンドル情報に対応づけて、当該バンドルの実行時に出力されるログのレベルを示す出力ログレベルが記憶される出力ログレベル記憶手段と、
バンドルから出力ログレベルの比較要求を受け付け、比較対象の出力ログレベルを取得する出力ログレベル比較要求受付手段と、
バンドルからログの出力要求を受け付け、比較対象の出力ログレベルを取得するログ要求受付手段と、
前記出力ログレベルの比較要求と前記ログの出力要求とを送信したバンドルを示すバンドル情報に対応づけられた出力ログレベルを前記出力ログレベル記憶手段から取得し、当該取得した出力ログレベルと前記比較対象の出力ログレベルとを比較するログレベル判定手段とを備え、
前記出力ログレベル比較要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、ログ出力可能であることをバンドルに応答し、
前記ログ要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギング手段を制御してログを出力させる
ことを特徴とするロガーライブラリ実装装置。
【請求項３】
前記ロガーライブラリ実装装置の外部から出力ログレベルの変更要求を受け付け、当該出力ログレベルの変更要求に基づいて、前記出力ログレベル記憶手段における出力ログレベルを変更する出力ログレベル変更要求受付手段
を備えることを特徴とする請求項１または２記載のロガーライブラリ実装装置。
【請求項４】
前記ロギング手段に代えて、前記ロガーライブラリ実装装置の外部に存在するロギングサービス実行装置にログを送信するロギングサービス書込手段を備え、
前記ログ要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギングサービス書込手段を制御して前記ロギングサービス実行装置にログを送信させる
ことを特徴とする請求項１ないし３のいずれかに記載のロガーライブラリ実装装置。
【請求項５】
バンドルの実行時にログを出力するロギング手段と、バンドルの識別情報であるバンドル情報と当該バンドルに提供されたロガー名とに対応づけて、当該バンドルの実行時に出力されるログのレベルを示す出力ログレベルが記憶される出力ログレベル記憶手段とを備えるロガーライブラリ実装装置における制御方法であって、
前記ロガーライブラリ実装装置の出力ログレベル比較要求受付手段が、バンドルから出力ログレベルの比較要求を受け付け、当該バンドルに提供されたロガー名と、比較対象の出力ログレベルと、を取得し、
前記ロガーライブラリ実装装置のログ要求受付手段が、バンドルからログの出力要求を受け付け、当該バンドルに提供されたロガー名と、比較対象の出力ログレベルと、を取得し、
前記ロガーライブラリ実装装置のログレベル判定手段が、前記出力ログレベルの比較要求と前記ログの出力要求との際に取得された前記ロガー名と、当該出力ログレベルの比較要求と前記ログの出力要求とを送信したバンドルを示すバンドル情報と、に対応づけられた出力ログレベルを前記出力ログレベル記憶手段から取得し、当該取得した出力ログレベルと前記比較対象の出力ログレベルとを比較し、
前記出力ログレベル比較要求受付手段が、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、ログ出力可能であることをバンドルに応答し、
前記ログ要求受付手段が、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギング手段を制御してログを出力させる
ことを特徴とするロガーライブラリ実装装置の制御方法。
【請求項６】
バンドルの実行時にログを出力するロギング手段と、バンドルの識別情報であるバンドル情報に対応づけて、当該バンドルの実行時に出力されるログのレベルを示す出力ログレベルが記憶される出力ログレベル記憶手段とを備えるロガーライブラリ実装装置における制御方法であって、
前記ロガーライブラリ実装装置の出力ログレベル比較要求受付手段が、バンドルから出力ログレベルの比較要求を受け付け、比較対象の出力ログレベルを取得し、
前記ロガーライブラリ実装装置のログ要求受付手段が、バンドルからログの出力要求を受け付け、比較対象の出力ログレベルを取得し、
前記ロガーライブラリ実装装置のログレベル判定手段が、前記出力ログレベルの比較要求と前記ログの出力要求とを送信したバンドルを示すバンドル情報に対応づけられた出力ログレベルを前記出力ログレベル記憶手段から取得し、当該取得した出力ログレベルと前記比較対象の出力ログレベルとを比較し、
前記出力ログレベル比較要求受付手段が、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、ログ出力可能であることをバンドルに応答し、
前記ログ要求受付手段が、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギング手段を制御してログを出力させる
ことを特徴とするロガーライブラリ実装装置の制御方法。
【請求項７】
前記ロギング手段に代えて、前記ロガーライブラリ実装装置の外部に存在するロギングサービス実行装置にログを送信するロギングサービス書込手段が設けられ、
前記ログ要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギングサービス書込手段を制御して前記ロギングサービス実行装置にログを送信させる
ことを特徴とする請求項５または６記載のロガーライブラリ実装装置の制御方法。
【請求項８】
請求項１ないし４のいずれかに記載のロガーライブラリ実装装置としてコンピュータを機能させるためのコンピュータプログラム。
【請求項９】
請求項８記載のコンピュータプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ロガーライブラリ実装装置に関し、例えば、ＯＳＧｉフレームワーク上のバンドルがロギングを行うための技術に関する。
【背景技術】
【０００２】
［一般のＪａｖａロギングライブラリ］
一般的にプログラムを開発する際には，そのプログラムの中にロギングを行わせる。Ｊａｖａの世界でも，既に世の中のＪａｖａ開発者に広く用いられているロギングのためのＡＰＩを定義したロギング用ライブラリが存在する。例えば，非特許文献１があげられる。以下、Ａｐａｃｈｅ  Ｃｏｍｍｏｎｓ  Ｌｏｇｇｉｎｇを「ＡＣＬ」という。
【０００３】
基本的なこれらの利用法の基礎は同様であり、本明細書では以後ACLを例として説明するが，本発明はACL以外のロギングシステムでも同様に適用が可能である．ログを残したいＪａｖａプログラムは以下の処理を行う（図１０参照）。
【０００４】
１．  ロガー取得メソッドにクラスオブジェクトやクラス名を引数に指定してロガーオブジェクトを入手する。
２．  ロガーオブジェクトのロギングメソッドを呼ぶ。
【０００５】
２のロギングメソッドの引数には、ログしたい内容が指定される。またメソッドによってログレベルが異なるのが一般的である。例えば，ＴＲＡＣＥ／ＤＥＢＵＧ／ＩＮＦＯ／ＷＡＲＮ／ＥＲＲＯＲ／ＦＡＴＡＬなどのログレベルが定義され、それぞれのレベルのログを残すにはログレベルが識別できるメソッドを呼び出すことによりログを残す。これには、大きく二つのパターンがあり、メソッド名自体によりログレベルが識別できるパターン（ｔｒａｃｅ（Ｏｂｊｅｃｔ）／ｄｅｂｕｇ（Ｏｂｊｅｃｔ）／ｉｎｆｏ（Ｏｂｊｅｃｔ）／ｗａｒｎ（Ｏｂｊｅｃｔ）／ｅｒｒｏｒ（Ｏｂｊｅｃｔ）／ｆａｔａｌ（Ｏｂｊｅｃｔ）など）と、メソッド名は共通だが、レベルに該当する引数を指定するパターン（ｌｏｇ（レベルを表す識別子，  Ｏｂｊｅｃｔ）など）とメソッド名が異なるロギングメソッドを呼ぶことでログを残すものがある。ログレベルには優先度があり、上記だと左ほど低い優先度となる。
【０００６】
１では、ログを残したいコードが属するクラスの完全修飾名（パッケージ名も含めたクラス名のこと．例えば”Ｓｔｒｉｎｇ”ではなく、”ｊａｖａ．ｌａｎｇ．Ｓｔｒｉｎｇ”．）をＳｔｒｉｎｇオブジェクトとして指定するか、ログを残したいコードが属するクラスのＣｌａｓｓオブジェクトを指定するのが一般的である（図１０の９行目参照）。Ｓｔｒｉｎｇオブジェクトを指定した場合にはその文字列が、Ｃｌａｓｓオブジェクトを指定した場合には、その完全修飾名の文字列が，そのロガーの名前となる。
【０００７】
ロギングライブラリは、ロガーオブジェクトに対して出力ログレベルを保持する。そして、あるロガーオブジェクトのロギングメソッドが呼ばれた場合、ロギングメソッドで指定されたログレベルと、その時点での該ロガーオブジェクトに割り当てられた出力ログレベルとを比較し、前者の優先度が後者の優先度以上であった場合には、ログ出力を行う。そうでない場合にはログ出力を行わない。上記のロガーオブジェクトに割り当てられた出力ログレベルを取得するためには、ロギングライブラリがメモリ上に保持した出力ログレベル管理表に基づき、そのロガー名をキーとしてそれに対する出力ログレベルが判断される。
【０００８】
また、ロガーオブジェクトには、設定されている出力ログレベルと指定のログレベルの高低を比較するメソッドが用意されている（例：ｉｓＤｅｂｕｇＥｎａｂｌｅｄ（））。ロギングメソッドを呼ぶ前に、このメソッドを呼ぶことにより、処理を高速化することが可能となる。
【０００９】
例えば，図１０のソースでは、１４行目がＤＥＢＵＧレベルでロギングをしたいコードであるが、このｌｏｇｇｅｒの実行時の出力ログレベルとＤＥＢＵＧレベルとの高低比較は、ｌｏｇｇｅｒ．ｄｅｂｕｇ（）メソッドの実装内で処理される。つまり、ｌｏｇｇｅｒの出力ログレベルがＤＥＢＵＧより高い場合、つまりログを残さなくて良い場合でも、ｄｅｂｕｇ（）メソッドの引数の文字列を連結して作り出す処理は、必ず実行しなければならないことになる。しかし、１３行目があることにより、あらかじめｌｏｇｇｅｒの出力ログレベルがＤＥＢＵＧレベル以下の場合のみ、１４行目が呼び出されるため、不必要なＯｂｊｅｃｔをＳｔｒｉｎｇに変換する処理や、Ｓｔｒｉｎｇの連結処理を行わずに済む。同様に、１８〜１９行目の処理も、１７行目があることによりｌｏｇｇｅｒの実行時出力ログレベルがＩＮＦＯ以下の場合のみ、呼び出されるため、不要なループ処理を行わずに済む。
【００１０】
これにより、ソースコードを修正することなく、運用によりログ処理を減らすことが可能となる。一般的に、開発時には詳細なログ情報が必要となるので、出力ログレベルを低く設定して運用するが、実際のサービスでの利用時には、ロギング処理による負荷を減らすなどのために、出力ログレベルを高く設定して運用する。
【００１１】
［ＯＳＧｉのバンドルがロギングライブラリを用いる場合］
［既存例１］
ＯＳＧｉフレームワーク上で動作するソフトウェアコンポーネントの単位をバンドルと呼ぶ。バンドルはＪａｖａで書かれたプログラムである。ＯＳＧｉフレームワーク上のバンドルが、ロギングライブラリを利用する場合、図１１のように実現するのが通常である。
【００１２】
バンドルＢ４が、ロギングライブラリのパッケージ（例：ｏｒｇ．ａｐａｃｈｅ．ｃｏｍｍｏｎｓ．ｌｏｇｇｉｎｇ）をＥｘｐｏｒｔする。ロギングしたいクライアントバンドルＢ１が、それをＩｍｐｏｒｔする。
【００１３】
ロガーライブラリを実装するＢ４（既存例１に係るロガーライブラリ実装装置）は、図１２に示すような機能構成を有する。図１３は、このロガーライブラリ実装装置の動作を示すフローチャートである。
【００１４】
タイミング０：事前に、設定情報読込機能４により、ロギング処理方法について（例：どこに（標準出力に，または所定のファイルに）出力するのか、どのようなフォーマットで出力するのか？）、また各ロガーの出力ログレベルについての設定情報を読み込む。一般的には、これらの情報は所定の場所に配置した設定ファイルに決められたフォーマットで記載しておく。読み込まれたロギング処理に関する設定情報はロギング機能６に渡される。読み込まれた各ロガーの出力ログレベルについての設定情報は出力ログレベル管理機能５に渡される。但し、この際の出力ログレベルの設定は、ロガー名単位でありバンドル単位ではない。なお、本書におけるロガー名単位でのログレベルの管理とは、ロガー名自体だけを指定することを意味しない。一般的に、ロガー名はピリオド”．“で区切られた階層構造を持つ。そこで、ロガー名自体だけではなく、それらの階層構造名にもログレベルを割り当てることが可能とする。例えば、ｃｏｍ．ａｃｍｅという階層構造に対してログレベルＤＥＢＵＧを割り当て、ｃｏｍ．ａｃｍｅ．ａ１に対してログレベルＩＮＦＯを割り当てた場合、ｃｏｍ．ａｃｍｅ．ａ１やｃｏｍ．ａｃｍｅ．ａ１．ｂ１という名前のロガーにはＩＮＦＯが割り当てられるがｃｏｍ．ａｃｍｅ．ａ２やｃｏｍ．ａｃｍｅ．ａ３．ｂ３にはＤＥＢＵＧが割り当てられる。
【００１５】
タイミング１：Ｂ１がＩｍｐｏｒｔしたパッケージ内のクラスが持つメソッドを使って、ロガーを取得する。ロガー取得時には、ＣｌａｓｓオブジェクトまたはＳｔｒｉｎｇオブジェクトによりロガーの名前を指定する。図１２では、ロガー取得要求受付機能３が要求を受け付ける。
【００１６】
ロガー提供機能８にその情報が渡され、ロガー名をロガー実装に確保したロガー実装を作成し（図１３のステップＳ１０１）、ロガーを呼び出し元バンドルＢ１に返す。なお、以前提供したことがある同じロガー名が指定された場合には、同じロガーを返し新規作成はしない。
【００１７】
タイミング２：Ｂ１は、取得したロガーを使って、自分がログを残したいタイミングで、出力ログレベルチェックのためのメソッド（ｉｓＴｒａｃｅＥｎａｂｌｅｄ（）／ｉｓＤｅｂｕｇＥｎａｂｌｅｄ（）／ｉｓＩｎｆｏＥｎａｂｌｅｄ（）／ｉｓＷａｒｎＥａｂｌｅｄ（）／ｉｓＥｒｒｏｒＥａｂｌｅｄ（）／ｉｓＦａｔａｌＥｎａｂｌｅｄ（）など．）を呼ぶ。メソッドには調べたいログレベルが指定されている。図１２では、出力ログレベル比較要求受付機能１が要求を受け付ける（図１３のステップＳ１１０）。
【００１８】
出力ログレベル比較要求受付機能１は、調べたいログレベル情報と、そのロガーが保持するロガー名をログレベル判定機能７に渡す。ログレベル判定機能７では、以下の処理を行う。
【００１９】
１．出力ログレベル管理機能５が保持する「各ロガーの出力ログレベルについての設定情報」に対してそのロガー名に該当する出力ログレベルを入手する（図１３のステップＳ１１１）。
【００２０】
２．入手した出力ログレベルと、調べたいログレベルを比較し（図１３のステップＳ１１３）、その比較結果を出力ログレベル比較要求受付機能１に返す。具体的には、前者が後者以下ならば真（ｔｒｕｅ）を返し（図１３のステップＳ１１５）、そうでなければ偽（ｆａｌｓｅ）を返す（図１３のステップＳ１１７）。
【００２１】
出力ログレベル比較要求受付機能１は、ログレベル判定機能７から返された結果をクライアントバンドルに返す。
【００２２】
タイミング３：Ｂ１は、取得したロガーを使って、自分がログを残したいタイミングで、ログ出力要求メソッド（ｔｒａｃｅ（）／ｄｅｂｕｇ（）／ｉｎｆｏ（）／ｗａｒｎ（）／ｅｒｒｏｒ（）／ｆａｔａｌ（）など．）を呼ぶ。メソッドには対象出力ログレベルが指定されている。図１２では、ロギング要求受付機能２が要求を受け付ける（図１３のステップＳ１１０）。
【００２３】
ロギング要求受付機能２は、対象出力ログレベルと、そのロガーが保持するロガー名をログレベル判定機能７に渡す。ログレベル判定機能７は前記タイミング２と同じ処理を行う（図１３のステップＳ１１１、Ｓ１１３）。ロギング要求受付機能２は、ログレベル判定機能７から返された結果がｔｒｕｅの場合には、ロギング機能６にログしたい内容を渡す。Ｆａｌｓｅの場合にはロギング機能６を呼び出さない（つまりフィルタリングを行う）。
【００２４】
ロギング機能６は、渡された内容を、あらかじめ設定情報読込機能４から渡されたロギング処理に関する設定情報に従い、ログを残す（図１３のステップＳ１１９）。
【００２５】
［ＯＳＧｉ  Ｌｏｇ  Ｓｅｒｖｉｃｅ仕様］
バンドルはプログラムである以上、開発する上でロギング処理を必要とする。そこで、ＯＳＧｉ仕様では、Ｒｅｌｅａｓｅ１からＬｏｇ  ＳｅｒｖｉｃｅというＯＳＧｉサービスの仕様が定義されている。このＬｏｇ  Ｓｅｒｖｉｃｅ仕様では以下を想定している（”ＯＳＧｉ  Ｓｅｒｖｉｃｅ  Ｐｌａｔｆｏｒｍ  Ｒｅｌｅａｓｅ  ２”、  ＩＳＢＮ  ４  ２７４  ９０５００  ４  Ｃ３０５５を参照）。
【００２６】
［既存例２］
図１４に示すように、Ｅｎｔｉｔｙは三つのバンドルである。図内の三角マークはＯＳＧｉフレームワークのサービスレジストリに登録されるサービスを意味し、三角形の頂点に対して矢印を伸ばしているバンドルがサービス登録を行うバンドルであること、底辺に対して矢印を伸ばしているバンドルがサービス取得して利用するバンドルであることを表現している。
【００２７】
１．ＬｏｇＳｅｒｖｉｃｅインタフェースを実装したサービスオブジェクトと、ＬｏｇＲｅａｄｅｒＳｅｒｖｉｃｅインタフェースを実装したサービスオブジェクトを、それぞれＯＳＧｉサービスレジストリに登録するバンドル（Ｂ２）。
【００２８】
２．ロギング処理によりログを残したいバンドル（Ｂ１）。ＯＳＧｉサービスレジストリに登録されたＬｏｇＳｅｒｖｉｃｅインタフェースを実装したサービスオブジェクトを取得して、ＬｏｇＳｅｒｖｉｃｅインタフェースのメソッドを呼ぶことによりログを残す。
【００２９】
３．ＯＳＧｉ  ＬｏｇＳｅｒｖｉｃｅにロギングされたログを、受信したいバンドル（Ｂ３）。そのためにはＯＳＧｉサービスレジストリに登録されたＬｏｇＲｅａｄｅｒＳｅｒｖｉｃｅインタフェースを実装したサービスオブジェクトを取得して、ＬｏｇＲｅａｄｅｒＳｅｒｖｉｃｅインタフェースのａｄｄＬｏｇＬｉｓｔｅｎｅｒ（ＬｏｇＬｉｓｔｅｎｅｒ）  メソッドを呼ぶことでＬｏｇＬｉｓｔｅｎｅｒインタフェースを実装したオブジェクトをリスナ登録する。
【００３０】
これにより、Ｂ１がロギングしたログはＢ２に届き、更にＢ２がリスナ登録されたＬｏｇＬｉｓｔｅｎｅｒ実装の全てのｌｏｇｇｅｄ（ＬｏｇＥｎｔｒｙ）メソッドをコールバックする。
【００３１】
Ｂ３が登録したＬｏｇＬｉｓｔｅｎｅｒインタフェース実装オブジェクトにより、ロギングされたログがどのように処理されるかが決まる。例えば、ＩＮＦＯレベル以上のログのみを、決められたフォーマットで、（１）指定したファイルに書き込む、（２）標準出力に表示する、（３）遠隔地のサーバにアップロードする、（４）メール送信する、などが考えられる。ＯＳＧｉ  Ｌｏｇ  Ｓｅｒｖｉｃｅでは「ロギングされたログ情報の処理方法」の変更が、ＯＳＧｉフレームワークの再起動なしにＢ３に該当するバンドルを交換する事で実現できるという利点を有する。
【先行技術文献】
【非特許文献】
【００３２】
【非特許文献１】Ａｐａｃｈｅ  Ｃｏｍｍｏｎｓ  Ｌｏｇｇｉｎｇ、［ｏｎｌｉｎｅ］、［平成２１年７月３０日検索］、インターネット＜ＵＲＬ：ｈｔｔｐ：／／ｃｏｍｍｏｎｓ．ａｐａｃｈｅ．ｏｒｇ／ｌｏｇｇｉｎｇ／＞
【発明の概要】
【発明が解決しようとする課題】
【００３３】
ＯＳＧｉのバンドルがロギングライブラリを用いる場合、以下の問題が発生する。ＯＳＧｉフレームワーク上の各バンドルは、それぞれ他バンドルとは全く独立にパッケージ名やクラス名を用いることが可能である。その結果、複数のバンドルが全く同じクラス名のクラスを保持することがありうる。例えば、バンドルａとバンドルｂがそれぞれｊｐ．ｃｏ．ｎｔｔ．ｓａｍｐｌｅ．Ｓａｍｐｌｅというクラスを用いることが可能である（名前は同じだが、全く異なる実装ということも有り得る）。このようにＰｒｉｖａｔｅな名前空間を使うことができることにより、バンドル開発の独立性が高まる。これはＯＳＧｉのメリットの一つである。この場合、前述のロガー名をキーとした出力ログレベルの判断を行うと、実際には異なるバンドルに属する別のクラスであるにも関わらず、個別に出力ログレベルを変えることができなくなる。つまり、バンドル毎にまたバンドル内のクラス毎に出力ログレベルを設定できない。
【００３４】
本発明は、上記に鑑みなされたものであり、その目的とするところは、バンドル毎にまたバンドル内のクラス毎に出力ログレベルを設定可能にする技術を提供することにある。
【課題を解決するための手段】
【００３５】
上記課題を解決するために、第１の本発明に係るロガーライブラリ実装装置は、バンドルの実行時にログを出力するロギング手段と、バンドルの識別情報であるバンドル情報と当該バンドルに提供されたロガー名とに対応づけて、当該バンドルの実行時に出力されるログのレベルを示す出力ログレベルが記憶される出力ログレベル記憶手段と、バンドルから出力ログレベルの比較要求を受け付け、当該バンドルに提供されたロガー名と、比較対象の出力ログレベルと、を取得する出力ログレベル比較要求受付手段と、バンドルからログの出力要求を受け付け、当該バンドルに提供されたロガー名と、比較対象の出力ログレベルと、を取得するログ要求受付手段と、前記出力ログレベルの比較要求と前記ログの出力要求との際に取得された前記ロガー名と、当該出力ログレベルの比較要求と前記ログの出力要求とを送信したバンドルを示すバンドル情報と、に対応づけられた出力ログレベルを前記出力ログレベル記憶手段から取得し、当該取得した出力ログレベルと前記比較対象の出力ログレベルとを比較するログレベル判定手段とを備え、前記出力ログレベル比較要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、ログ出力可能であることをバンドルに応答し、前記ログ要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギング手段を制御してログを出力させることを特徴とする。
【００３６】
第２の本発明に係るロガーライブラリ実装装置は、バンドルの実行時にログを出力するロギング手段と、バンドルの識別情報であるバンドル情報に対応づけて、当該バンドルの実行時に出力されるログのレベルを示す出力ログレベルが記憶される出力ログレベル記憶手段と、バンドルから出力ログレベルの比較要求を受け付け、比較対象の出力ログレベルを取得する出力ログレベル比較要求受付手段と、バンドルからログの出力要求を受け付け、比較対象の出力ログレベルを取得するログ要求受付手段と、前記出力ログレベルの比較要求と前記ログの出力要求とを送信したバンドルを示すバンドル情報に対応づけられた出力ログレベルを前記出力ログレベル記憶手段から取得し、当該取得した出力ログレベルと前記比較対象の出力ログレベルとを比較するログレベル判定手段とを備え、前記出力ログレベル比較要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、ログ出力可能であることをバンドルに応答し、前記ログ要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギング手段を制御してログを出力させることを特徴とする。
【００３７】
第３の本発明に係るロガーライブラリ実装装置は、第１または第２の本発明において、前記ロガーライブラリ実装装置の外部から出力ログレベルの変更要求を受け付け、当該出力ログレベルの変更要求に基づいて、前記出力ログレベル記憶手段における出力ログレベルを変更する出力ログレベル変更要求受付手段を備えることを特徴とする。
【００３８】
第４の本発明に係るロガーライブラリ実装装置は、第１１ないし３のいずれかの本発明において、前記ロギング手段に代えて、前記ロガーライブラリ実装装置の外部に存在するロギングサービス実行装置にログを送信するロギングサービス書込手段を備え、前記ログ要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギングサービス書込手段を制御して前記ロギングサービス実行装置にログを送信させることを特徴とする。
【００３９】
第５の本発明に係るロガーライブラリ実装装置における制御方法は、バンドルの実行時にログを出力するロギング手段と、バンドルの識別情報であるバンドル情報と当該バンドルに提供されたロガー名とに対応づけて、当該バンドルの実行時に出力されるログのレベルを示す出力ログレベルが記憶される出力ログレベル記憶手段とを備えるロガーライブラリ実装装置における制御方法であって、前記ロガーライブラリ実装装置の出力ログレベル比較要求受付手段が、バンドルから出力ログレベルの比較要求を受け付け、当該バンドルに提供されたロガー名と、比較対象の出力ログレベルと、を取得し、前記ロガーライブラリ実装装置のログ要求受付手段が、バンドルからログの出力要求を受け付け、当該バンドルに提供されたロガー名と、比較対象の出力ログレベルと、を取得し、前記ロガーライブラリ実装装置のログレベル判定手段が、前記出力ログレベルの比較要求と前記ログの出力要求との際に取得された前記ロガー名と、当該出力ログレベルの比較要求と前記ログの出力要求とを送信したバンドルを示すバンドル情報と、に対応づけられた出力ログレベルを前記出力ログレベル記憶手段から取得し、当該取得した出力ログレベルと前記比較対象の出力ログレベルとを比較し、前記出力ログレベル比較要求受付手段が、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、ログ出力可能であることをバンドルに応答し、前記ログ要求受付手段が、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギング手段を制御してログを出力させることを特徴とする。
【００４０】
第６の本発明に係るロガーライブラリ実装装置における制御方法は、バンドルの実行時にログを出力するロギング手段と、バンドルの識別情報であるバンドル情報に対応づけて、当該バンドルの実行時に出力されるログのレベルを示す出力ログレベルが記憶される出力ログレベル記憶手段とを備えるロガーライブラリ実装装置における制御方法であって、前記ロガーライブラリ実装装置の出力ログレベル比較要求受付手段が、バンドルから出力ログレベルの比較要求を受け付け、比較対象の出力ログレベルを取得し、前記ロガーライブラリ実装装置のログ要求受付手段が、バンドルからログの出力要求を受け付け、比較対象の出力ログレベルを取得し、前記ロガーライブラリ実装装置のログレベル判定手段が、前記出力ログレベルの比較要求と前記ログの出力要求とを送信したバンドルを示すバンドル情報に対応づけられた出力ログレベルを前記出力ログレベル記憶手段から取得し、当該取得した出力ログレベルと前記比較対象の出力ログレベルとを比較し、前記出力ログレベル比較要求受付手段が、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、ログ出力可能であることをバンドルに応答し、前記ログ要求受付手段が、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギング手段を制御してログを出力させることを特徴とする。
【００４１】
第７の本発明に係るロガーライブラリ実装装置における制御方法は、第５または６の本発明において、前記ロギング手段に代えて、前記ロガーライブラリ実装装置の外部に存在するロギングサービス実行装置にログを送信するロギングサービス書込手段が設けられ、前記ログ要求受付手段は、前記出力ログレベル記憶手段から取得された出力ログレベルが前記比較対象の出力ログレベル以上だったなら、前記ロギングサービス書込手段を制御して前記ロギングサービス実行装置にログを送信させることを特徴とする。
【発明の効果】
【００４２】
本発明によれば、バンドル毎にまたはバンドル内のクラス毎に出力ログレベルを設定することが可能になる。
【図面の簡単な説明】
【００４３】
【図１】図１は、実施例１に係るバンドル間の動作を示す図である。
【図２】図２は、実施例１に係るロガーライブラリ実装装置の機能ブロックを示す図である。
【図３】図３は、実施例１に係るロガーライブラリ実装装置の動作を示すフローチャートである。
【図４】図４は、実施例１の派生形に係るバンドル間の動作を示す図である。
【図５】図５は、実施例１の派生形に係るロガーライブラリ実装装置の機能ブロックを示す図である。
【図６】図６は、実施例２に係るバンドル間の動作を示す図である。
【図７】図７は、実施例２に係るロガーライブラリ実装装置の機能ブロックを示す図である。
【図８】図８は、実施例２に係るロガーライブラリ実装装置の動作を示すフローチャートである。
【図９】図９は、実施例２の派生形に係るに係るロガーライブラリ実装装置の機能ブロックを示す図である。
【図１０】図１０は、従来のソースコードの例（Ｊａｖａのロギングライブラリの利用例）を示す図である。
【図１１】図１１は、ＯＳＧｉで既存のロギングライブラリを使う場合におけるバンドル間の動作を示す図である。
【図１２】図１２は、従来のロガーライブラリ実装装置の機能ブロックを示す図である。
【図１３】図１３は、ＯＳＧｉで従来のロガーライブラリ実装装置（既存のライブラリ）を使用するときの動作を示すフローチャートである。
【図１４】図１４は、ＯＳＧｉ  Ｌｏｇ  Ｓｅｒｖｉｃｅ仕様に係るバンドル間の動作を示す図である。
【発明を実施するための形態】
【００４４】
以下、本発明の実施の形態を詳細に説明する。
【００４５】
［実施例１］
実施例１では、ロギング先がＯＳＧｉサービスに限らない一般的な解決策を提供し、バンドル毎のログレベルの設定を可能とする。
【００４６】
図１のように、バンドルＢ４が、ロギングライブラリのパッケージ（例：ｏｒｇ．ａｐａｃｈｅ．ｃｏｍｍｏｎｓ．ｌｏｇｇｉｎｇ）をＥｘｐｏｒｔし、バンドルＢ１が、それをＩｍｐｏｒｔして、ログを残す。
【００４７】
バンドルＢ１が残そうとするログはバンドルＢ４においてロガーの出力ログレベルに応じてフィルタリングされる。但し、この際のログレベルの切り替えはバンドル単位またはバンドル＋ロガー名単位で行われる。
【００４８】
また、実施例１では、ロガー取得メソッドの呼び出し元のバンドルＢ１のＢｕｎｄｌｅオブジェクトを入手し、バンドル単位またはバンドル＋ロガー名単位で、出力ログレベルを管理することを要点（ポイント）としている。
【００４９】
［実施例１−ａ］
図２に示すように、ロガーライブラリ実装装置は、出力ログレベル比較要求受付機能１、ロギング要求受付機能２、ロガー取得要求受付機能３、設定情報読込機能４、出力ログレベル管理機能５、ロギング機能６、ログレベル判定機能７およびロガー提供機能８を有する。
【００５０】
図３は、実施例１に係るロガーライブラリ実装装置の動作を示すフローチャートである。
【００５１】
タイミング０：既存例１と同様に、事前に、設定情報読込機能４により、ロギング処理方法について（例：どこに（標準出力にまたは所定のファイルに）出力するのか、どのようなフォーマットで出力するのか？）、また各ロガーの出力ログレベルについての設定情報を読み込む。一般的には、これらの情報は所定の場所に配置した設定ファイルに決められたフォーマットで記載しておく。読み込まれたロギング処理に関する設定情報はロギング機能６に渡される。読み込まれた各ロガーの出力ログレベルについての設定情報は出力ログレベル管理機能５に渡される。
【００５２】
但し、この際の出力ログレベルの設定は、ロガー名単位ではなく、「バンドル＋ロガー名」単位である。バンドルの情報の粒度としては、例えばバンドルシンボリック名単位もありえるし、「バンドルシンボリック名＋バンドルバージョン」単位も有り得るが、ここでは限定しない。
【００５３】
バンドルシンボリック名とは、ＯＳＧｉ  Ｃｏｒｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ  Ｒｅｌｅａｓｅ  ４で定義されているものである。
【００５４】
タイミング１：Ｂ１がＩｍｐｏｒｔしたパッケージ内のクラスが持つメソッドを使って、ロガーを取得する。ロガー取得時には、ＣｌａｓｓオブジェクトまたはＳｔｒｉｎｇオブジェクトによりロガーの名前を指定する。図２では、ロガー取得要求受付機能３が要求を受け付ける（図３のステップＳ１）。
【００５５】
ロガー提供機能８にその情報が渡される。ここで、ロガー提供機能８は、要求してきたバンドル情報（Ｂｕｎｄｌｅオブジェクト）を取得する（図３のステップＳ３）。そして、そのバンドル情報とロガー名とを確保したロガー実装を作成し（図３のステップＳ５）、作成したロガーを呼び出し元バンドルＢ１に返す。ロガーオブジェクトは、バンドル情報とロガー名に紐付けされた状態で、メモリ上に保持される。
【００５６】
なお、以前提供したことがある同じバンドル情報とロガー名とが指定された場合には、同じロガーを返し新規作成はしない。
【００５７】
ここで、ロガー提供機能８が、ロガー取得を要求してきたバンドルのバンドル情報（Ｂｕｎｄｌｅオブジェクト）を取得する方法について説明する。
【００５８】
１．まず、そのロガー取得を要求してきた実行スタックに積まれたスタックフレームの中から、ロガー取得メソッドを呼び出したクラスのＣｌａｓｓオブジェクトを入手する。それは以下により実現する。
【００５９】
（ア）ＳｅｃｕｒｉｔｙＭａｎａｇｅｒ．ｇｅｔＣｌａｓｓＣｏｎｔｅｘｔ（）メソッドを呼び出すことで、実行スタックに積まれた各スタックフレームのＣｌａｓｓオブジェクトの配列を入手する。この配列は、０、１、２．．．の要素として実行スタックの上から順に格納される（０が一番上のスタックフレームのクラス、要素番号Ｉｎｄｅｘが小さくなるほどメソッドの呼び出し元クラスを示し、スタックの下になっていく）。
【００６０】
（イ）それらのうち、ロガー取得メソッドが所属するクラス名（例えばＡｐａｃｈｅ  Ｃｏｍｍｏｎｓ  Ｌｏｇｇｉｎｇでは”ｏｒｇ．ａｐａｃｈｅ．ｃｏｍｍｏｎｓ．ｌｏｇｇｉｎｇ．ＬｏｇＦａｃｔｏｒｙ”）である要素を探す。
【００６１】
（ウ）そのＩｎｄｅｘをｉとすると、Ｉｎｄｅｘが（ｉ＋１）のＣｌａｓｓが目的の「ロガー取得メソッドを呼び出したクラス」のＣｌａｓｓオブジェクトである。
【００６２】
尚、実行スタックのＣｌａｓｓオブジェクトの配列のうち、Ｉｎｄｅｘが特定の数値のものを選ぶという実施例も考えられるが、ＪＶＭの実装によってはそのＩｎｄｅｘ値は変わる可能性があるため、上記のような方法の方が汎用的で優れている。
【００６３】
２．次に、ＯＳＧｉ仕様のＰａｃｋａｇｅ  Ａｄｍｉｎ  Ｓｅｒｖｉｃｅ（ｖｅｒｉｓｉｏｎ１．２以上）のＰａｃｋａｇｅＡｄｍｉｎ＃ｇｅｔＢｕｎｄｌｅ（Ｃｌａｓｓ）メソッドの引数に、入手したＣｌａｓｓオブジェクトを入れることにより、Ｂｕｎｄｌｅオブジェクトを入手する。
【００６４】
なお、上記スタックフレームのスタックとは、Ｊａｖａの一般的な用語である。Ｊａｖａでは全てのメソッド呼び出しはスレッドの中で実行されるが、一つのスレッドには一つのスタックがメモリ上に割り当てられる。そのスタックでは、あるメソッドが呼び出されるとスタックフレームが一つ積まれ、メソッドがリターンすると一つ削除される。結局、ＳｅｃｕｒｉｔｙＭａｎａｇｅｒ．ｇｅｔＣｌａｓｓＣｏｎｔｅｘｔ（）メソッドを呼ぶことで、どのメソッドからどのメソッドが呼ばれてＳｅｃｕｒｉｔｙＭａｎａｇｅｒ．ｇｅｔＣｌａｓｓＣｏｎｔｅｘｔ（）メソッドの呼び出しに至ったのかが分かる。
【００６５】
タイミング２：Ｂ１は、取得したロガーを使って、自分がログを残したいタイミングで、出力ログレベルチェックのためのメソッドを呼ぶ。メソッドには調べたいログレベルが指定されている。図２では、出力ログレベル比較要求受付機能１が要求を受け付ける（図３のステップＳ１０）。
【００６６】
出力ログレベル比較要求受付機能１は、調べたいログレベル情報（比較対象の出力ログレベル）と、そのロガーが保持するロガー名をログレベル判定機能７に渡す。ログレベル判定機能７では、以下の処理を行う。
【００６７】
１．出力ログレベル管理機能５が保持する「各ロガーの出力ログレベルについての設定情報」に記載された、「該当ロガーが保持するバンドル情報とロガー名」に該当する出力ログレベルを入手する（図３のステップＳ１１）。
【００６８】
２．入手した出力ログレベルと、調べたいログレベルを比較し（図３のステップＳ１３）、その比較結果を出力ログレベル比較要求受付機能１に返す。具体的には、前者が後者以下ならば真（ｔｒｕｅ）を返し（図３のステップＳ１５）、そうでなければ偽（ｆａｌｓｅ）を返す（図３のステップＳ１７）。
【００６９】
出力ログレベル比較要求受付機能１は、ログレベル判定機能７から返された結果をクライアントバンドルに返す。
【００７０】
タイミング３：Ｂ１は、取得したロガーを使って、自分がログを残したいタイミングで、ログ出力要求メソッド（ｔｒａｃｅ（）／ｄｅｂｕｇ（）／ｉｎｆｏ（）／ｗａｒｎ（）／ｅｒｒｏｒ（）／ｆａｔａｌ（）など．）を呼ぶ。メソッドには対象出力ログレベルが指定されている。図２では、ロギング要求受付機能２が要求を受け付ける。
【００７１】
ロギング要求受付機能２は、対象出力ログレベルと、そのロガーが保持するバンドル情報とロガー名をログレベル判定機能７に渡す。ログレベル判定機能７は前記タイミング２と同じ処理を行う（図３のステップＳ２１、Ｓ２３）。ロギング要求受付機能２は、ログレベル判定機能７から返された結果がｔｒｕｅの場合には、ロギング機能６にログしたい内容を渡す。Ｆａｌｓｅの場合にはロギング機能６を呼び出さない。つまりフィルタリングを行う。
【００７２】
ロギング機能６は、渡された内容を、予め設定情報読込機能４から渡されたロギング処理に関する設定情報に従い、ログを残す（図３のステップＳ２５）
したがって、実施例１−ａによれば、出力ログレベルをバンドルとロガー名の組み合わせごとに設定することが可能となる。
【００７３】
すなわち、実施例１−ａに係るロガーライブラリ実装装置によれば、バンドルの実行時にログを出力するロギング手段（ロギング機能６）と、バンドルの識別情報であるバンドル情報と当該バンドルに提供されたロガー名とに対応づけて、当該バンドルの実行時に出力されるログのレベルを示す出力ログレベルが記憶される出力ログレベル記憶手段（出力ログレベル管理機能５）と、バンドルから出力ログレベルの比較要求を受け付け（図３のステップＳ１０）、当該バンドルに提供されたロガー名と、比較対象の出力ログレベルと、を取得する出力ログレベル比較要求受付手段（出力ログレベル比較要求受付機能１）と、バンドルからログの出力要求を受け付け（図３のステップＳ２０）、当該バンドルに提供されたロガー名と、比較対象の出力ログレベルと、を取得するログ要求受付手段（ロギング要求受付機能２）と、出力ログレベルの比較要求とログの出力要求の際に取得されたロガー名と、各要求を送信したバンドルを示すバンドル情報と、に対応づけられた出力ログレベルを出力ログレベル記憶手段から取得し（図３のステップＳ１１、Ｓ２１）、当該取得した出力ログレベルと比較対象の出力ログレベルとを比較するログレベル判定手段（ログレベル判定機能７）とを備え、出力ログレベル比較要求受付手段は、出力ログレベル記憶手段から取得された出力ログレベルが比較対象の出力ログレベル以上だったなら、ログ出力可能であることをバンドルに応答し（図３のステップＳ１５）、ログ要求受付手段は、出力ログレベル記憶手段から取得された出力ログレベルが比較対象の出力ログレベル以上だったなら、ロギング手段を制御してログを出力させる（図３のステップＳ２５）ので、出力ログレベルをバンドルとロガーの組み合わせごとに設定することが可能となる。
【００７４】
［実施例１−ｂ］
また、実施例１−ａの「バンドル情報とロガー名」を全て「バンドル情報」に、「バンドル＋ロガー名毎」を全て「バンドル毎」に置き換える方法も考えられる。この場合、同一バンドル内のクラス毎による出力ログレベルの設定はできないが、バンドル毎に出力ログレベルを設定することは可能である。この場合、実施例１−ａよりも出力ログレベル管理機能５が保持する「各ロガーの出力ログレベルについての設定情報」が少なくできる。
【００７５】
すなわち、実施例１−ｂに係るロガーライブラリ実装装置によれば、バンドルの実行時にログを出力するロギング手段（ロギング機能６）と、バンドルの識別情報であるバンドル情報とに対応づけて、当該バンドルの実行時に出力されるログのレベルを示す出力ログレベルが記憶される出力ログレベル記憶手段（出力ログレベル管理機能５）と、バンドルから出力ログレベルの比較要求を受け付け（図３のステップＳ１０）、比較対象の出力ログレベルを取得する出力ログレベル比較要求受付手段（出力ログレベル比較要求受付機能１）と、バンドルからログの出力要求を受け付け（図３のステップＳ２０）、比較対象の出力ログレベルを取得するログ要求受付手段（ロギング要求受付機能２）と、出力ログレベルの比較要求とログの出力要求を送信したバンドルを示すバンドル情報に対応づけられた出力ログレベルを出力ログレベル記憶手段から取得し（図３のステップＳ１１、Ｓ２１）、当該取得した出力ログレベルと比較対象の出力ログレベルとを比較するログレベル判定手段（ログレベル判定機能７）とを備え、出力ログレベル比較要求受付手段は、出力ログレベル記憶手段から取得された出力ログレベルが比較対象の出力ログレベル以上だったなら、ログ出力可能であることをバンドルに応答し（図３のステップＳ１５）、ログ要求受付手段は、出力ログレベル記憶手段から取得された出力ログレベルが比較対象の出力ログレベル以上だったなら、ロギング手段を制御してログを出力させる（図３のステップＳ２５）ので、出力ログレベルをバンドルごとに設定することが可能となる。
【００７６】
［実施例１−ａ、１−ｂの派生形］
上記の出力ログレベルの管理方法だが、静的な情報として管理する実施形態だけではなく、更にＢ４が各ロガーの出力ログレベルを設定するＯＳＧｉサービスをサービスレジストリにサービス登録する実施形態や、Ｂ４が各ロガーの出力ログレベルを設定するクラスが含まれたＪａｖａパッケージをＥｘｐｏｒｔする実施形態も可能である。これらの設定メソッドとしては、バンドル情報とそのバンドルに与える出力ログレベルを引数とするメソッドや、バンドル情報とロガー名とそのバンドルに属するそのロガー名に与える出力ログレベルを引数とするメソッドが考えられる（図４はＯＳＧｉサービスとして提供する例）。
【００７７】
図５は、実施例１の派生形に係るロガーライブラリ実装装置の機能ブロックを示す図である。図１の機能ブロックに対し、ここでは、新たに出力ログレベル変更要求受付機能９が加わる。
【００７８】
設定情報読込機能４から出力ログレベル管理機能５への設定情報の受け渡しが無くなる代わりに、出力ログレベル変更要求受付機能９が、他バンドル（例：出力ログレベル設定バンドル）からのロガーの出力ログレベル設定の要求を受け付ける。要求を受け付けると、その要求が出力ログレベル管理機能５に渡され、出力ログレベル管理機能５が管理する各ロガーの出力ログレベルが変更される。
【００７９】
したがって、実施例１−ａ、１−ｂの派生形によれば、他のバンドルＢ５がこれらのＯＳＧｉサービスやＰａｃｋａｇｅを利用して、動的に（ＪＶＭ／ＯＳＧｉフレームワークや、ロガーライブラリ実装バンドルＢ４や、ログを残したいバンドルＢ１の再起動無しで）、バンドル毎や「バンドル＋ロガー名」毎に出力ログレベルを変更することが可能となる。出力ログレベルを動的に変更できることは、開発上またトラブル発生時の問題解決時などに非常に便利である。
【００８０】
すなわち、実施例１−ａ、１−ｂの派生形に係るロガーライブラリ実装装置によれば、ロガーライブラリ実装装置の外部から出力ログレベルの変更要求を受け付け、当該出力ログレベルの変更要求に基づいて、出力ログレベル記憶手段における出力ログレベルを変更する出力ログレベル変更要求受付手段（出力ログレベル変更要求受付機能９）を備えるので、出力ログレベルを外部から動的に変更することができる。
【００８１】
［実施例２］
図６に示すように、実施例２に係るバンドル間の動作では、バンドルＢ４におけるフィルタリングを通過したログがバンドルＢ２を介してバンドルＢ３に書き込まれる。
【００８２】
図７に示すように、ロガーライブラリ実装装置にあっては、図１の機能ブロックからロギング機能６が削除され、新たにＬｏｇＳｅｒｖｉｃｅ書込機能１０が加わる。
【００８３】
図８は、このロガーライブラリ実装装置の動作を示すフローチャートである。
【００８４】
タイミング０：事前に、設定情報読込機能４が読み込むのは各ロガーの出力ログレベルについての設定情報であり、その設定情報は出力ログレベル管理機能５に渡される。実施例１−ａで設定情報読込機能４が読み込んだ「ロギング処理に関する設定情報」は不要となる。よって、ロギング機能６に「ロギング処理に関する設定情報」は渡されない。
【００８５】
タイミング１では、ロガー提供機能８でＢｕｎｄｌｅ情報としてＢｕｎｄｌｅオブジェクトだけではなく、ＢｕｎｄｌｅＣｏｎｔｅｘｔオブジェクトも合わせてロガーに確保する点が実施例１−ａと異なる（図８のステップＳ７、Ｓ９）。ＢｕｎｄｌｅＣｏｎｔｅｘｔオブジェクトは、実施例１の方法で取得したＢｕｎｄｌｅオブジェクトのｇｅｔＢｕｎｄｌｅＣｏｎｔｅｘｔ（）メソッド（ＯＳＧｉ仕様で決められたメソッド）を呼ぶことにより取得可能である。
【００８６】
タイミング２での処理は実施例１と同様である。
【００８７】
タイミング３では、ロギング要求受付機能２がロギング機能６を呼び出す代わりに、ＬｏｇＳｅｒｖｉｃｅ書込機能１０を呼び出す。この機能は、ロガーに確保されたＢｕｎｄｌｅＣｏｎｔｅｘｔを用いてフレームワークのサービスレジストリからＬｏｇＳｅｒｖｉｃｅを取得し、ロギング要求受付機能２から渡されたログレベルとログ内容を元に、ＬｏｇＳｅｒｖｉｃｅのメソッドを呼ぶことでＯＳＧｉ  Ｌｏｇ  Ｓｅｒｖｉｃｅに対してログを残す（図８のステップＳ２６）。
【００８８】
尚、ＢｕｎｄｌｅＣｏｎｔｅｘｔを用いてフレームワークのサービスレジストリからＬｏｇＳｅｒｖｉｃｅを取得方法は問わない。例としては、ＯＳＧｉ仕様で決められたＢｕｎｄｌｅＣｏｎｔｅｘｔインタフェースのｇｅｔＳｅｒｖｉｃｅメソッドによる取得方法と、ＳｅｒｖｉｃｅＴｒａｃｋｅｒ仕様で決められたｇｅｔＳｅｒｖｃｉｅメソッドを用いた取得方法があるが、限定しない。
【００８９】
但し、ＬｏｇＳｅｒｖｉｃｅには、ｄｅｂｕｇ／ｉｎｆｏ／ｗａｒｎ／ｅｒｒｏｒの４種類しかログレベルが存在しないため、それ以外のログレベルが指定された場合には、適宜ログレベルのマッピングを行う。例えば、ｔｒａｃｅはｄｅｂｕｇに、ｆａｔａｌはｅｒｒｏｒにマッピングする。
【００９０】
したがって、実施例２によれば、実施例１の効果に加えて、「ロギングされたログ情報の処理方法」に関する高い可変性を得ることができる。
【００９１】
すなわち、実施例２に係るロガーライブラリ実装装置によれば、ロギング手段に代えて、ロガーライブラリ実装装置の外部に存在するロギングサービス実行装置（ＯＳＧｉ  Ｌｏｇ  Ｓｅｒｖｉｃｅ）にログを送信するロギングサービス書込手段（ＬｏｇＳｅｒｖｉｃｅ書込機能１０）を備え、ログ要求受付手段は、出力ログレベル記憶手段から取得された出力ログレベルが比較対象の出力ログレベル以上だったなら、ロギングサービス書込手段を制御してロギングサービス実行装置にログを送信させるので、「ロギングされたログ情報の処理方法」に関する高い可変性を得ることができる。
【００９２】
尚、実施例１−ａにおいて、実施例１−ａやそれらの派生形が考えられたのと全く同様に、実施例２に関しても、ログレベル管理をバンドル情報のみで行う実施例や、それらの派生形が考えられる。実施例２等の派生形での機能ブロックは図９である。これにより、動的にロガーのログレベルを変更することが可能となる。
【００９３】
また、実施例２など（上記の派生形なども含める）では、ロガー提供機能８において、要求元のバンドルのＢｕｎｄｌｅＣｏｎｔｅｘｔを取得したが、この時点ではＢｕｎｄｌｅオブジェクトだけを取得し、Ｂｕｎｄｌｅオブジェクトをロガーに保持しておく方法も考えられる。この場合、ＬｏｇＳｅｒｖｉｃｅ書込機能１０においてＯＳＧｉ  Ｌｏｇ  Ｓｅｒｖｉｃｅを取得する前に、ＢｕｎｄｌｅオブジェクトからＢｕｎｄｌｅＣｏｎｔｅｘｔオブジェクトを取得すればよい。
【００９４】
なお、ロガーライブラリ実装装置としてコンピュータを機能させるためのコンピュータプログラムは、半導体メモリ、磁気ディスク、光ディスク、光磁気ディスク、磁気テープなどのコンピュータ読み取り可能な記録媒体に記録したり、インターネットなどの通信網を介して伝送させて、広く流通させることができる。
【符号の説明】
【００９５】
１…出力ログレベル比較要求受付機能
２…ロギング要求受付機能
３…ロガー取得要求受付機能
４…設定情報読込機能
５…出力ログレベル管理機能
６…ロギング機能
７…ログレベル判定機能
８…ロガー提供機能
９…出力ログレベル変更要求受付機能
１０…ＬｏｇＳｅｒｖｉｃｅ書込機能
【図１】
2011039774.tif 000003
【図２】
2011039774.tif 000004
【図３】
2011039774.tif 000005
【図４】
2011039774.tif 000006
【図５】
2011039774.tif 000007
【図６】
2011039774.tif 000008
【図７】
2011039774.tif 000009
【図８】
2011039774.tif 000010
【図９】
2011039774.tif 000011
【図１０】
2011039774.tif 000012
【図１１】
2011039774.tif 000013
【図１２】
2011039774.tif 000014
【図１３】
2011039774.tif 000015
【図１４】
2011039774.tif 000016