Image: イベントログをファイルに書き出す [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形式でエクスポートしようという作戦です。

$events = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?><Events>"
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 作成

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!