2008年9月9日火曜日

イベントログを詳細付きでCSVに出力、ツール追加なし@WindowsServer

イベントログをゆっくり見ようと思ったら、CSV→Excelとかにしたくなる。
しかし標準のイベントビュアー付属のファイル出力機能を使っても、スカスカなものが出来上がる。はっきり言って使い物にならない。
こんなときLogParserがやっぱり便利なんだけど、入れてないサーバもある。
人様のサーバだったりすると勝手に入れるのはアカンし、よい場合でもLogParser落として入れてパス通して… といちいちやるのも結構面倒、急いでいるときはなおさら。
 
 

ってことで、"eventquery.vbs":リンク/TechNet の使い方をメモ。
あまり使わないのでいつも使い方を忘れて何度も日時で引っかかる。このツールでは「年/月/日」ではなくて「月/日/年」で指定するんだぞ自分よ。あと一日の始まりは「12:00AM」だからよろしく。
 
 

?オプションで起動してヘルプを出す
>cscript %systemroot%\system32\eventquery.vbs /?

Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.


EVENTQUERY.vbs [/S システム [/U ユーザー名 [/P パスワード]]] [/V] [/FI フィルタ]
[/FO 形式] [/R 範囲] [/NH] [/L ログ名 | *]

説明:
EVENTQUERY.vbs スクリプトにより、管理者は 1 つ以上のイベント
ログ中のイベントとイベントのプロパティを一覧表示できます。

パラメータ一覧:
/S サーバー 接続先のサーバーを指定します。

/U [ドメイン\]ユーザー コマンドが実行されるユーザー
のコンテキストを指定します。

/P パスワード 指定のユーザー コンテキストの
パスワードを指定します。

/V 詳細情報を表示します。出力時に詳細情報を
画面に表示するように指定します。


/FI フィルタ クエリによりフィルタして取り込むまたは
除外するイベントの種類を指定します。

/FO 形式 出力を表示する形式を指定します。
有効な形式は "TABLE"、"LIST" および
"CSV" です。

/R 範囲 一覧表示するイベントの範囲を指定します。
有効な値:
'N' - 最近の N 個のイベントを一覧表示します。
'-N' - 最古の N 個のイベントを一覧表示します。
'N1-N2' - N1 から N2 のイベントを一覧表示します。

/NH "列ヘッダー" が出力に表示されないように指定
します。
"TABLE" および "CSV" の形式にのみ有効です。

/L ログ名 照会するログを指定します。

/? このヘルプ/使用法を表示します。

有効なフィルタ 使用できる演算子 有効な値
------------- ------------------ ------------
DATETIME eq,ne,ge,le,gt,lt MM/dd/yy(yyyy),hh:mm:ssAM(/PM)
TYPE eq,ne SUCCESS, ERROR, INFORMATION,
WARNING, SUCCESSAUDIT,
FAILUREAUDIT
ID eq,ne,ge,le,gt,lt 負でない整数(0 - 65535)
USER eq,ne 文字列
COMPUTER eq,ne 文字列
SOURCE eq,ne 文字列
CATEGORY eq,ne 文字列

注意: フィルタ "DATETIME" は "開始日- 終了日" のように指定可能です。
この形式では "eq" 演算子のみ利用可能です。

例:
EVENTQUERY.vbs
EVENTQUERY.vbs /L system
EVENTQUERY.vbs /S system /U user /P password /V /L *
EVENTQUERY.vbs /R 10 /L Application /NH
EVENTQUERY.vbs /R -10 /FO LIST /L Security
EVENTQUERY.vbs /R 5-10 /L "DNS Server"
EVENTQUERY.vbs /FI "Type eq Error" /L Application
EVENTQUERY.vbs /L Application
/FI "Datetime eq 08/15/02,03:15:00AM-08/15/02,03:15:00PM"
EVENTQUERY.vbs /FI "Datetime gt 07/04/02,04:27:00PM"
/FI "Id gt 700" /FI "Type eq warning" /L System
EVENTQUERY.vbs /FI "Type eq error OR Id gt 1000 "

 

特に難しい使い方はしない、冒頭の日時の指定さえ迷わなければ問題ない。
とりあえず今日(2008年9/9)のイベントログを表示してみる。
コマンドプロンプトから、
>cscript %systemroot%\system32\eventquery.vbs /FI "Datetime ge 09/09/2008,12:00:00AM"

これで今日記録されたイベントログだけ出力される、これだけだと詳細は出ないしフォーマットはCSVではないけど。
eventquery.vbs は System32 においてあるので、cscriptから立ち上げるためフルパスで指定してます。
 
 

イベントログの詳細を含めてCSVにしたい場合


>cscript //nologo %systemroot%\system32\eventquery.vbs /FI "Datetime gt 09/09/2008,12:00:00AM" /V /FO CSV

"/V" で詳細込み、"/FO CSV" でCSVフォーマット指定と。後はこれをリダイレクトでファイルに落とせばOK。
"/FI" はフィルタ。条件を複数指定したいときは "/FI 条件1 and 条件2" と書いてもいいし、 "/FI 条件1 /FI 条件2" としてもOKみたい。or は前者でしか使えないかも、オプション複数は and だった。
 
 


追記:
前は上記の内容で 年/月/日 の指定を MM/DD/YY で書いていたが、Wshの仕様でYYが2桁だと正確な年にならない、詳しくはコメントで。
指摘を貰ったので本文修正しました。





 



 
しかし、過去記事を並べてみて思う。

  1. WindowsバッチファイルでYYYYMMDD で日付を文字列にして条件指定とファイル名に使う

  2. この記事の "eventquery.vbs" でイベントログを1日分ダンプする。

  3. Forfilesコマンドで古いログを自動で削除 する


アラ、これは便利なものができたかもしれない。ログローテーションバッチ。
普段使ってるのはVBScriptで書いてるけど、この流れならソラで書ける。
セキュリティ認証とかのため、とりあえずでよいからログの保管、というポリシーが必要な場合に片手間で仕込めますね。
 
 

丸々1日分のログをとる場合、日付が変わってからVBScriptなどで前日の文字列作成するのが普通なのかもしれないしそんなに手間でもないが、バッチでも次の方法でいけるかな?
 
タスクスケジューラで「毎日23:59」にバッチ開始、日付文字列を変数に格納してログファイル名やらをまず作成。
eventqueryの直前に、リソースキットだったかサポートツールだったかについてくる、
sleep 60」 で。