以下、実施形態を図面を用いて説明する。
図1は、一実施形態におけるログ出力装置10の例を示している。ログ出力装置10は、例えば、監視対象のモジュール100が動作するシステムに組み込まれ、モジュール100で生成されるログLGiの出力を管理する。例えば、モジュール100の動作は、システムに搭載されるコンピュータ等がアプリケーションプログラムを実行することにより実現される。なお、モジュール100とログ出力装置10とが組み込まれるシステムもログ出力装置の一態様を形成する。ログ出力装置10は、例えば、頻度検出部20、レベル変更部30およびログ出力部40を有している。
頻度検出部20は、監視対象のモジュール100で生成されるログLGiの発生頻度FQを計算する。以下、ログLGiの発生頻度FQをログ発生頻度FQとも称する。例えば、頻度検出部20は、モジュール100からログLGiを順次受け、ログ発生頻度FQを計算する。そして、頻度検出部20は、ログ発生頻度FQをレベル変更部30に通知する。なお、頻度検出部20は、ログLGiをモジュール100から共有メモリを介して順次受けてもよい。共有メモリは、例えば、ログ出力装置10およびモジュール100のどちらからでもアクセス可能なメモリである。
レベル変更部30は、ログ出力の基準となるログ出力レベルLVを、モジュール100で生成されるログLGiの発生頻度FQに基づいて調整する。例えば、レベル変更部30は、ログ発生頻度FQを示す信号を頻度検出部20から受ける。そして、レベル変更部30は、ログ出力レベルLVをログ発生頻度FQに基づいて調整し、調整したログ出力レベルLVをログ出力部40に通知する。ログ出力レベルLVは、例えば、n段階(nは2以上の整数)の状態値のいずれかに調整される。図2に示す例では、ログ出力レベルLVは、5段階の状態値(“1”−“5”)のいずれかに調整される。
なお、ログ出力レベルLVの値(状態値)は、例えば、ログLGの重要度(ログレベル)に対応している。この実施形態では、ログLGの重要度は、ログレベルの値が大きいほど高くなる。例えば、レベル変更部30は、ログ発生頻度FQが高いとき、ログ出力レベルLVの値を低くし、詳細なログ情報(低いログレベルのログLG)が出力されるようにする。また、レベル変更部30は、例えば、ログ発生頻度FQが低いとき、ログ出力レベルLVの値を高くし、不要なログ情報(低いログレベルのログLG)が出力されないようにする。
ログ出力部40は、レベル変更部30で調整されたログ出力レベルLV以上の重要度のログLGoを出力する。例えば、重要度が高くなるほどログレベルの値が大きくなるとき、ログ出力レベルLV以上の重要度のログLGoは、ログ出力レベルLV以上のログレベルのログLGoである。なお、重要度が高くなるほどログレベルの値が小さくなるときには、ログ出力レベルLV以上の重要度のログLGoは、ログ出力レベルLV以下のログレベルのログLGoである。
したがって、重要度が高くなるほどログレベルの値が大きくなるシステムでは、ログ出力部40は、モジュール100から受けたログLGiのうち、ログ出力レベルLV以上のログレベルのログLGoを選択して出力する。例えば、ログ出力部40は、ログ出力レベルLVを示す信号をレベル変更部30から受けるとともに、モジュール100からログLGiを順次受ける。そして、ログ出力部40は、モジュール100から受けたログLGiのうち、ログ出力レベルLV以上のログLGoをネットワークやファイル等に出力する。
例えば、ログ出力レベルLVが“3”のときには、ログレベルが“3”以上のログLGi(LGo)が出力され、ログレベルが“2”以下のログLGiは出力されない。なお、ログ出力部40は、ログLGiをモジュール100から共有メモリを介して順次受けてもよい。また、ログ出力部40は、ログLGoをメモリに出力してもよい。
このように、ログ出力装置10から出力されるログLGoは、モジュール100で生成されるログLGiのうち、ログ出力レベルLV以上のログレベルのログLGiに限定される。これにより、この実施形態では、不要なログ出力の処理コストを低減できる。
なお、ログ出力装置10の構成は、この例に限定されない。例えば、ログ出力部40は、ログLGiを頻度検出部20から順次受けてもよい。あるいは、ログ出力部40は、頻度検出部20内に形成されてもよい。また、ログ出力部40は、モジュール100内に形成されてもよい。このときには、ログ出力装置10の一部(ログ出力部40)は、モジュール100の一部として機能する。
図2は、ログ出力レベルLVとログ発生頻度FQとの関係の一例を示している。図2のログ出力レベルLVの値(“1”−“5”)は、例えば、モジュール100で生成されるログLGに定義された5段階のレベルTrace、Debug、info、Warning、Errorにそれぞれ対応している。ログ発生頻度FQの上限Fmaxおよび下限Fminは、例えば、ログ出力レベルLV毎に予め設定されている。ログ発生頻度FQは、例えば、予め設定された単位時間(例えば、10ms)に発生するログLGの数である。
状態値“1”のログ出力レベルLVに対応するログ発生頻度FQの上限Fmaxおよび下限Fminは、ほぼ無限大および“990”にそれぞれ設定されている。ここで、ほぼ無限大は、例えば、ログ出力装置10の演算処理で使用可能な最大値である。状態値“2”のログ出力レベルLVに対応するログ発生頻度FQの上限Fmaxおよび下限Fminは、“1000”および“395”にそれぞれ設定されている。
状態値“3”のログ出力レベルLVに対応するログ発生頻度FQの上限Fmaxおよび下限Fminは、“400”および“98”にそれぞれ設定されている。状態値“4”のログ出力レベルLVに対応するログ発生頻度FQの上限Fmaxおよび下限Fminは、“100”および“9”にそれぞれ設定されている。そして、状態値“5”のログ出力レベルLVに対応するログ発生頻度FQの上限Fmaxおよび下限Fminは、“10”および“0”にそれぞれ設定されている。
ログ出力レベルLVは、例えば、上限Fmaxおよび下限Fminの少なくとも一方と頻度検出部20で計算されたログ発生頻度FQとが比較されることにより、5段階の状態値(“1”−“5”)のいずれかに調整される。例えば、ログ出力レベルLVは、ログ発生頻度FQが上限Fmaxより高いとき、比較時のレベルからレベルダウンし、ログ発生頻度FQが下限Fminより低いとき、比較時のレベルからレベルアップする。
なお、図2の例では、下限Fminから上限Fmaxまでの範囲の一部は、2つのログ出力レベルLVで重複している。これにより、例えば、図3に示す動作では、ログ発生頻度FQが上限Fmaxや下限Fminに近い値で変化しているとき、ログ出力レベルLVが頻繁に変更されることを抑制できる。この結果、この実施形態では、ログ出力レベルLVの不要な変更を抑制できる。なお、下限Fminから上限Fmaxまでの範囲は、2つのログ出力レベルLVで重複しないように設定されてもよい。
また、ログ出力レベルLVの状態値の数は、ログレベルの状態値の数と異なっていてもよい。例えば、ログレベルが“1”−“5”までの5段階で定義されているとき、ログ出力レベルLVは、“2”、“3”および“4”の3段階で定義されてもよい。このときには、例えば、“2”のログ出力レベルLVに対応するログ発生頻度FQの上限Fmaxは、ほぼ無限大に設定される。そして、“4”のログ出力レベルLVに対応するログ発生頻度FQの下限Fminは、“0”に設定される。
図3は、図1に示したログ出力装置10の動作の一例を示している。図3の動作は、ハードウエアをソフトウエアにより制御することにより実現される。例えば、ログ出力プログラム等のソフトウエアは、コンピュータに図3の動作を実行させる。例えば、ログ出力装置10の動作を制御するログ出力プログラムの起動により、処理S100が実施される。なお、図3の動作は、ハードウエアのみで実現されてもよい。
処理S100、S120−S180は、ログ出力装置10で実施され、処理S110は、モジュール100で実施される。したがって、処理S100−S180の一連の処理は、例えば、モジュール100とログ出力装置10とが組み込まれるシステム(コンピュータ)により実施される。
処理S100では、ログ出力装置10(例えば、レベル変更部30)は、ログ出力レベルLVを初期化する。これにより、ログ出力レベルLVは、予め設定された初期値(例えば、図2に示した状態値“3”)に設定される。処理S110では、モジュール100の動作を制御するプログラム(監視対象のプログラム)が実行される。これにより、モジュール100は、動作状況に応じたログLGを発生する。以下、監視対象のプログラムを対象プログラムとも称する。
処理S120では、頻度検出部20は、ログ発生頻度FQを計算する。例えば、頻度検出部20は、システムに搭載されたタイマ等を用いて単位時間を計測し、単位時間にモジュール100から受けたログLGの数をカウントする。なお、頻度検出部20は、最初にカウントしたログLGの発生時刻から単位時間経過後に発生したログLGか否かを、ログLGに含まれる時刻情報等に基づいて判定してもよい。このときには、頻度検出部20は、タイマを用いて単位時間を計測しなくてもよい。また、ログ発生頻度FQを計算する間隔は、単位時間と同じでもよいし、異なっていてもよい。
処理S130では、ログ出力部40は、モジュール100から受けたログLGのうち、ログ出力レベルLV以上のログレベルのログLGを出力する。例えば、ログ出力レベルLVが処理S150や処理S170で調整されたとき、ログ出力部40は、調整されたログ出力レベルLV以上のログレベルのログLGを出力する。なお、ログ出力レベルLVは、処理S150や処理S170で調整されるまで、処理S100で設定された初期値に維持されている。
処理S140では、レベル変更部30は、処理S120で計算したログ発生頻度FQがログ発生頻度FQの上限Fmax(LV)より大きいか否かを判定する。上限Fmax(LV)の括弧内の“LV”は、処理S140を実施するときに設定されているログ出力レベルLVの値(状態値)である。したがって、上限Fmax(LV)は、処理S140を実施するときに設定されているログ出力レベルLVの値に対応して設定されているログ発生頻度FQの上限Fmaxである。
図3の動作では、処理S130で参照されたログ出力レベルLVの値に対応して設定されているログ発生頻度FQの上限Fmaxと、処理S120で計算したログ発生頻度FQが比較される。例えば、ログ発生頻度FQの上限Fmaxおよび下限Fminが図2に示したように設定され、処理S130で参照されたログ出力レベルLVが“3”のときには、レベル変更部30は、処理S120で計算したログ発生頻度FQが“400”より大きいか否かを判定する。
ログ発生頻度FQが上限Fmax(LV)より大きいとき(処理S140のYes)、レベル変更部30は、処理S150において、ログ出力レベルLVをレベルダウンする。これにより、ログ出力レベルLVの値が低くなり、出力されるログLGの数が増加する。例えば、処理S150の後に実施される処理S130では、詳細なログ情報(低いログレベルのログLG)が出力される。一方、ログ発生頻度FQが上限Fmax(LV)以下のとき(処理S140のNo)、レベル変更部30の動作は、処理S160に移る。
処理S160では、レベル変更部30は、処理S120で計算したログ発生頻度FQがログ発生頻度FQの下限Fmin(LV)より小さいか否かを判定する。下限Fmin(LV)の括弧内の“LV”の意味は、処理S140と同じである。したがって、図3の動作では、処理S130で参照されたログ出力レベルLVの値に対応して設定されているログ発生頻度FQの下限Fminと、処理S120で計算したログ発生頻度FQが比較される。例えば、ログ発生頻度FQの上限Fmaxおよび下限Fminが図2に示したように設定され、処理S130で参照されたログ出力レベルLVが“3”のときには、レベル変更部30は、処理S120で計算したログ発生頻度FQが“98”より小さいか否かを判定する。
ログ発生頻度FQが下限Fmin(LV)より小さいとき(処理S160のYes)、レベル変更部30は、処理S170において、ログ出力レベルLVをレベルアップする。これにより、ログ出力レベルLVの値は高くなり、出力されるログLGの数が減少する。例えば、処理S170の後に実施される処理S130では、不要なログ情報(低いログレベルのログLG)は出力されない。一方、ログ発生頻度FQが下限Fmin(LV)以上のとき(処理S160のNo)、ログ出力装置10の動作は、処理S180に移る。
すなわち、ログ発生頻度FQが下限Fmin(LV)以上で上限Fmax(LV)以下のときには、ログ出力装置10は、ログ出力レベルLVの値を変更せずに、処理S180の終了判定を実施する。なお、ログ発生頻度FQが上限Fmax(LV)より大きいときには、ログ出力レベルLVがレベルダウンされた後(処理S150の後)、処理S180が実施される。また、ログ発生頻度FQが下限Fmin(LV)より小さいときには、ログ出力レベルLVがレベルアップされた後(処理S170の後)、処理S180が実施される。
処理S180では、ログ出力装置10は、対象プログラム(モジュール100の動作)が終了したか否かを判定する。対象プログラムが終了していないとき(処理S180のNo)、ログ出力装置10の動作は、処理S110に移る。これにより、ログ出力レベルLVを調整する処理(処理S120−S170)が繰り返される。一方、対象プログラムが終了しているとき(処理S180のYes)、ログ出力装置10は、一連の処理を終了する。
このように、ログ出力装置10は、ログ発生頻度FQが高くなるほど、ログ出力レベルLVの値を低くする。これにより、ログ出力装置10は、ログ発生頻度FQが高いとき、低いレベル(詳細なログ情報)から高いレベル(重要度の高いログ情報)までのログLGを出力できる。例えば、モジュール100が正常な動作と異なる動作をし始めると、警告等を知らせるログLG(例えば、WarningレベルのログLG)が増加し、ログ発生頻度FQが高くなる。
したがって、ログ発生頻度FQが高くなるほど、モジュール100が期待通りに動作していない可能性が高くなる。すなわち、モジュール100の異常終了等の原因を特定するための詳細なログLGが必要になる可能性が高くなる。この実施形態では、ログ出力装置10は、ログ発生頻度FQが高くなるほど、ログ出力レベルLVの値を低くしている。このため、この実施形態では、問題の原因特定に必要なログLGを出力できる。
また、ログ出力装置10は、ログ発生頻度FQが低くなるほど、ログ出力レベルLVの値を高くする。これにより、ログ出力装置10は、ログ発生頻度FQが低いとき、低いレベル(不要なログ情報)のログLGを出力しない。例えば、モジュール100が正常に動作しているときには、警告等を知らせるログLG(例えば、WarningレベルのログLG)が発生しないため、ログ発生頻度FQは低い。
したがって、ログ発生頻度FQが低いときには、ログレベルの低いログLGを出力する処理は、不要なログ出力の処理に相当する。この実施形態では、ログ出力装置10は、ログ発生頻度FQが低くなるほど、ログ出力レベルLVの値を高くしている。このため、この実施形態では、不要なログ出力の処理コストを低減できる。
このように、ログ出力装置10は、モジュール10の動作状況に応じて、ログ出力レベルLVを動的に変化させる。すなわち、この実施形態では、ログ出力レベルLVを適切なログレベルに自動調整できる。この結果、この実施形態では、必要なログLGを出力しつつ、不要なログ出力の処理コストを低減できる。
なお、ログ出力装置10の動作は、この例に限定されない。例えば、ログLGの出力(処理S130)は、処理S180の前に実施されてもよいし、処理S120の前に実施されてもよい。また、頻度検出部20は、式(1)に示すように、ログレベル毎に重み付けして、ログ発生頻度FQを計算してもよい。なお、式(1)の“ω”は、各ログレベルの重みであり、“C”は、単位時間に発生した各ログレベルのログLGの数である。積和は、例えば、ログレベルの状態値の数がn個(図2の例では、5個)のとき、i=1からnまでである。
FQ=Σ(ω(i)・C(i)) ・・・(1)
例えば、ログレベルの低いログLGが多量に発生するモジュール100では、発生頻度の低いWarningレベル等のログLGの数の増減は、ログ発生頻度FQに反映されにくい。このため、モジュール100の動作状況の検出精度が低下するおそれがある。このようなときには、各ログレベルに対して重みを付けることにより、モジュール100の動作状況の検出精度を向上できる。例えば、Warningレベル(図2では、ログレベル=4)以上のレベルの重みωを“1”に設定し、Warningレベルより低いレベルの重みωを“0”に設定する。このときのログ発生頻度FQは、Warningレベル以上のログLGの発生頻度である。
図4は、図1に示したログ出力装置10の動作の別の例を示している。図4の動作は、ハードウエアをソフトウエアにより制御することにより実現される。例えば、ログ出力プログラム等のソフトウエアは、コンピュータに図4の動作を実行させる。なお、図4の動作は、ハードウエアのみで実現されてもよい。
図4の動作では、処理S100−S180と処理S210−S220とが並列に実施される。例えば、処理S100−S180は、ログ出力装置10で実施され、処理S210−S220は、モジュール100で実施される。なお、図4の破線の矢印は、モジュール100で発生したログLGが共有メモリを介してログ出力装置10に転送されることを示している。
例えば、モジュール100とログ出力装置10とが組み込まれるシステム(コンピュータ)は、処理S100−S180と処理S210−S220とを互いに異なるスレッド(図4では、監視対象スレッド、ログ出力スレッド)で実施できる。なお、処理S212、S220は、モジュール100とは別のモジュールにより実施されてもよい。例えば、処理S212は、ログ出力装置10により実施されてもよい。このときには、ログ出力装置10の一部(処理S212)は、ログ出力装置10の他の処理(処理S100−S180)と異なるスレッドで動作する。
ログ出力スレッドによるログ出力装置10の動作(処理S100−S180)は、図3に示した処理S110の代わりに、処理S112が実施されることを除いて、図3の動作と同じである。図3で説明した動作については、詳細な説明を省略する。先ず、ログ出力スレッドの起動により、ログ出力プログラムが起動する。これにより、処理S100が実施される。そして、ログ出力スレッドの起動後に、監視対象スレッドが起動され、対象プログラムが起動される。これにより、処理S210が実施される。
処理S210では、モジュール100の動作を制御する対象プログラムが実行される。これにより、モジュール100は、動作状況に応じたログLGを発生する。処理S212では、モジュール100は、発生したログLGを共有メモリにライトする。これにより、モジュール100で発生したログLGが、ログ出力レベルLVに拘わらず、共有メモリに記憶される。
処理S220では、モジュール100は、対象プログラムを終了させるか否かを判定する。対象プログラムが終了しないとき(処理S220のNo)、モジュール100の動作は、処理S210に移る。一方、対象プログラムが終了するとき(処理S220のYes)、モジュール100は、一連の処理を終了する。すなわち、モジュール100は、対象プログラムが終了するまで、処理S212を繰り返す。
ログ出力装置10は、処理S100でログ出力レベルLVを初期化した後、処理S112において、ログLGを共有メモリからリードする。例えば、処理S112では、頻度検出部20は、共有メモリに記憶されているログLGを順次読み出す。換言すれば、頻度検出部20は、ログLGをモジュール100から共有メモリを介して順次受ける。これにより、頻度検出部20は、処理S120において、ログ発生頻度FQを計算できる。
処理S120−S180は、図3の処理S120−S180と同じである。なお、対象プログラムが終了していないとき(処理S180のNo)、ログ出力装置10の動作は、処理S112に移る。図4の動作を実施するログ出力装置10においても、図3の動作を実施するログ出力装置10と同様の効果を得ることができる。さらに、図4の動作では、監視対象スレッドとログ出力スレッドとを並列に実施できるため、モジュール100とログ出力装置10とが組み込まれるシステム(コンピュータ)の処理効率を向上できる。
図5は、図1に示したログ出力装置10の動作の別の例を示している。図5の動作は、ハードウエアをソフトウエアにより制御することにより実現される。例えば、ログ出力プログラム等のソフトウエアは、コンピュータに図5の動作を実行させる。なお、図5の動作は、ハードウエアのみで実現されてもよい。
図5の動作では、処理S100−S180と処理S200−S220とが並列に実施される。したがって、例えば、モジュール100とログ出力装置10とが組み込まれるシステム(コンピュータ)は、処理S100−S180と処理S200−S220とを互いに異なるスレッド(図5では、監視対象スレッド、ログ管理スレッド)で実施できる。なお、図5の破線の矢印は、ログLGおよびログ出力レベルLVが異なるスレッド間で参照されることを示している。
例えば、図5の破線の矢印(LG)は、モジュール100で発生したログLGの数をカウントするための情報がログ出力装置10に転送されることを示している。また、図5の破線の矢印(LV)は、例えば、処理S100−S180がログ出力装置10で実施され、処理S200−S220がモジュール100で実施されとき、ログ出力装置10で調整したログ出力レベルLVがモジュール100に転送されることを示している。
なお、処理S200、S212、S214、S220は、モジュール100とは別のモジュールにより実施されてもよい。例えば、処理S200、S212、S214は、ログ出力装置10により実施されてもよい。このときには、ログ出力装置10の一部(処理S200、S212、S214)は、ログ出力装置10の他の処理(処理S100−S180)と異なるスレッドで動作する。
ログ管理スレッドによるログ出力装置10の動作(処理S100−S180)では、図4に示した処理S112、S130が省かれ、処理S120の代わりに処理S120aが実施される。ログ出力装置10のその他の動作は、図4のログ出力装置10の動作と同じである。図3および図4で説明した動作については、詳細な説明を省略する。先ず、ログ管理スレッドの起動により、ログ出力プログラムが起動する。これにより、処理S100が実施される。そして、ログ出力プログラムの起動後に、監視対象スレッドが起動され、処理S200が実施される。
処理S200では、モジュール100は、処理S212で参照するログ出力レベルLVを初期化する。なお、処理S200は、例えば、ログ出力装置10により実施されてもよい。処理S210では、モジュール100の動作を制御する対象プログラムが実行される。これにより、モジュール100は、動作状況に応じたログLGを発生する。
処理S212では、モジュール100は、動作状況に応じて発生したログLGのうち、ログ出力レベルLV以上のログレベルのログLGをメモリ(例えば、共有メモリ)にライトする。これにより、モジュール100で発生したログLGのうち、ログ出力レベルLV以上のログLGが共有メモリに記憶される。処理S212で参照されるログ出力レベルLVは、処理S214で更新されるまで、処理S200で設定された初期値に維持されている。なお、処理S212の動作は、図1に示したログ出力部40の動作に対応している。すなわち、ログ出力装置10の一部(ログ出力部40)は、モジュール100の一部として機能する。
処理S214では、モジュール100は、ログ出力装置10の処理S150や処理S170で調整されたログ出力レベルLVに基づいて、処理S212で参照するログ出力レベルLVを更新する。例えば、モジュール100は、ログ出力レベルLVを示す信号をログ出力装置10(より詳細には、レベル変更部30)から受ける。
処理S220では、モジュール100は、対象プログラムを終了させるか否かを判定する。対象プログラムが終了しないとき(処理S220のNo)、モジュール100の動作は、処理S210に移る。一方、対象プログラムが終了するとき(処理S220のYes)、モジュール100は、一連の処理を終了する。
ログ出力装置10は、処理S100でログ出力レベルLVを初期化した後、処理S120aにおいて、ログ発生頻度FQを計算する。例えば、頻度検出部20は、モジュール100の処理S212を監視し、単位時間にモジュール100で発生したログLGの数をカウントする。これにより、頻度検出部20は、ログ発生頻度FQを計算できる。
処理S120aの実施後、ログ出力装置10の動作は、処理S140に移る。処理S140−S180は、図3の処理S140−S180と同じである。なお、対象プログラムが終了していないとき(処理S180のNo)、ログ出力装置10の動作は、処理S120aに移る。
図5の動作を実施するログ出力装置10においても、図4の動作を実施するログ出力装置10と同様の効果を得ることができる。なお、ログ出力装置10の動作は、この例に限定されない。例えば、ログ管理スレッドで動作するログ出力装置10および監視対象スレッドで動作するモジュール100のどちらからでもアクセス可能な記憶部にログ出力レベルLVが記憶されるとき、処理S200、S214は、省かれてもよい。
また、ログ発生頻度FQの計算は、監視対象スレッドで実施されてもよい。すなわち、頻度検出部20の動作は、監視対象スレッドで実施されてもよい。このときには、例えば、ログ発生頻度FQを示す信号が、監視対象スレッドで動作する頻度検出部20からログ管理スレッドで動作するレベル変更部30に転送される。あるいは、ログ発生頻度FQは、ログ管理スレッドで動作するレベル変更部30および監視対象スレッドで動作する頻度検出部20のどちらからでもアクセス可能な記憶部に記憶されてもよい。
図6は、図1に示したログ出力装置10の動作の別の例を示している。図6の動作は、ハードウエアをソフトウエアにより制御することにより実現される。例えば、ログ出力プログラム等のソフトウエアは、コンピュータに図6の動作を実行させる。なお、図6の動作は、ハードウエアのみで実現されてもよい。図6の動作(処理S100−S180)は、図3に示した処理S150、S170の代わりに、処理S150a、S170aが実施されることを除いて、図3の動作と同じである。図3で説明した動作については、詳細な説明を省略する。
例えば、ログ出力装置10の動作を制御するログ出力プログラムの起動により、処理S100が実施される。処理S100−S140、S160は、図3の処理S100−S140、S160と同じである。また、処理S150a、S170aは、処理S150a、S170aの後に実施される処理を除いて、図3の処理S150、S170と同じである。例えば、レベル変更部30は、処理S150aでログ出力レベルLVをレベルダウンした後、処理S140を実施する。また、レベル変更部30は、処理S170aでログ出力レベルLVをレベルアップした後、処理S160を実施する。
すなわち、レベル変更部30は、処理S120で計算したログ発生頻度FQが上限Fmax(LV)より大きくなるまで、ログ出力レベルLVをレベルダウンする。あるいは、レベル変更部30は、ログ発生頻度FQが下限Fmin(LV)より小さくなるまで、ログ出力レベルLVをレベルアップする。これにより、レベル変更部30は、例えば、1回のログ発生頻度FQの計算で、ログ出力レベルLVを2段階以上変化させることができる。すなわち、レベル変更部30は、ログ出力レベルLVを、ログ発生頻度FQに応じたログレベルに迅速に設定できる。
図6の動作を実施するログ出力装置10においても、図3の動作を実施するログ出力装置10と同様の効果を得ることができる。さらに、図6の動作では、ログ発生頻度FQに応じたログ出力レベルLVに迅速に調整できるため、ログ発生頻度FQの変化量が大きいときにも、ログ出力レベルLVを適切なログレベルに迅速に自動調整できる。なお、図4および図5の動作においても、処理S150、S170の代わりに、処理S150a、S170aが実施されてもよい。
以上、この実施形態では、ログ出力装置10は、モジュール100のログ発生頻度FQを計算する頻度検出部20と、ログ出力レベルLVをログ発生頻度FQに基づいて調整するレベル変更部30と、ログ出力レベルLV以上の重要度(ログレベル)のログLGを出力するログ出力部40とを有している。これにより、この実施形態では、ログ出力レベルLVをモジュール100の動作状況に応じた適切なログレベルに自動調整できる。この結果、この実施形態では、必要なログLGを出力しつつ、不要なログ出力の処理コストを低減できる。
例えば、この実施形態では、モジュール100が正常に動作しているときには、ログ出力レベルLVを高くし、出力するログLGの数を低減できる。この結果、ログ出力の処理コストを低減できる。また、この実施形態では、ログ発生頻度FQが高いときには、ログ出力レベルLVを低くし、多くのログLGを出力させることができる。これにより、この実施形態では、モジュール100が異常終了等したときの原因を調査するための情報(ログLG)を与えることができる。
図7は、別の実施形態におけるログ出力装置12の一例を示している。上述した実施形態で説明した要素と同一の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。この実施形態のログ出力装置12の構成は、レベル変更部30の代わりにレベル変更部32を有することを除いて、上述した実施形態と同じである。図7の太い線の矢印は、モジュール100間のデータフローを示している。
図7の符号の末尾の“a”、“b”、“_a”および“_b”等は、2つのログ出力装置12(12a、12b)を区別するために付している。したがって、図7のログLGi_a、LGi_b、信号FQa、FQb、信号LVa、LVb、ログLGo_a、LGo_bの意味は、図1のログLGi、信号FQ、信号LV、ログLGoと同じである。以下、2つのログ出力装置12を区別せずに説明するとき等、“a”、“b”、“_a”および“_b”等を省略して称するときもある。
ログ出力装置12は、例えば、モジュール100が複数のとき、モジュール100(100a、100b)毎に形成される。ログ出力装置12aの構成および動作は、ログ出力装置12bと同じである。このため、ログ出力装置12aについて説明する。ログ出力装置12aは、例えば、頻度検出部20a、レベル変更部32aおよびログ出力部40aを有している。頻度検出部20aおよびログ出力部40aは、図1に示した頻度検出部20およびログ出力部40と同じである。
レベル変更部32aは、例えば、ログ発生頻度FQaを示す信号および伝播レベルDLbを示す信号を受け、ログ出力レベルLVaを示す信号および伝播レベルDLaを示す信号を出力する。例えば、レベル変更部32aは、ログ発生頻度FQaに基づいて調整したログ出力レベルを、伝播レベルDLbに基づいて補正する。
したがって、レベル変更部32aから出力されるログ出力レベルLVaは、伝播レベルDLbに基づいて補正されている。伝播レベルDLbは、例えば、データを送信するモジュール100aとデータを受信するモジュール100bとの間の依存関係に応じた値である。すなわち、レベル変更部32aは、ログ発生頻度FQaに基づいて調整したログ出力レベルを、モジュール100間の依存関係に応じて補正する。
このように、この実施形態では、モジュール100のログ発生頻度FQの変化(モジュール100の内部状態の変化)により、ログ出力レベルLVが変化したとき、そのモジュール100にデータを送信したモジュール100のログ出力レベルLVも変化させる。
なお、ログ出力装置12の構成は、この例に限定されない。例えば、レベル変更部32が受ける伝播レベルDLは、1つに限定されない。例えば、図8に示すように、ログ出力装置12(12a)は、複数のログ出力装置12(12b、12c)から伝播レベルDLをそれぞれ受けてもよい。同様に、レベル変更部32が出力する伝播レベルDLは、1つに限定されない。例えば、図8に示すように、ログ出力装置12(12d)は、複数のログ出力装置12(12b、12c)に伝播レベルDLをそれぞれ出力してもよい。
図8は、図7に示したログ出力装置12におけるログ出力レベル伝播の一例を示している。図8の例では、モジュールシステムは、モジュール100a、100b、100c、100dとモジュール100毎に形成されたログ出力装置12a、12b、12c、12dとを有している。そして、モジュールシステムは、例えば、各モジュール100を並列実行し、所定の制御を実現する。
図8の接続関係の実線の矢印は、モジュール100間のデータフローを示し、破線の矢印は、ログ出力レベルLVの変化量(調整量)の伝播(伝播レベルDLの流れ)を示している。また、図8のデータ出力先モジュールの行とデータ出力元モジュールの列とによる表は、モジュール100間のデータ転送の有無(“0”は無し、符号Wは有り)を示している。さらに、符号W(Wad、Wba、Wca、Wdb、Wdc)は、データ出力先モジュール100のログ出力装置12からデータ出力元モジュール100のログ出力装置12に、ログ出力レベルLVの変化量を伝播する際の重みを示している。なお、図8の括弧内の数字(計算例ex1の値、計算例ex2の値)は、重みWの数値例を示している。
例えば、データ転送が発生するモジュール100間(依存関係の有るモジュール100間)では、ログ出力レベルLVの変化量は、データ転送量に比例した重みWにしたがって、伝播する。なお、データ転送が発生しないモジュール100間(依存関係の無いモジュール100間)では、ログ出力レベルLVの変化量は、伝播されない。
図8の例では、モジュール100aは、モジュール100dから受けたデータに応じて動作し、モジュール100b、100cにデータを出力する。このため、モジュール100aのログ出力装置12aは、伝播レベルDLadをモジュール100dのログ出力装置12dに出力する。伝播レベルDLadは、モジュール100aのログ出力レベルLVの変化量と重みWadとに基づいて算出される。
モジュール100bは、モジュール100aから受けたデータに応じて動作し、モジュール100dにデータを出力する。このため、モジュール100bのログ出力装置12bは、伝播レベルDLbaをログ出力装置12aに出力する。伝播レベルDLbaは、モジュール100bのログ出力レベルLVの変化量と重みWbaとに基づいて算出される。
モジュール100cは、モジュール100aから受けたデータに応じて動作し、モジュール100dにデータを出力する。このため、モジュール100cのログ出力装置12cは、伝播レベルDLcaをログ出力装置12aに出力する。伝播レベルDLcaは、モジュール100cのログ出力レベルLVの変化量と重みWcaとに基づいて算出される。
モジュール100dは、モジュール100b、100cから受けたデータに応じて動作し、モジュール100aにデータを出力する。このため、モジュール100dのログ出力装置12dは、伝播レベルDLdb、DLdcをログ出力装置12b、12cにそれぞれ出力する。伝播レベルDLdbは、モジュール100dのログ出力レベルLVの変化量と重みWdbとに基づいて算出される。そして、伝播レベルDLdcは、モジュール100dのログ出力レベルLVの変化量と重みWdcとに基づいて算出される。
ここで、重みWは、例えば、重みWを均等に割り当てる方法では、データ転送の有無によって決定され、互いに同じ値(例えば、“1”)に設定される。なお、重みWは、モジュール100間の依存度に基づいて設定されてもよい。例えば、1つのモジュール100dが2つのモジュール100b、100cと依存関係にあるとき、依存度の高いモジュール100cの方が依存度の低いモジュール100bに比べて、モジュール100dに与える影響が大きい。このため、モジュール100間の依存度に基づく重みWを設定することにより、ログ出力レベルLVの変化量の伝播先のログ出力レベルLVを、適切に補正できる。
モジュール100間の依存度に基づく重みWとして、例えば、データ転送量に比例した重みWが設定される。例えば、データ量当たりの依存度が各モジュール100でほぼ同じとき、多量のデータを送信しているモジュール100の方が少量のデータを送信しているモジュール100に比べて、データを受信するモジュール100に与える影響が大きい。このため、データ転送量に比例した重みWを設定することにより、ログ出力レベルLVの変化量の伝播先のログ出力レベルLVを、適切に補正できる。
データ転送量に比例した重みWを設定する方法では、過去のログデータや実験データ等からデータ転送量の平均値を計算し、重みWを計算する。データ転送量は、例えば、単位時間当たりにモジュール100間を伝播するデータ量により算出される。図8の計算例ex1の重み値は、全てのモジュール100対のうちの最大値のデータ転送量を基準に正規化したときの一例を示している。
この計算方法では、先ず、単位時間にモジュール100間を伝播するデータ量(送受信されるデータのサイズまたはデータ伝達頻度)をモジュール100対ごとに計算する。次に、全てのモジュール100間のデータ転送量から、最大値のデータ転送量を検出する。そして、各モジュール100間のデータ転送量を、検出した最大値のデータ転送量で割って正規化する。例えば、図8において、モジュール100dからモジュール100aに転送されるデータ量が最大のとき、モジュール100dからモジュール100a間のデータ転送量(最大値)で、各モジュール100間のデータ転送量を割って正規化する。
モジュール100d、100a間のデータ転送量、モジュール100a、100b間のデータ転送量、モジュール100a、100c間のデータ転送量、モジュール100b、100d間のデータ転送量、モジュール100c、100d間のデータ転送量の比が、10:7:4:2:8のときには、重みWは、図8の計算例ex1に示した値になる。すなわち、重みWad、Wba、Wca、Wdb、Wdcは、それぞれ1.0、0.7、0.4、0.2、0.8である。
また、図8の計算例ex2の重み値は、計算例ex1の重み値の計算方法とは別の計算方法で重みWを計算したときの一例を示している。この計算方法でも、先ず、単位時間にモジュール100間を伝播するデータ量をモジュール100対ごとに計算する。そして、各モジュール100について、入力データ量に対する出力元の各モジュール100からのデータ量の割合を計算する。例えば、図8では、モジュール100dは、入力データをモジュール100b、100cから受ける。したがって。モジュール100dの入力データ量に対するモジュール100b、100cからのデータ量の割合を計算する。
すなわち、入力データの全データ量を1としたときの各入力モジュール100からの入力データ量の割合を計算する。例えば、モジュール100bからモジュール100dに転送されるデータ量とモジュール100cからモジュール100dに転送されるデータ量の比が1:4のとき、モジュール100bからモジュール100dに入力されるデータ量の割合は0.2である。また、モジュール100cからモジュール100dに入力されるデータ量の割合は0.8である。
図8の計算例ex2の値は、この方法で計算した重みWの一例を示している。例えば、重みWad、Wba、Wcaは、各モジュール100a、100b、100cが1つのモジュール100のみからデータを受けているため、1.0である。また、重みWdb、Wdcは、モジュール100b、100d間のデータ転送量とモジュール100c、100d間のデータ転送量の比が1:4のとき、それぞれ0.2、0.8である。なお、重みWの計算方法は、この例に限定されない。
図8の例では、ログ出力レベルLVの変化量は、1つ前のモジュール100のログ出力装置12まで伝播される。ログ出力レベルLVの変化量を伝播させる段数を1つにすることにより、ログ出力レベルLVの更新制御を簡易にできる。なお、ログ出力レベルLVの変化量は、2つ以上前のモジュール100のログ出力装置12まで伝播されてもよい。このときには、ログ出力装置12は、伝播の度合いを、伝播させる段数の増加に伴い減衰させる。また、モジュール100のデータの伝播がループになっているときには、ログ出力装置12は、ログ出力レベルLVの変化量の伝播を1周目で止める。
図9は、図7に示したログ出力装置12の動作の一例を示している。図9の動作は、ハードウエアをソフトウエアにより制御することにより実現される。例えば、ログ出力プログラム等のソフトウエアは、コンピュータに図9の動作を実行させる。例えば、ログ出力装置12の動作を制御するログ出力プログラムの起動により、処理S300が実施される。なお、図9の動作は、ハードウエアのみで実現されてもよい。
処理S300、S320−S360は、ログ出力装置12で実施され、処理S310は、モジュール100で実施される。したがって、処理S300−S360の一連の処理は、例えば、モジュール100とログ出力装置12とが組み込まれるシステム(コンピュータ)により実施される。なお、図9では、ログ出力レベルLVの更新を中心に説明する。
処理S300では、ログ出力装置12(例えば、レベル変更部32)は、各モジュール100のログ出力レベルLV、伝播レベルDLs、DLrを初期化する。例えば、ログ出力レベルLVは、予め設定された初期値(例えば、図2に示した状態値“3”)に設定される。また、伝播レベルDLs、DLrは、例えば、“0”に初期化される。なお、伝播レベルDLsは、ログ出力装置12が出力する伝播レベルDLである。また、伝播レベルDLrは、ログ出力装置12が受ける伝播レベルDLに対応している。
処理S310では、モジュール100の動作を制御する対象プログラムが実行される。これにより、モジュール100は、動作状況に応じたログLGを発生する。
処理S320では、ログ出力装置12は、ログ発生頻度FQに基づくログ出力レベルLVを算出する。例えば、ログ出力装置12は、図6に示した処理S120−S170aを実施することにより、ログ発生頻度FQに基づくログ出力レベルLVを算出する。なお、図6に示した処理S160の判定結果がNoのとき、ログ出力装置12の動作は、処理S330に移る。また、処理S320では、ログ出力装置12は、ログ出力レベルLV以上のログレベルのログLGを出力する処理(図6に示した処理S130)も実施する。
処理S330では、各ログ出力装置12は、ログ出力レベルLVの変化量DLV(調整量)の伝播先の全てのログ出力装置12の伝播レベルDLsを算出する。例えば、レベル変更部32は、ログ発生頻度FQに基づくログ出力レベルLVの変化量DLVと重みWとを乗算し、乗算結果を伝播レベルDLsとして算出する。ログ出力レベルLVの変化量DLVは、例えば、処理S320実施後のログ出力レベルLVから処理S320実施前のログ出力レベルLVを引いた値である。したがって、変化量DLVは、ログ出力レベルLVが増加(レベルアップ)したときは、正の値であり、ログ出力レベルLVが減少(レベルダウン)したときは、負の値である。
処理S340では、ログ出力装置12は、処理S330で算出した伝播レベルDLsを、ログ出力レベルLVの変化量DLVの伝播先のログ出力装置12に送信する。すなわち、ログ出力装置12は、ログ出力レベルLVの変化量DLVの伝播元のログ出力装置12から、伝播レベルDLrを受ける。
処理S350では、レベル変更部32は、処理S320で算出したログ出力レベルLV(ログ発生頻度FQに基づくログ出力レベルLV)を、処理S340で受信した伝播レベルDLrを用いて補正する。図9のログ出力レベルLVfqは、処理S320で算出したログ出力レベルLV(補正前のログ出力レベルLV)を示している。
例えば、レベル変更部32は、処理S320で算出したログ出力レベルLVfqに処理S340で受信した伝播レベルDLrを加算する。ログ出力レベルLVfqと伝播レベルDLrとの加算結果は、補正後のログ出力レベルLVである。なお、レベル変更部32は、複数の伝播レベルDLrを受けたとき、全ての伝播レベルDLrをログ出力レベルLVfqに加算する。なお、例えば、ログ出力レベルLVfqと伝播レベルDLrとの加算結果がログレベルで定義されていない値(例えば、整数以外)のとき、レベル変更部32は、加算結果に最も近いログレベルを、ログ出力レベルLVとして算出する。
処理S360では、ログ出力装置12は、対象プログラム(モジュール100の動作)が終了したか否かを判定する。対象プログラムが終了していないとき(処理S360のNo)、ログ出力装置12の動作は、処理S310に移る。一方、対象プログラムが終了しているとき(処理S360のYes)、ログ出力装置12は、一連の処理を終了する。
このように、レベル変更部32は、ログ発生頻度FQに基づいて算出したログ出力レベルLVを、データを送信するモジュール100とデータを受信するモジュール100との間の依存関係に基づいて、補正する。例えば、図8のモジュール100aのログ出力レベルLVが“LVa”から“LVa+DLVa”に遷移したとき、モジュール100aにデータを送信するモジュール100dのログ出力レベルLVを“LVd”から“LVd+Wad・DLVa”に遷移させる。
この実施形態では、レベル変更部32は、データを受信したモジュール100のログ出力レベルLVの変化量DLV(調整量)に基づいて、データを送信したモジュール100のログ出力レベルLVを補正する。これにより、この実施形態では、例えば、異常データの受信によりモジュール100のログ出力レベルLVがレベルダウンしたとき、異常データを送信したモジュール100のログ出力レベルLVもレベルダウンさせることができる。この結果、問題の原因特定に必要な情報(ログLG)を増加させることができる。
なお、ログ出力装置12の動作は、この例に限定されない。例えば、モジュール100とログ出力装置12とが組み込まれるシステム(コンピュータ)は、対象プログラムの実行(処理S310)とログ出力レベルLVの調整および補正等の処理(S320−S350)とを互いに異なるスレッドで実施してもよい。すなわち、ログ出力装置12等は、図4および図5に示した動作に基づいて、処理S310、S320を実施してもよい。このときには、例えば、図4および図5の処理S150、S170の代わりに、図6の処理S150a、S170aが実施される。
図10は、図7に示したログ出力装置12が組み込まれるシステムSYSの一例を示している。図10の実線の矢印は、モジュール100間のデータフローを示し、破線の矢印は、ログ出力レベルLVの変化量(調整量)の伝播(伝播レベルDLの流れ)を示している。なお、図10では、図を見やすくするために、モジュール100およびログ出力装置12をセンサ200のみに記載している。例えば、ロボット制御部210等もモジュール100およびログ出力装置12を有している。
システムSYSは、センサ200、ロボット制御部210および位置推定部220、経路計画部230を有している。システムSYSは、センサ200、ロボット制御部210、位置推定部220および経路計画部230を並列実行し、ロボットを自律移動させる。
センサ200は、カメラ等のセンサであり、画像情報等のセンサデータSDATAを位置推定部220に出力する。ロボット制御部210は、例えば、角速度等の指示を示す速度データVDATAを経路計画部230から受け、速度データVDATAに基づいて車輪等を制御する。そして、ロボット制御部210は、車輪の回転数等から計算したオドメトリデータODATAを、位置推定部220に出力する。
位置推定部220は、センサ200から受けたセンサデータSDATAおよびロボット制御部210から受けたオドメトリデータODATAに基づいて、自己の位置や姿勢等を推定する。そして、位置推定部220は、自己の位置等を示す位置データPDATAを経路計画部230に出力する。経路計画部230は、位置推定部220から受けた位置データPDATAに基づいて、局所経路の計画を立てる。そして、経路計画部230は、局所経路計画に基づく速度データVDATAを、ロボット制御部210に出力する。
システムSYSでは、例えば、位置推定部220のログ出力レベルLVの変化は、ロボット制御部210およびセンサ200のログ出力レベルLVに反映される。例えば、ロボット制御部210から異常なデータODATAを受けた位置推定部220が異常終了したとき、異常終了等の原因を特定するためには、ロボット制御部210の情報(ログLG)も必要である。
このときにも、この実施形態では、ロボット制御部210のログ出力レベルLVが位置推定部220のログ出力レベルLVの変化量に応じて補正されるため、ロボット制御部210から多くの情報(詳細なログLG)を得ることができる。なお、反映の度合い(伝播レベルDL)は、ロボット制御部210およびセンサ200で互いに同じ値でもよいし、データODATA、SDATAのデータ量の割合に応じた値でもよい。
以上、この実施形態においても、上述した実施形態と同様の効果を得ることができる。さらに、この実施形態では、ログ出力装置12は、モジュール100間の依存関係に応じて、各モジュール100のログ出力レベルLVの変化量DLVを、そのモジュール100の前段のモジュール100のログ出力レベルLVに反映する。これにより、この実施形態では、モジュール100の異常終了等の原因を、データ出力元のモジュール100まで戻って調査するときにも、問題の原因特定に必要な情報(ログLG)を与えることができる。
以上の実施形態において説明した発明を整理して、付記として開示する。
(付記1)
監視対象のモジュールで生成されるログの発生頻度を計算する頻度検出部と、
ログ出力の基準となるログ出力レベルを、前記発生頻度に基づいて調整するレベル変更部と、
前記ログ出力レベル以上の重要度の前記ログを出力するログ出力部と
を備えていることを特徴とするログ出力装置。
(付記2)
前記モジュールが複数のとき、前記レベル変更部は、前記発生頻度に基づいて調整した前記ログ出力レベルを、前記モジュール間の依存関係に応じて補正すること
を特徴とする付記1記載のログ出力装置。
(付記3)
前記モジュール間の依存関係は、データを送信する前記モジュールと前記データを受信する前記モジュールとの間の依存関係であり、
前記レベル変更部は、前記データを受信した前記モジュールの前記ログ出力レベルの調整量に基づいて、前記データを送信した前記モジュールの前記ログ出力レベルを補正すること
を特徴とする付記2記載のログ出力装置。
(付記4)
前記レベル変更部は、前記ログ出力レベルの補正量を、前記モジュール間の依存度に基づいて重み付けすること
を特徴とする付記2または付記3記載のログ出力装置。
(付記5)
コンピュータによって実行されるログ出力方法であって、
監視対象のモジュールで生成されるログの発生頻度を計算し、
ログ出力の基準となるログ出力レベルを、前記発生頻度に基づいて調整し、
前記ログ出力レベル以上の重要度の前記ログを出力すること
を特徴とするログ出力方法。
(付記6)
前記モジュールが複数のとき、前記発生頻度に基づいて調整した前記ログ出力レベルを、前記モジュール間の依存関係に応じて補正すること
を特徴とする付記5記載のログ出力方法。
(付記7)
前記モジュール間の依存関係は、データを送信する前記モジュールと前記データを受信する前記モジュールとの間の依存関係であり、
前記データを受信した前記モジュールの前記ログ出力レベルの調整量に基づいて、前記データを送信した前記モジュールの前記ログ出力レベルを補正すること
を特徴とする付記6記載のログ出力方法。
(付記8)
前記ログ出力レベルの補正量を、前記モジュール間の依存度に基づいて重み付けすること
を特徴とする付記6または付記7記載のログ出力方法。
(付記9)
コンピュータに実行させるログ出力プログラムであって、
前記コンピュータを付記1ないし付記4のいずれか1項に記載のログ出力装置として動作させるログ出力プログラム。
(付記10)
監視対象のモジュールで生成されるログの発生頻度を計算する頻度検出処理と、
ログ出力の基準となるログ出力レベルを、前記発生頻度に基づいて調整するレベル変更処理と、
前記ログ出力レベル以上の重要度の前記ログを出力するログ出力処理と
をコンピュータに実行させることを特徴とするログ出力プログラム。
(付記11)
前記モジュールが複数のとき、前記発生頻度に基づいて調整した前記ログ出力レベルを、前記モジュール間の依存関係に応じて補正すること
を特徴とする付記10記載のログ出力プログラム。
(付記12)
前記モジュール間の依存関係は、データを送信する前記モジュールと前記データを受信する前記モジュールとの間の依存関係であり、
前記データを受信した前記モジュールの前記ログ出力レベルの調整量に基づいて、前記データを送信した前記モジュールの前記ログ出力レベルを補正すること
を特徴とする付記11記載のログ出力プログラム。
(付記13)
前記ログ出力レベルの補正量を、前記モジュール間の依存度に基づいて重み付けすること
を特徴とする付記11または付記12記載のログ出力プログラム。
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずであり、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。