2015/02/10

[Windows] イベントログをバイナリやCSVテキストで保存するスクリプトまとめ

Windowsのイベントログというと、以下の様な理由で回収することが多いと思います。
  • アプリが落ちるなど問題発生時に、原因を調査するため
  • システムが正常に稼働しているか、定期的にチェックするため
通常、イベントビューアーを起動して対象となるログを右クリックして保存...という手作業で回収できます。

・・・できますが、定期的に回収したい場合など回数が増えてくると面倒です(´・ω・`)
さらに、現場でログ収集にあたってくれる方がPCに不慣れだとかなり苦戦する場合があります(´・ω:;.:...

という訳で、本記事ではイベントログを回収するスクリプトをご紹介します。
回収する際のファイル出力形式はテキスト(*.csv)とバイナリ(*.evt)の2種類です。

テキストで収集する


テキストで保存すると、インストールプログラムが異なる環境でもメッセージ内容をきちんと把握できるので
回収後の解析で何かと便利です。個人的にはこちらの形式が好みです。

コードサンプルと使い方


Jason Fossen氏が作ったVBScriptは、WindowsのEventLogをテキストで収集する最もスマートな方法のひとつです。今まで本記事では、『Dump Windows Event Logs To CSV Text Files (VBScript)』をご紹介していました。

しかし、このスクリプトを日本語環境で使うと以下の問題が発生することがわかりました。
  • Messageに含まれる日本語が全て削除されてしまう
  • Date、Time情報が全てUTCになっており、地域の時間へと別途変換が必要

そこで、これらの問題を解消したスクリプトを作成しましたので改めてご案内いたします。

EventLogTextCollector.zip

このZipを展開して、「CollectBasicEventLogs.bat」を管理者実行すれば、以下の主要3つのイベントログをCSV形式で保存できます。
  • Application
  • System
  • Security

また同じくZipに入っている「CollectAllEventLogs.bat」を管理者実行すればローカルPCの全てのWindowsイベントログが「AllEventLog.csv」に保存できます。

出力例


時系列で並べて出力されています。Excelのオートフィルタ機能などを使って「Logの列をApplicationに絞る」などするとよさそうです。


参考資料


GitHub上のプロジェクトでDumpEventLog.vbsの改造を実施しました。
Visual Studio 2013プロジェクトで「デバッグなしで開始」を実行すれば、簡易デバッグできるようにしています。

KemoKemo/EventLogTextCollector@GitHub


おまけ


最初にPowerShellスクリプトを使ってイベントログのCSV保存を試みたのですが、
なぜか日付がSystem.Byte[]という文字列で保存されちゃって挫折しました・・・orz
get-eventlog -list | %{ get-eventlog $.Log | export-csv -path ($.Log + ".csv") -Encoding Default}

バイナリで収集する


バイナリ形式の方が好まれる場合もあるようです。合わせてご紹介します。

VBscriptで収集する方法


サポートしたいOSにWindows XPなど古めのOSも含まれる場合は、この方法が良いです。

コードサンプルと使い方

' default path is current directory.
Set objWshShell = CreateObject("WScript.Shell")
path = objWshShell.CurrentDirectory

' default path can be changed by arg0.
set oParam = WScript.Arguments
If oParam.Count > 0 Then
path = oParam(0)
End If

' collecting event log...
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate, (Backup, Security)}!\" _
& strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery _
("SELECT * FROM Win32_NTEventLogFile")
For Each objLogfile in colLogFiles
strBackupLog = objLogFile.BackupEventLog _
(path & "\" & objLogFile.LogFileName & ".evt")
Next
上記を拡張子「*.vbs」にして保存します。(例えば「EventLog.vbs」など)
これを ダブルクリックすれば、スクリプトと同じフォルダに『Application.evt』などのイベントログファイルが生成されます。

また、コマンドラインから実行する場合は以下のようにcscriptに渡せばよく
cscript EventLog.vbs
イベントログファイルの保存先を指定したい場合は、以下のように引数で渡します。(「D:\temp\eventlog」フォルダに保存する場合)
cscript EventLog.vbs D:\temp\eventlog

これで、他の情報収集バッチなどからも呼び出せますね!(`・ω・´)ゞ

出力例


以下のようにApplicatoin、Systemなどイベントログの種類毎にevtファイルができます。

参考資料


下記ページを参考にしました。イベントログをクリアするコードを除去すれば、今回ご紹介したログ保存のみのスクリプトになります。
Backing Up and Clearing Event Logs

wevtutilコマンドで収集する方法


Windows 7や2008 ServerなどVista以降のOSがサポート対象なら、標準機能だけで収集できます。

使い方


コマンドラインで以下を実行します。
wevtutil epl Application D:\temp\Application.evt

コマンドの詳細は、以下から調べられます。出力方法などをカスタマイズする場合に確認しましょう。
wevtutil /?
wevtutil epl /?

出力例


こちらもevtファイルが出来ました。

参考資料


以下を参考にしました。
イベントログをアーカイブする

2015/02/13: `出力例の情報を追加。
2016/07/18: テキスト保存のスクリプトをKemoKemo特製の日本語対応版に変更。

0 件のコメント: