2005年08月16日

Windowsのイベントログを書き込む方法

Windowsで24時間365日稼動を保証する
ミッションクリティカルな
アプリケーションを作成する場合などに、
アプリケーションで発生する警告や致命的エラーを、
管理者がすばやく検出し対処できる様に、
適切なソリューションを提供する必要があります。

Windowsのサービスやアプリケーションが出力する
システムエラー、セキュリティ警告、アプリケーションエラーなどは、
主にイベントログに出力される仕組みが出来ています。
しかし、随時発生するイベントを、
「イベントビューア」で確認していては、
管理者の負荷はとても高く、
現実的な運用管理とほど遠いものとなります。

世の中には、Windowsのイベントログにフィルタリングを行い、
必要な情報を管理者へメールで通知するツールや、
Windows XP/Windows Server 2003から
提供された「eventtriggers」コマンドを利用し、
必要なイベントを必要なタイミングで抽出し、
任意のスクリプトを実行できる
便利な運用管理ツール類が存在します。
フィルタリングし通知するツールは別途紹介するとして、

今回は、アプリケーションで、
Windowsイベントログの利用を検討されているあなたに、
WindowsAPI関数の「ReportEvent」を
利用した具体的なソリューションを、
Delphiのサンプルプログラムで紹介します。

サンプルプログラム実行前に
以下の手順を実行してください。


@
EventLog.mcファイルをコンパイルしEventLog.rcを作成する。
MC.EXE EventLog.mc
A
EventLog.rcファイルをコンパイルしEventLog.resを作成する。
BRCC32.EXE -32 EventLog.rc
B
EventLog.resファイルをEventLogTesterUnit.pasに登録する。
{$R EventLog.RES}
C
レジストリにEventLogTesterのエントリを作成する。
・HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
 Services\EventLog\Applicationキー配下に
 「EventLogTester」キーを作成する。
・HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
 Services\EventLog\Application\EventLogTesterキー配下に
 名前=EventMessageFile,種類=REG_SZ,
 データ=<EventLogTester.exeのフルパス>を作成する。
・HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
 Services\EventLog\Application\EventLogTesterキー配下に
 名前=TypesSupported,種類=REG_DWORD,
 データ=0x00000007を作成する。

全ソースは【続きを読む】をクリック!

使用例
procedure TForm1.btnReportEventClick(Sender: TObject);
const
 // イベント識別子
 EVENTID_INFOMATION = $400003E9;
 EVENTID_WARNING = $800003EA;
 EVENTID_ERROR = $C00003EB;
var
 lHdl: THandle;
 lMsg: String;
 lType,
 lEventID: Integer;
begin
 // イベントログのハンドルを取得する
 lHdl := RegisterEventSource(Nil, PChar('EventLogTester'));
 // ログに書込むイベントの種類を決定する
 case rgEventType.ItemIndex of
 0: // Information
  begin
   lType := EVENTLOG_INFORMATION_TYPE;
   lEventID := EVENTID_INFOMATION;
  end;
 1: // Warning
  begin
   lType := EVENTLOG_WARNING_TYPE;
   lEventID := EVENTID_WARNING;
  end;
 2: // Error
  begin
   lType := EVENTLOG_ERROR_TYPE;
   lEventID := EVENTID_ERROR;
  end;
 end;
 // メッセージをイベントログへ書込む
 lMsg := Format('%s', [edtEventMessage.Text]);
 ReportEvent(
  // イベントログのハンドル,
  // ログに書込むイベントの種類,
  // イベントの分類,
  // イベント識別子,
  // ユーザーセキュリティ識別子(省略可能),
  // メッセージにマージする文字列の数,
  // バイナリデータのサイズ(バイト数),
  // メッセージにマージする文字列の配列,
  // バイナリデータのアドレス

  lHdl,
  lType,
  StrToIntDef(edtEventCategory.Text,0),
  lEventID,
  Nil,
  1,
  0,
  @lMsg,
  Nil
 );
 // イベントログのハンドルを閉じる
 DeregisterEventSource(lHdl);
end;


【画面イメージ】

EventLogTester.gif

関連書籍


Copyright guy@かしらもんじ でぇ〜

続きを読む
posted by guy at 21:21 | 運用管理編

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。