Windows環境では、オペレーティングシステムの動作に関する記録が「イベントログ」に記録されています。
個人でWindowsを利用している場合、トラブルシューティングのときにイベントビューアーでイベントログを確認するぐらいですが、企業などでは、証跡として過去のイベントログを保存しておきたい場合があります。
そこでここではWindows 10を例に、イベントビューアーやコマンドでイベントログを検索して、汎用性の高いテキスト形式でエクスポートする方法を紹介します。
目次
イベントビューアーでエクスポート
GUI操作でイベントログをエクスポートするには「イベントビューアー」を利用します。
特定のイベントログだけをエクスポートしたいときは、エクスポートする数が少なければ、エクスポートしたいイベントログを選択して、画面右側の操作メニューから「選択したイベントの保存」をクリックします。
ファイルの保存ダイアログが表示されたら、ファイルの種類から「テキスト(タブ区切り)」もしくは「CSV(カンマ区切り)」を選択し、ファイル名を指定して保存します。
テキスト(タブ区切り)で保存したファイルを開くと、次のように表示されています。
特定の条件に一致するイベントログを一括でエクスポートしたいときは、まず以下のいずれかの方法で表示するイベントログを絞り込みます。
現在表示しているログから特定のイベントログだけに絞り込みたいときは、画面右側のメニューから「現在のログをフィルター」をクリックして、フィルター条件を指定します。
複数のログやイベントソースから特定のイベントログだけに絞り込みたいときは、画面右側のメニューから「カスタムビューの作成」をクリックして、フィルター条件を指定します。
フィルターまたはカスタムビューを指定して、エクスポートしたいイベントログだけを表示させたら、画面右側のメニューから「すべてのイベントを名前を付けて保存」をクリックすることで、表示されているイベントログだけをエクスポートすることができます。
wevtutilコマンドでエクスポート
Windowsコマンド「wevtutil」では、イベントの種類やレベル、期間などを細かく設定して、特定のイベントログだけをエクスポートすることができます。
たとえば、システムイベントログをエクスポートするときは、次のように実行します。
> wevtutil qe System /f:text /rd:true >export.txt
イベントIDを絞り込む
システムイベントログからイベントID6006のログのみをエクスポートするときは、次のように実行します。
> wevtutil qe System /f:text /rd:true "/q:*[System[(EventID=6006)]]" >export.txt
イベントID6006もしくはイベントID13のログのみをエクスポートするときは、次のように実行します。
> wevtutil qe System /f:text /rd:true "/q:*[System[(EventID=6006 or EventID=13)]]" >export.txt
イベントレベルを絞り込む
システムイベントログから重大もしくはエラーログのみをエクスポートするときは、次のように実行します。
なお、Levelの数値は1:重大、2:エラー、3:警告、4:情報となります。
> wevtutil qe System /f:Text /rd:true "/q:*[System[(Level=2 or Level=1)]]" >export.txt
期間を絞り込む
システムイベントログから2020年8月1日から2020年8月9日までのイベントログをエクスポートするときは、次のように実行します。
なお、時間指定はGMTベースなので、9時間を引いた値で指定する必要があります。
> wevtutil qe System /f:Text /rd:true "/q:*[System[TimeCreated[@SystemTime>='2020-07-31T15:00:00' and @SystemTime<='2020-08-09T15:00:00']]]" >export.txt
wmicコマンドでエクスポート
wmicコマンドでも、イベントの種類やレベル、期間などを細かく設定して、特定のイベントログだけをエクスポートすることができます。
イベントIDを絞り込む
システムインベントログからイベントID6006のログのみをエクスポートするときは、次のように実行します。
> wmic ntevent where "(LogFile='system' and EventCode='6006')" >export.txt
イベントID6006もしくはイベントID13のログのみをエクスポートするときは、次のように実行します。
> wmic ntevent where "(LogFile='system' and (EventCode='6006' or EventCode='13'))" >export.txt
イベントレベルを絞り込む
システムイベントログから警告のログのみをエクスポートするときは、次のように実行します。
なお、EventTypeの数値は1:エラー、2:警告、3:情報となります。
> wmic ntevent where "(logfile='system' and EventType='2')" >export.txt
期間を絞り込む
システムイベントログから2020年8月1日から2020年8月2日までのイベントログをエクスポートするときは、次のように実行します。
> wmic ntevent where "(logfile='system' and (timegenerated >= '20200801000000.0+540' and timegenerated <= '20200803000000.0+540'))" >export.txt
出力項目を絞り込む
出力する項目を EventIdentifier, EventType, Message, RecordNumber, SourceName, TimeGeneratedに絞り込むときは「list brief」を付加して実行します。
> wmic ntevent where "(logfile='system' and (timegenerated >= '20200801000000.0+540' and timegenerated <= '20200803000000.0+540'))" list brief >export.txt
出力する項目をTimeGenerated,EventType,EventCode,SourceName,Messageに絞り込むときは、次のように実行します。
> wmic ntevent where "(logfile='system' and (timegenerated >= '20200801000000.0+540' and timegenerated <= '20200803000000.0+540'))" get TimeGenerated,EventType,EventCode,SourceName,Message >export.txt
出力形式を指定する
CSV形式で出力したいときは、次のように実行します。
> wmic ntevent where "(logfile='system' and (timegenerated >= '20200801000000.0+540' and timegenerated <= '20200803000000.0+540'))" list /format:CSV >export.txt
HTML形式で出力したいときは、次のように実行します。
> wmic ntevent where "(logfile='system' and (timegenerated >= '20200801000000.0+540' and timegenerated <= '20200803000000.0+540'))" list /format:HTABLE >export.txt
Get-EventLogコマンドでエクスポート
PowerShellでイベントログをエクスポートする場合は「Get-WinEvent」または後述の「Get-WinEvent」コマンドレットが利用できます。
Windows環境でPowerShellを使って目的のイベントログを取り出したいときに利用できるコマンドレットには、Get-EventLogとGet-WinEventの二つが利用できます。
両者の大きな違いとしては、Get-EventLogはイベントビューアーで見ることができる現在のログファイルのみを扱うことができ、Get-WinEventでは現在のログファイルに加えて、バックアップされたログファイルも扱うことができます。
また、Get-EventLogは、コマンドのオプションでイベントログの絞り込みが比較的簡単にできますが、指定できるオプションが限られているため、より詳細な条件で絞り込みが必要なときはGet-WinEventのほうが便利です。
Get-WinEventコマンドレットで、システムログをエクスポートするときは、次のように実行します。
PS> Get-EventLog -LogName System >export.txt
イベントIDを絞り込む
システムログからイベントソース「DCOM」でイベントID「10016」のイベントログだけをエクスポートしたいときは、次のように実行します。
PS> Get-EventLog -LogName System -Source DCOM | Where-Object {$_.EventID -eq 10016} >export.txt
イベントレベルを絞り込む
アプリケーションログから「警告(Warning)」レベルのログだけをエクスポートするには、次のように実行します。
指定可能なログレベルは、Error/Information/Warning/FailureAudit/SuccessAuditです。
PS> Get-EventLog -LogName System -EntryType Warning >export.txt
期間を絞り込む
システムログから、2022年10月24日以降のイベントログだけをエクスポートしたいときは、次のように実行します。
PS> Get-EventLog -LogName System -After '2022/10/24 00:00:00' >export.txt
システムログから、2022年8月31日以前のイベントログだけをエクスポートしたいときは、次のように実行します。
PS> Get-EventLog -LogName System -Before '2022/08/31 23:59:59' >export.txt
なお「-After」オプションと「-Before」オプションを組み合わせれば、特定期間のイベントログを取り出すことも可能です。
出力項目を絞り込む
アプリケーションログの詳細情報から「ログの日付」「レベル」「イベントID」「メッセージ」の情報だけをエクスポートしたいときは、次のように実行します。
PS> Get-EventLog -LogName Application | Select-Object TimeGenerated,EntryType,InstanceID,Message >export.txt
出力形式を指定する
アプリケーションログをCSV形式ファイルで出力するには、次のように実行します。
PS> Get-EventLog -LogName Application | Export-CSV -Encoding Default C:\Work\Applog.csv
Get-WinEventコマンドでエクスポート
Get-WinEventコマンドレットで、システムイベントログをテキスト形式でエクスポートするときは、次のように実行します。
PS> Get-WinEvent -FilterHashtable @{ LogName='System' } >export.txt
イベントIDを絞り込む
システムイベントログからイベントID6006のログのみをエクスポートするときは、次のように実行します。
PS> Get-WinEvent -FilterHashtable @{ LogName='System'; Id=6006 } >export.txt
システムイベントログからイベントID6006もしくはイベントID13のログのみをエクスポートするときは、次のように実行します。
PS> Get-WinEvent -FilterHashtable @{ LogName='System'; Id=(6006,13) } >export.txt
イベントレベルを絞り込む
システムイベントログからエラーのログのみをエクスポートするときは、次のように実行します。
なお、Levelの数値は1:重大、2:エラー、3:警告、4:情報となります。
PS> Get-WinEvent -FilterHashtable @{ LogName='System'; Level=2 } >export.txt
エラーと警告のログのみをエクスポートするときは、次のように実行します。
PS> Get-WinEvent -FilterHashtable @{ LogName='System'; Level=(2,3) } >export.txt
期間を絞り込む
システムイベントログから昨日のログのみをエクスポートするときは、次のように実行します。
PS> $sdate = (Get-Date).AddDays(-2)
PS> $edate = (Get-Date).AddDays(-1)
PS> Get-WinEvent -FilterHashTable @{ LogName="System"; StartTime = $sdate; EndTime=$edate } >export.txt
システムイベントログから2020年8月1日から2020年8月2日までのイベントログをエクスポートするときは、次のように実行します。
PS> $sdate = Get-Date -Date "2020/08/01"
PS> $edate = Get-Date -Date "2020/08/03"
PS> Get-WinEvent -FilterHashTable @{ LogName="System"; StartTime = $sdate; EndTime=$edate } >export.txt
参考
wmic - Win32 apps | Microsoft Learn
Get-EventLog (Microsoft.PowerShell.Management) - PowerShell | Microsoft Learn
Get-WinEvent (Microsoft.PowerShell.Diagnostics) - PowerShell | Microsoft Learn
あとがき
イベントログは、デフォルト設定でもある程度の期間保存されていますが、カテゴリーごとに「最大ログサイズ」が設定されており、最大サイズを超えた場合、古いイベントから上書きされてしまうので、過去のイベントログを確認することがあるなら、ここで紹介している方法で定期的にエクスポートしておけば安心です。