ログ
まれに、特に問題の診断を行うために、クライアントやサーバのログが必要になることがあります。サーバは、エラー・グローバル内にすべてのエラー・トラップも記録します。
クライアントでのログ
一般に次の 2 つの方法で、クライアントでログを有効にできます。
-
VisM.ocx の LogMask プロパティを設定する。このプロパティは、レジストリ設定をすべてオーバーライドします。
-
レジストリ・スイッチを設定する。レジストリ設定は、プロパティが設定されていない場合の既定値の役割を果たします。レジストリ・スイッチにより、どのクライアント・プロセスでログを作成するかを正確に制御することができます。具体的に言うと、これらのスイッチは、HKEY_CURRENT_USER ハイブ、または HKEY_LOCAL_MACHINE ハイブに常駐可能で、特定のユーザ、またはアプリケーション・プログラム、もしくはこれらの組み合わせに対してのみ、ログが記録されるように変更できます。選択肢は最も具体的なものから最も一般的なものに向かって階層的に検索されるので、特定の目的のための具体的なスイッチにより、一般的なスイッチがオーバーライドされることがあります。
また、Caché Direct には、これらのレジストリ・エントリを設定、取得するためのルーチンが用意されているため、プログラムの制御下で簡単に操作できます。
VisM LogMask プロパティ
VisM.ocx の LogMask プロパティを直接設定できます。ログを有効にするには、このプロパティを 0x7FFFFFFF (C++ の場合)、または &H7FFFFFFF (Visual Basic の場合) に設定します。以下はその例です。
VisM1.LogMask = Val(&H7FFFFFFF)
この 16 進数値に対応する 10 進数の整数は、2147483647 です。
ログを無効にするには、このプロパティを 0 に設定します。このプロパティは、レジストリ設定をすべてオーバーライドします。
レジストリ・スイッチ
クライアント・ログ・スイッチはレジストリ・キー値で、次の名前を持ちます。
-
LogMask はビット・マスクで、ログ記録を行うかどうかを表します。前のセクション "VisM LogMask プロパティ" で説明した LogMask プロパティと同じ値を取ります。
-
LogFolder は特定のフォルダにログ・ファイルを保存する場合に使用します。既定では、アプリケーションのメインの実行可能ファイルが保存されているフォルダに保存されます。値が指定されていない場合、または空の場合は、既定値が使用されます。 この章の後半にある "ログ・ファイルのサイズの制限" も参照してください。
スイッチは、hivename/Software/InterSystems/Cache キーの下にあります。ここで、hivename は次のどちらかです。
-
HKCU (HKEY_CURRENT_USER ハイブ)
-
HKLM (HKEY_LOCAL_MACHINE ハイブ)
また、指定されたアプリケーションを実行している特定のユーザの場合は、さらに 3 種類の値を使用できます。これらの値には、ユーザまたはアプリケーション名と基本値名を連結した名前が付けられます。例えば、ユーザ名が Joeで、アプリケーション名が MyApp.exe の場合、LogMaskJoeMyApp、LogMaskJoe、および LogMaskMyApp という 3 つの値も使用できます。これらの値はこの順にチェックされます。それぞれの値はまず、HKCU でチェックされ、次に HKLM でチェックされます。最初に見つかったものが使用されます。同様に、LogFolderJoeMyApp、LogFolderJoe、LogFolderMyApp という名前の値が使われることもあります。
レジストリ値の取得と設定
これらのレジストリ値を設定し、取得するために使用できるクライアント側ルーチンは 4 種類あります。これらのルーチンは、ISLog.dll ファイルに公開されています。これらの C シグニチャは次のとおりです。
DWORD GetRegLogMaskEx(LPCSTR pUsername, LPCSTR pAppname);
DWORD SetRegLogMaskEx(HKEY hiveKey,
LPCSTR pUsername,
LPCSTR pAppname,
DWORD dwMask);
int GetRegLogFolderEx(LPCSTR pUsername,
LPCSTR pAppname,
LPSTR buf,
int buflen);
void SetRegLogFolderEx(HKEY hiveKey,
LPCSTR pUsername,
LPCSTR pAppname,
LPSTR buf);
いずれの場合も、pUsername または pAppname が NULL または空の文字列である場合、これらの引数は使用されません。これらの引数が指定された場合、Get_ routines は適切な組み合わせを検索し、最初に見つかったものがあれば、それを返します。
例えば、GetRegLogMaskEx(NULL, “Joe”, NULL) を呼び出した場合に、最初に、HKCU と HKLM から LogMaskJoe が検索され、次に、HKCU と HKLM から LogMask が検索され、最初に見つかったものが返されます。何も見つからなかった場合は 0 が返されます。pUsername と pAppname の両方が指定されている場合、4 つの組み合わせがすべて、上記の順序で検索されます。
SetRegLogMaskEx および SetRegLogFolderEx ルーチンでは、HKCU または HKLM が最初の引数に指定されている場合、そのハイブが設定されます。ハイブが指定されていない場合、既定値の HKLM が設定されます。
SetRegLogMaskEx は現在設定しているキーに直前に設定されていた値を返します。
GetRegLogFolderEx は見つかったフォルダ名の長さを返します。見つからなかった場合は、0 を返します。
ログ・ファイルのサイズの制限
2 種類のクライアント側レジストリ設定 (LogSizeLimit) を使用して、ログ・ファイルが大きくなりすぎるのを防ぐことができます。スイッチは、HK/Software/InterSystems/Cache キーの下にあります。前述のとおり、HK は HKCU または HKLM のどちらかです。
この設定は、クライアントがログに書き込みしている間のログ・ファイルの最大サイズを表します。ログの大きさがこのサイズに達すると、クライアントは、新しいログ・ファイルへの書き込みを開始します。古いログ・ファイルが既にある場合、このファイルは破棄されるので、一度に 3 つ以上のログ・ファイルが存在することはありません。クライアントがシャットダウンされると、既存の 2 つのログ・ファイルは結合されます。結果として得られるログのサイズの上限は、LogSizeLimit の値の 2 倍で、この値を超えることはありません。
ログ・ファイルは、セッションに関する基本情報から始まり、その後に文字列 Snip というラベルの付いた区切り文字、ログに記録された最新のアクティビティが続きます。
サーバでのログ
サーバでのログを有効化すると、クライアントとサーバの間で送受信されたメッセージすべてを含め、スレーブ・サーバ・ジョブのサーバ部分で行われたアクティビティのトレースがログに記録されます。サーバでのログを有効化するには、ターミナルを使用して、以下のコマンドを入力します。
Set ^%CDLOG=1
ログを有効にした後に開始された新しい Caché Direct サーバ・ジョブは、通常、mgr ディレクトリに CDxxx.log という名前のテキスト形式のログ・ファイルを作成します。ここで、xxx には、このログの対象となるジョブの $Job が入ります。新しいジョブはそれぞれ、専用のログ・ファイルを持ちます。 スイッチがオンになったら、必要なテストを実行してください。
スイッチは、スレーブ・サーバ・ジョブが開始されたときにのみチェックされます。その後、スイッチを変更しても、既に実行されているジョブには影響はありません。したがって、ジョブの開始後、ログをオンまたはオフにすることはできません。
テストが終了したら (または、少なくとも開始されたときに)、空の文字列を設定するか、強制終了してスイッチをオフにします。
Kill ^%CDLOG
このスイッチはグローバルで、すべての新規ジョブに影響を与えます。また、このログは非常に大きくなる可能性があります。したがって、ログはできるだけ短時間で実行することをお勧めします。特にサーバがテスト専用ではない場合は、できるだけ短くしてください。クライアントからプロセスを自動化して、テスト自体が開始される直前にスイッチをオンにする Caché Direct ジョブ、およびテストの開始直後にスイッチをオフにするジョブを実行することができます。これをテスト自体の一部にして、スイッチを設定し、Server プロパティをリセットして再接続してから (これにより、新しいサーバ・ジョブが開始されます)、再接続後の最初のアクティビティとしてスイッチをオフにすることも可能です。例えば、クライアントが Visual Basic アプリケーションである場合、次のようなコードで始めることができます。
VisM1.Execute "Set ^%CDLOG=1"
; reset to the same value as before then start a new job
VisM1.Server = VisM1.Server
VisM1.Execute "Kill ^%CDLOG"
サーバ・エラー・グローバル
前述のサーバ・ログとは別に、サーバは、グローバル %CDServer("Error") に内部サーバ・エラー・ログを記録しています。これにはトラップされたエラーがすべて記録されます。
このログに “emergency brake” という行が含まれている場合、これはサーバにより、エラーの無限ループ (1 秒間に 5 回以上のエラー) が検出されたことを表しています。