イベント・ログに任意の文字列を出力する:Tech TIPS
バッチ・ファイルやWSHを使って作成したタスクから、Windows OS標準のイベント・ログへ出力することにより、タスクの実行結果やエラーなどを統一的に管理することができる。WSHでイベント・ログへ出力するためには、WshShellオブジェクトのLogEventメソッドを利用する。コマンドラインで出力するにはEventcreateやLogEventコマンドを利用する。
対象OS:Windows 2000/Windows XP/Windows Server 2003
解説
Windowsマシン上で定期的に実施するシステム管理上のタスクは、可能な限りバッチ・ファイルやWSHを利用して自動化したい。また自動化を行うならば、動作の確認や障害発生に備えて、処理結果をログに出力したり、メールで送ったりしたい。
自前でログを作成するのはさほど難しい話ではない。だがログ・ファイルを格納する場所や書式が統一されていないと、事後確認が行いづらくなってしまう。
本TIPSでは、ログとして残したい内容をコマンドラインからイベント・ログに出力する方法をいくつか紹介する。Windows OSの標準機能であるイベント・ログに出力することにより、管理が容易になるというメリットがある。
操作方法
●イベント・ログに書き込む方法
イベント・ログにユーザーがイベントを書き込む方法としては、次のような手段が利用できる。
- WSH(Windows Script Host)
- Eventcreateコマンド
- LogEventコマンド
- EventLogger(elogger.exe)コマンド
●WSHを利用する方法
WSHを利用する方法は、既存のOS環境に対してアプリケーションを追加でインストールする必要がないので、最も広く利用できる方法だと思われる。WSHはWindows 2000以降のOSで利用可能だ。
次のサンプルを見てほしい。VBScriptで記述したコードである。
Const EVENT_SUCCESS = 0
Set objShell = Wscript.CreateObject("Wscript.Shell")
objShell.LogEvent EVENT_SUCCESS, "バックアップは正常に終了しました。", "\\<コンピュータ名>"
※この3行の内容を、例えばwsheventtest.vbsというファイル名で保存して、実行すること。
これを実行すると、次のようなイベント・ログが書き込まれる。
書き込まれたイベント・ログ
WSHから書き込んだイベント・ログの内容を表示させたところ。情報の種類は「なし」となっているが、イベント・ビューアの一覧では「情報」と表示される。
(1)書き込んだプログラム。
(2)種類として「0」を指定しているので、「なし」となっている。
(3)書き込まれたテキスト。タスク処理の最初や最後でこのようなメッセージを記録することにより、正常に動作しているかどうかを容易に確認することができる。
ここではWscript.Shell(WshShell)オブジェクトの持つLogEventメソッドを使って、アプリケーション・ログに「WSH」をソースとして「情報」のエントリを書き込んでいる。
このLogEventメソッドを用いる場合、次の書式に従ってメッセージを構成する必要がある。「\\<コンピュータ名>」はリモート・コンピュータのログに書き込む際に指定するものであり、スクリプトを実行するローカルのコンピュータ上のログに書き込む場合は省略可能だ。
object.LogEvent(イベントの種類, メッセージ内容, \\<コンピュータ名>)
イベントの種類は次の表に示すように、2進数で表記される。スクリプトの最初のパートで定数として宣言しておくとよいだろう。
種類 | 意味 |
---|---|
0 | 成功 |
1 | エラー |
2 | 警告 |
4 | 情報 |
8 | 成功の監査 |
16 | 失敗の監査 |
イベントの種類 イベント・ログに書き込まれる種類。種類を「0」と指定すると、イベント・ビューアでは4と同じく「情報」として表示される。 |
WSHを使ったイベント・ログへの出力方法の詳細については、右の関連記事中にあるTIPSや連載WSH入門などを参照していただきたい。
●Eventcreateコマンドを利用する方法
Windows XP/Windows Server 2003ではeventcreate.exeというコマンドを利用してイベント・ログへエントリを追加することができる。
例えば、次のような構文で書き込む内容を記述する。詳細はeventcreate /?で表示されるヘルプなどを参照のこと。
eventcreate /ID 100 /L system /SO Cmd /T Information /D "テストメッセージ"
ここでは「イベントID」「書き込みを行うログ」「ソース」「種類」「メッセージ内容」を指定している。
●LogEventを利用する方法
logevent.exeは、Windows NT 4.0およびWindows 2000のリソース・キットに収録されているツールである。コマンドラインからイベント・ログへエントリを追加することができる。
利用可能なオプションは、引数を付けずに入力すればヘルプが表示されるので、参照のこと。例えば次のように利用する。
logevent -s W -r test -c 5 -e 2 "テストイベント"
-sオプションはイベントの種類、-rはソース、-cは分類、-eは指定したいイベントIDを示す。なお-cオプションで利用可能な分類には次の7つがあるようだ。
分類 | 意味 |
---|---|
1 | デバイス |
2 | ディスク |
3 | プリンタ |
4 | サービス |
5 | シェル |
6 | システム イベント |
7 | ネットワーク |
logeventの分類コード |
●Eventloggerを利用する方法
Eventlogger(実行ファイル名はeLogger.exe)は、でんか氏が作成・公開しているツールである。
このツールは、GUI画面とコマンドラインの両方で利用できる。パラメータを何も付けずに起動すると、GUI画面が表示される。
Eventloggerの実行画面
イベント・ログに内容を書き込むツール。出力先はアプリケーション・ログのみのようである。
(1)イベントのID番号。任意に定義可能。
(2)アプリケーション名。タスクの名称などをセットしておく。
(3)イベントのタイプ。情報や警告、エラーなどが選択できる。
(4)イベントの説明に書き込まれる文字列。
(5)これをクリックするとログに書き込まれる。
(6)コマンドラインで利用する場合は、このようにオプションをセットすればよい。パラメータなしで起動するとこのダイアログが表示され、インタラクティブに利用できる。
オプションを指定すると、コマンドラインからイベント・ログに書き込むことができる。-tオプションでは、次のものを指定可能だ。1〜4以外の数字を指定した場合は「情報」のログが書き込まれることになる。
種類 | 意味 |
---|---|
1 | 警告 |
2 | エラー |
3 | 成功の監査 |
4 | 失敗の監査 |
Eventloggerで指定できるイベントの種類 |
●イベント・ログにメッセージを書き込む際の制限事項
ここでは、イベント・ログへの書き込みに関する制限事項についてまとめておく。
■書き込み先ログの種類
仕様上の制限として、セキュリティ・ログに書き込むことはできない。書き込めるのは「システム(System)」と「アプリケーション(Application)」ログのみである。詳しくはxcorp 氏の試行錯誤の結果である次の資料を参照していただきたい。
■1つのエントリに書き込めるサイズの制限
以下の「EventLog.WriteEntryメソッド」の解説(例外部分を参照)によると、それぞれのエントリのメッセージ部分は最大で16Kbytes(16384bytes)に制限されるようである。1つのエントリで書き込む内容はこのサイズを超えないように気を付けること。
■使用する文字列の制限
メッセージ中には“%数字”という文字列を含めないこと。これはOSがイベント・ログにエントリを作る際の処理ロジックに問題があり、メッセージ処理のループが発生するからである。手元で確認したところ、このような文字列を含めると、100回ほどのメッセージの繰り返しが見られた。
■「説明」に現れる、ソースとメッセージ・リソース・ファイルの組が登録されていないというエラーメッセージ
一般的には、ソースとそのソースに応じたメッセージ・リソースを格納したDLLの組がレジストリに登録されていないと、次の画面のようなエラー・メッセージが冒頭に表示される。
メッセージ・リソースが登録されていない場合のエラー
ソースとメッセージ・リソースがレジストリに登録されていないと、メッセージの冒頭部分にこのような“うるさい”エラーが書き込まれてしまう。このエラーを解消するには、上に紹介した中の方法ではWSHの利用を推奨する。Windows XP/Windows Server 2003ならば、OS標準のeventcreate.exeコマンドを用いてもよい。
(1)イベントID。ユーザーが指定したIDが書き込まれている。
(2)リソースが見つからないというメッセージ。
(3)ユーザーが指定したメッセージ。この部分が本来のメッセージ。
このメッセージは無視してよいものだが、気になるのであれば、次の情報を参考にしてメッセージ・リソースをDLLに格納し、ソースを登録すればよいだろう。なお、LogeventとEventloggerでは、別途メッセージ・リソースを登録してもこのメッセージが消えなかったことを追記しておく。
以上のように、イベント・ログにメッセージを書き込むのはさほど難しいことではなく、スクリプトやバッチ・ファイルから手軽に利用できることがお分かりいただけたことと思う。バッチ・ファイルやスクリプトを作成したり、既存のものの手直しを行う際、ぜひともログ出力をどうするかという点も検討してほしい。
■この記事と関連性の高い別の記事
- WSHコードで発生したエラー情報をイベント・ログに記録する(TIPS)
- イベント・ログをトリガーにしてメールを送信する(基本編)(TIPS)
- コマンド・プロンプトでイベント・ログを表示する(TIPS)
- イベント・ログ・ファイルの最大サイズを拡大する(TIPS)
- PowerShellでイベント・ログの内容を参照する(TIPS)
Copyright© Digital Advantage Corp. All Rights Reserved.