ログ記録のガイドライン
イベント ログは、システムおよびシステム上で実行されているアプリケーションに代わって、重要なイベントの記録を保存します。 ログ記録機能は汎用的なものであるため、どの情報をログに記録するのが適切かを決定する必要があります。 一般的に、ハードウェアまたはソフトウェアの問題の診断に役立つ可能性のある情報のみをログに記録するようにしましょう。 イベント ログは、トレース ツールとして使用することを意図したものではありません。
ログに記録するイベントの選択
イベント ログが役立つケースの例を次に示します。
- リソースの問題。 メモリ割り当てが失敗したときに警告イベントをログに記録すると、メモリ不足の状態の原因を示すのに役立ちます。
- ハードウェアの問題。 デバイス ドライバーは、ディスク コントローラーのタイムアウト、パラレル ポートの電源障害、ネットワーク カードまたはシリアルカードからのデータ エラーを検出した場合、これらのイベントに関する情報をログに記録します。この情報は、システム管理者がハードウェアの問題を診断するのに役立てることができます。
- 不良セクター。 ディスク ドライバーが不良セクターを検出した場合、操作を再試行した後にセクターから読み取ったり、セクターに書き込んだりできることがありますが、最終的にはセクターは不良になります。 ディスク ドライバーが続行できる場合は、警告イベントがログに記録されるように、それ以外の場合は、エラー イベントがログに記録されるようにするとよいでしょう。 ファイル システム ドライバーが多数の不良セクターを検出して修復した場合、警告イベントがログに記録されるようにしておくと、管理者はディスクに障害が発生する可能性があると判断するのに役立つことがあります。
- イベントに関する情報。 サーバー アプリケーション (データベース サーバーなど) は、ユーザーのログオン、データベースのオープン、またはファイル転送の開始を記録します。 サーバーは、エラー (ファイルにアクセスできない、ホスト プロセスが切断されたなど)、データベースの破損、ファイル転送が成功したかどうかなど、他のイベントもログに記録できます。
メッセージの書き込み
メッセージは、問題のトラブルシューティングを試みる管理者やユーザーにとって意味のあるものになるようにしましょう。 メッセージには、問題の原因と修正方法を理解するために必要なすべての情報が含まれているようにしましょう。
「I/O サブシステムから受信したドライバー パケットは無効でした。 データはそのパケットです。」のような難解なメッセージは避けてください。問題のドライバーは正常に機能しているものの、不正な形式のパケットをログに記録していることを示すのが、良いメッセージです。 問題を修正するには、ドライバーの Unicode バージョンが必要であると続けることができます。 良いエラー メッセージの書き方の詳細については、「エラー メッセージのガイドライン」を参照してください。
メッセージ テキストにタブやコンマを使用しないでください。イベント ログはコンマまたはタブ区切りのテキスト ファイルとして保存されることがあるためです。 多くの組織がこれらのファイルをデータベースにインポートするため、余分な書式文字は手動での操作が必要になります。
UNC 名や、スペースを含む他のリンクを使用する場合は、名前を山かっこで囲んでください。 たとえば、<\\sharename\servername> とします。 ユーザーを関連するヘルプ資料に誘導する URL をメッセージの末尾に書くことができます。 URL は完全修飾 DNS ホスト名にする必要があります。 たとえば、メッセージに「このメッセージの詳細については、サポート サイト https://www.microsoft.com/Support/ProdRedirect/ContentSearch.asp
を参照してください。」のようなテキストを追加できます。このリンクは、ユーザーをエラー メッセージに関連するコンテンツにリダイレクトする ASP ページに誘導します。 また、追加のパラメーター ((URL がクリックされたときに渡される) を解析して、ユーザーをどこにリダイレクトするかを決定します。
ReportEvent 関数に渡された引数は、次のように URL に追加されます。
strHTTPQuery += L"?EvtSrc=" + _strEscapedSource;
strHTTPQuery += L"&EvtCat=" + _strEscapedCategory;
strHTTPQuery += L"&EvtID=" + _strEscapedEventID;
strHTTPQuery += L"&EvtCatID=" + _strEscapedCategoryID;
strHTTPQuery += L"&EvtType=" + _strEscapedType;
strHTTPQuery += L"&EvtTypeID=" + _strEscapedTypeID;
strHTTPQuery += L"&EvtRptTime=" + _strEscapedDateAndTime;
strHTTPQuery += L"&EvtTZBias=" + _strEscapedTimeZoneBias;
イベント ソースのメッセージ DLL ヘッダーの会社名、製品名、製品バージョン、ファイル名、ファイル バージョンが有効な場合は、それらも URL に追加されます。
ADD_VER_STR(L"CoName", _strEscapedCompanyName);
ADD_VER_STR(L"ProdName", _strEscapedProductName);
ADD_VER_STR(L"ProdVer", _strEscapedProductVersion);
ADD_VER_STR(L"FileName", _strEscapedFileName);
ADD_VER_STR(L"FileVer", _strEscapedFileVersion);
オーバーヘッドの軽減
イベント ログはディスク容量やプロセッサ時間などのリソースを消費します。 イベント ログに必要なディスク容量と、イベントをログに記録するアプリケーションのオーバーヘッドは、ログに記録する情報の量によって異なります。 このため、必要な情報のみをログに記録することが重要です。 また、イベント ログ記録の呼び出しは、メインのコード パスではなくコード内のエラー パスに記述することをお勧めします。これによりパフォーマンスの低下を防ぐことができます。
各イベント ログ レコードに必要なディスク容量には、EVENTLOGRECORD 構造体のすべてのメンバーのサイズが含まれます。 これは可変長の構造体であり、文字列とバイナリ データは構造体の後に保存されます。