Windowsのイベントログは、システムの状態やエラーを確認するうえで重要なログですが、イベントビューアーを毎回開いて確認するのは手間がかかります。
PowerShell を利用すると、イベントログを自動で解析・保存でき、監視を効率的に行うことができます。
この記事では、Get-WinEvent
コマンドレットを使ってイベントログを取得・保存する手順を紹介します。
1.イベントログを取得する
今回は3パターンの抽出方法を紹介します。
1-1.基本的なコマンド
Windowsのイベントログを取得する基本的なコマンドは以下の通りです。
Get-WinEvent -LogName System -MaxEvents 10
-LogName
で取得するログの種類(System、Application、Security など)を指定します。
-MaxEvents
で取得する件数を制限できます。
1-2.特定のイベントレベルを抽出する
エラーや警告など、特定のレベルのログだけを抽出したい場合は、Where-Object
を使います。
Get-WinEvent -LogName System | `
Where-Object { $_.LevelDisplayName -eq "Error" } #OSが日本語の場合は "エラー"
このコマンドでは、「Error(エラー)」レベルのイベントのみを取得します。
「Warning」「Information」なども指定可能です。
OSが日本語化されている場合には日本語で “エラー” と記載しないと条件に引っ掛からずエラーとなるので注意が必要です。
1-3.特定期間のログを取得する
最近発生したイベントのみを確認したい場合は、期間を指定して取得することもできます。
$start = (Get-Date).AddDays(-1)
Get-WinEvent -FilterHashtable @{ LogName = 'System'; StartTime = $start }
この例では、「過去1日以内に発生したSystemログ」を取得します。
FilterHashtable
を使うことで、複数条件を効率よく指定できます。
2.抽出結果をCSVファイルに保存する
取得したイベントログをCSVファイルに出力すると、後でExcelなどで簡単に分析できます。
Export-Csv
では、対象のフィアルがない場合、自動的にフォルダやファイルを作成できないため、Export-Csv
実行前にフォルダを確認して存在しなければ作成する処理を追加します。
# 保存先のパスを変数に入れる
$path = "C:\hogehoge\logs\system_log.csv"
# フォルダのパスを取得
$folder = Split-Path $path
# フォルダが存在しない場合は作成
if (-not (Test-Path $folder)) {
New-Item -Path $folder -ItemType Directory | Out-Null
}
# CSVを書き出し
Get-WinEvent -LogName System -MaxEvents 100 | `
Select-Object TimeCreated, Id, LevelDisplayName, Message | `
Export-Csv $path -NoTypeInformation -Encoding UTF8
Select-Object
で必要な項目のみ抽出し、Export-Csv
で保存しています。
これにより、余分な情報を除いた見やすいログファイルを作成できます。
2-1.エラーのみを抽出して保存する例
運用でよく使うのが、エラーログだけを抽出して自動保存するスクリプトです。
$start = (Get-Date).AddDays(-1)
# CSVを書き出し
Get-WinEvent -FilterHashtable @{LogName="System"; StartTime=$start} | `
Where-Object { $_.LevelDisplayName -eq "Error" } | `
Select-Object TimeCreated, Id, LevelDisplayName, Message | `
Export-Csv $path -NoTypeInformation -Encoding UTF8
このスクリプトでは、過去1日以内に発生したエラーイベントのみを error_log.csv
に出力します。
また、こちらでもOSが日本語化されている場合には日本語で “エラー” と記載しないと条件に引っ掛からずエラーとなるので注意が必要です。
3.タスクスケジューラで自動実行する
上記のスクリプトを .ps1
ファイルとして保存し、タスクスケジューラに登録すれば、
定期的に自動実行することが可能です。
- PowerShellスクリプトを保存
例:C:\hogehoge\scripts\export-eventlog.ps1
- タスクスケジューラを開く
「タスクの作成」→「トリガー」で毎日実行を設定 - 操作タブに以下を設定
プログラム/スクリプト: powershell.exe
引数の追加: -ExecutionPolicy Bypass -File "C:\hogehoge\scripts\export-eventlog.ps1"
これで、指定時間ごとに自動的にイベントログを解析・保存できます。
3-1. タスクスケジューラでうまく実行できないとき
スクリプトの中でシングルクォーテーション(‘)を利用している場合うまく実行できない場合があります。
以下の記事にもまとめてありますので、タスクスケジューラがうまく実行しない場合は参考にしてください。
4.まとめ
PowerShellを使うことで、イベントログの収集・解析・保存を自動化できます。
サーバーの監視や障害対応の初動などに役立つ仕組みを簡単に構築可能です。
主なコマンドは以下の通りです。
- Get-WinEvent:イベントログを取得
- Where-Object:条件に一致するログを抽出
- Export-Csv:結果をファイルに保存
日次でログを出力するスクリプトをタスクスケジューラと組み合わせると、よりシステム監視を効率化できます。