はじめに:イベントログの沼から脱却しよう
WindowsサーバーやPCを運用していると、システムの問題を特定するためにイベントログを調べる作業は避けて通れません。しかし、手動で大量のログの中からエラーを探し出すのは骨の折れる作業です。特に、過去24時間以内に発生した重大なエラーだけを素早く見つけたい場合、どうすれば効率的に行えるでしょうか?
本記事では、PowerShellの強力なコマンドレット「Get-EventLog」と「Get-WinEvent」を使って、過去24時間以内に発生した重大なエラーイベントを抽出する方法を、具体的なコード例とともに解説します。これにより、ログ調査の時間を大幅に短縮し、問題解決までのスピードアップを図ることができます。
Get-EventLogとGet-WinEvent:どちらを使うべきか?
PowerShellにはイベントログを操作するための主要なコマンドレットが2つあります。
Get-EventLog: 比較的古いバージョンのWindowsイベントログ(Windows 2000/XP/Server 2003など)からログを取得するために設計されています。一部の新しいログタイプ(例: Applications and Services Logs)には対応していません。Get-WinEvent: Windows Vista/Server 2008以降の新しいイベントログシステム(Windows Eventing 6.0)に対応しており、より多くのログタイプや詳細なフィルターオプションを提供します。パフォーマンスも優れています。
現代のWindows環境では、Get-WinEventの使用が強く推奨されます。しかし、互換性や特定の状況ではGet-EventLogも有効な選択肢となり得るため、両方の使い方を紹介します。
Get-EventLogで過去24時間のエラーを抽出する
まずは、Get-EventLogを使った基本的なエラーイベントの抽出方法を見ていきましょう。ここでは「System」ログを対象に、過去24時間以内の「Error」または「Critical」なイベントを抽出します。
サンプルコード:Get-EventLogによるエラー抽出
# 過去24時間を計算
$24HoursAgo = (Get-Date).AddHours(-24)
# Systemログから、過去24時間以内の「Error」または「Critical」イベントを抽出
Get-EventLog -LogName System -EntryType Error, Critical -After $24HoursAgo |
Select-Object TimeGenerated, EntryType, Source, EventID, Message -First 10 |
Format-List
コード解説
$24HoursAgo = (Get-Date).AddHours(-24): 現在時刻から24時間前のDateTimeオブジェクトを作成します。-LogName System: 取得対象のログ名を指定します。他に「Application」「Security」などがあります。-EntryType Error, Critical: ログのエントリタイプ(重大度)を指定します。ここでは「Error」と「Critical」を指定しています。-After $24HoursAgo: 指定した日時以降のイベントのみを抽出します。Select-Object TimeGenerated, EntryType, Source, EventID, Message -First 10: 抽出されたイベントから、表示したいプロパティを選択し、最初の10件のみを表示します。Format-List: 結果を見やすいリスト形式で表示します。
この方法でも基本的な抽出は可能ですが、新しいイベントログシステムではGet-WinEventの方がより強力です。
Get-WinEventでより高度な過去24時間のエラーを抽出する
Get-WinEventは、より多くのログソースに対応し、強力なフィルターオプションを持っています。ここでは「System」ログから、過去24時間以内の「Error」または「Critical」なイベントを抽出します。
サンプルコード:Get-WinEventによるエラー抽出
# 過去24時間を計算
$24HoursAgo = (Get-Date).AddHours(-24)
# Systemログから、過去24時間以内の「エラー(2)」または「クリティカル(1)」イベントを抽出
Get-WinEvent -LogName System -FilterHashtable @{
StartTime = $24HoursAgo
Level = 1, 2 # 1: Critical, 2: Error
} |
Select-Object TimeCreated, LevelDisplayName, ProviderName, Id, Message -First 10 |
Format-List
コード解説
-FilterHashtable:Get-WinEventの強力なフィルター機能です。ハッシュテーブル形式で複数の条件を指定できます。StartTime = $24HoursAgo: 指定した日時以降のイベントを抽出します。Level = 1, 2: イベントのレベル(重大度)を指定します。数値は以下の通りです。- 1: Critical (クリティカル)
- 2: Error (エラー)
- 3: Warning (警告)
- 4: Information (情報)
- 5: Verbose (詳細)
Select-Object TimeCreated, LevelDisplayName, ProviderName, Id, Message -First 10: 表示したいプロパティを選択します。Get-EventLogとはプロパティ名が異なる場合があります(例:TimeGeneratedがTimeCreatedに、EntryTypeがLevelDisplayNameに)。
XMLフィルターの活用(上級者向け)
Get-WinEventは、より複雑な条件でフィルターしたい場合にXMLクエリを使用することもできます。例えば、特定のイベントIDや特定のキーワードを含むイベントを抽出する際に非常に強力です。
# 例: Systemログから、過去24時間以内のクリティカルまたはエラーで、
# 特定のソース(例: Microsoft-Windows-Kernel-Power)からのイベントを抽出
$query = @"
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">*[System[(Level=1 or Level=2) and TimeCreated[SystemTime >= '$($24HoursAgo.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss.fffZ'))']]]</Select>
<Select Path="System">*[System[(Provider Name='Microsoft-Windows-Kernel-Power')]]</Select>
</Query>
</QueryList>
"@
Get-WinEvent -FilterXml $query |
Select-Object TimeCreated, LevelDisplayName, ProviderName, Id, Message -First 10 |
Format-List
XMLフィルターは学習コストがかかりますが、イベントビューアの「カスタムビューの作成」機能でXMLをエクスポートし、それを参考にすることで効率的に作成できます。
さらに活用するために:ログ調査を自動化する
PowerShellスクリプトは、単にログを抽出するだけでなく、様々な形で活用できます。
- ファイルに出力する:
Export-CsvやOut-Fileを使って、抽出結果をCSVファイルやテキストファイルに保存できます。 - メールで通知する:
Send-MailMessageコマンドレットを使えば、エラーイベントが見つかった場合に管理者へ自動でメール通知することも可能です。 - タスクスケジューラで定期実行する: 作成したスクリプトをWindowsのタスクスケジューラに登録することで、毎日決まった時間に自動でエラーログをチェックし、結果を報告させることができます。
まとめ:PowerShellでスマートなログ監視を
PowerShellのGet-EventLogやGet-WinEventコマンドレットを使えば、Windowsイベントログの中から必要な情報を迅速かつ効率的に抽出できます。特にGet-WinEventは、その強力なフィルター機能と新しいイベントログシステムへの対応により、現代のログ監視において中心的な役割を果たします。
本記事で紹介したコードを参考に、ぜひご自身の環境で試してみてください。手動でのログ確認から解放され、よりスマートなシステム運用を実現できるはずです。


コメント