Eventquery.vbs
なんとなく仕事の話が気になって続きを調べてみる。
Windowsイベントログをテキストファイルに出したくて、
WindowsXP以降、管理用ツールとして付属されることになったEventquery.vbsを使っている。
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/ja/library/ServerHelp/68672494-7700-4cbf-8392-4b6ef87b8749.mspx?mfr=true
しかし激しく使い勝手が悪い。
検索条件とかフィルタが細かく指定できるのはいいけど、出力の制御が冴えない。
メンバーの調査によると、
- 日付&時間順でソートされない
- おまけに日付や時間は、"2006/9/10 10:1"とか"2006/12/1 1:30"みたく出るもんだからソートしにくい
- 出力項目をカスタマイズできない
- Windows2000で使えない(リソースキット買えばいいらしいが)
- イベントログのサイズが大きすぎる(8メガくらい)と何も出力されなくなる
どういうこと?、とソースを覗いてみると。
- 400行近い関数が…
- インデントぐちゃぐちゃ
読む気なくした。どのみちCopyright付いてて改造なんてダメだよな。
出来が悪いんならWMIのサンプル扱いしてくれてればなぁ。
なのでWMIで作ってみるが。
- がーん、WQLってORDER BYが無いのか?http://msdn2.microsoft.com/ja-JP/library/ms180524.aspx
- 正直、VBS全然得意じゃないので、"VBS ソート"でググると、出てくるのはクイックソートだのバブルソートだのアルゴリズム学習記…ユーティリティないんだっけ?そりゃスクラッチしてもいいんだけどさぁ…
ということでさくっとこんな感じに。
eventlog2txt.vbs
Option Explicit Dim sourceName Dim fromDate Dim toDate Dim queryString Dim locator Dim service Dim resultSet Dim row Dim line If WScript.Arguments.Count = 3 Then sourceName = WScript.Arguments.Item(0) fromDate = WScript.Arguments.Item(1) toDate = WScript.Arguments.Item(2) Else WScript.StdOut.WriteLine _ "Usage: cscript getEventLog.vbs [ソース名] [開始日付] [終了日付]" WScript.Quit End If queryString = "SELECT * FROM Win32_NTLogEvent " & _ "WHERE Logfile = 'Application' AND " & _ "SourceName = '" & SourceName & "' AND " & _ "TimeGenerated >= '" & fromDate & "' AND " & _ "TimeGenerated <= '" & toDate & "'" Set locator = WScript.CreateObject("WbemScripting.SWbemLocator") Set service = Locator.ConnectServer Set resultSet = Service.ExecQuery(queryString) For Each row In resultSet ' 後でソートするのでMessageの改行はカット line = chr(&H22) & row.TimeGenerated & chr(&H22) & "," & _ chr(&H22) & row.Type & chr(&H22) & "," & _ chr(&H22) & row.SourceName & chr(&H22) & "," & _ chr(&H22) & row.ComputerName & chr(&H22) & "," & _ chr(&H22) & row.CategoryString & chr(&H22) & "," & _ chr(&H22) & row.User & chr(&H22) & "," & _ chr(&H22) & Replace(row.Message, VbCrLf, "") & chr(&H22) WScript.StdOut.WriteLine line Next Set row = Nothing Set resultSet = Nothing Set service = Nothing Set locator = Nothing
生成時刻を先頭に出力させたから、ソートはDOSコマンドにまかせりゃいいじゃん。
cscript eventlog2txt.vbs MY_APP 1900/01/01 2006/07/15 | sort /+2
もしもEventquery.vbsがどーしても実運用に耐えられなかったらだけど、その時は代わりをなんとか作れそうだ。
イベントログのサイズの問題は、なんかWQLの制限っぽい気がするけど…。