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