イベントログをファイルに書き出す [PowerShell]
PowerShellでイベントログのデータをファイルにエクスポート(書き出す)方法。
○必要動作環境
- Windows Vista、7、Windows Server 2008 R2
- .NET Framework 3.5以降
- Windows PowerShell 2.0以降
○イベントログアーカイブファイル(*.evtx)形式でエクスポート
今回はWindows Vista以降の新形式のイベントログに対応したコマンド・クラスを使おうと思います。Windows XPでは利用できません。
ところがPowerShellの中で新形式のログに対応したコマンドレットはGet-WinEventコマンドしかありません。このコマンドはログの取得のみ可能で、ログのデータを保存することはできません。そこで今回は、やや強引ではありますが、.NET Framework 3.5で追加されたクラスライブラリ(System.Diagnostics.Eventing.Reader.EventLogSessionクラス)のExportLogメソッドを利用することにします。
$logname = "System"
$logquery = "*[System[Provider[(@Name='Microsoft-Windows-Kernel-Power')] and (EventID='42')]]"
$outfile = $env:USERPROFILE + "\Desktop\System.evtx"
#ここからスクリプト
if(Test-Path -Path $outfile) {
Remove-Item $outfile
}
$evsession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession
$evsession.ExportLog($logname,"LogName",$logquery,$outfile)
上のサンプルではSystemログからソースがMicrosoft-Windows-Kernel-PowerかつイベントIDが42のイベントを抽出し、現在のユーザーのデスクトップフォルダーにSystem.evtxとしてエクスポートしています。$logname、$logquery、$outfileは適当に変えてください。ExportLogメソッドではファイルの上書きはできません。前もってファイルの存在を確認して削除するか処理を中断するのがいいでしょう。
出力ファイルの拡張子は.evtxというもので、イベントビューア等で閲覧することができます。PowerShellではGet-WinEventコマンドでこの形式のファイルを扱うことができます。
ExportLogメソッドの代わりにExportLogAndMessagesメソッドを用いると表示情報も一緒に出力することができます。その場合出力先にLocaleMetaDataフォルダーが作成されます。ただ、その際にPowerShellが管理者権限でないとエラーになることがあります。
○XML(*.xml)形式でエクスポート
.evtx形式はイベントビューアや.NET Frameworkアプリケーションで利用する分には便利ですが、中身はテキストではないので.NET Frameworkを利用できない環境で扱うのは困難です。そこで新形式のイベントログの特長を生かして、ログデータをXML形式でエクスポートしようという作戦です。
foreach($eventnode in Get-WinEvent System -MaxEvents 1000) {
$events += $eventnode.ToXml()
}
$events += "</Events>"
$events | Out-File ($env:USERPROFILE + "\Desktop\System.xml") -Encoding utf8
上のサンプルはSystemログの最近1000件のログをデスクトップにSystem.xmlとして保存しています。Get-WinEventコマンドとToXmlメソッド以外は特別な操作はしていません。出力するXMLのフォーマットはイベントビューアの保存形式に準じています。以前に紹介したようにGet-WinEventコマンドにFilterHashTable、FilterXML、FilterXPathのいずれかのパラメーターでクエリを指定すればフィルターをかけることができます。
○更新履歴
- 2011/11/23 細かいミスがあったので修正
- 2011/11/17 作成