はじめに
過去の障害対応でイベントログを調べるたびに、「もっと便利にできないか」と思う場面がありました。
例えばこんな悩みです:
- 特定の時間帯に複数のエラーを横断的に見たい
- エラーIDで絞ったあと、さらにソース名でフィルタしたい
- 大量のログから特定パターンを効率的に探したい
そこで試したのが PowerShell の Out-GridView
です。実際に導入してみると、関連するエラーを一画面で確認でき、従来よりも効率的に原因を特定できそうです。
これまではGUIツールでポチポチ操作していましたが、フィルタをスクリプトで書けるのはやっぱり便利ですね。
Out-GridViewとは
Out-GridView
は、PowerShellの出力をグリッド形式のGUIウィンドウで表示するコマンドレットです。リアルタイムでのフィルタリング、ソート、選択が可能で、大量のデータを視覚的に扱うのに適しています。
動作環境について
本記事のスクリプトは Windows 11 PowerShell 5.1 を前提に作成しています。
補足: PowerShell 7以降では
Get-EventLog
は削除されました。代替としてGet-WinEvent
が推奨されています。ただし、Windows標準のPowerShell 5.1では引き続きGet-EventLog
が利用可能で、シンプルな記述で済むため本記事ではこちらを使用しています。
基本的な使い方
システムイベントログの取得と表示
# 直近100件のシステムログを取得してGridViewで表示
Get-EventLog -LogName System -Newest 100 | Out-GridView
# エラーレベルのイベントのみを取得
Get-EventLog -LogName System -EntryType Error -Newest 200 |
Select-Object TimeGenerated, Source, EventID, Message |
Out-GridView -Title "システムエラーログ"
実践的な活用例
特定期間のイベントログ分析
# 過去7日間のアプリケーションログを取得
$startDate = (Get-Date).AddDays(-7)
Get-EventLog -LogName Application -After $startDate |
Select-Object @{Name="発生日時";Expression={$_.TimeGenerated}},
@{Name="レベル";Expression={$_.EntryType}},
@{Name="ソース";Expression={$_.Source}},
@{Name="イベントID";Expression={$_.EventID}},
@{Name="メッセージ";Expression={
$_.Message.Substring(0, [Math]::Min(100, $_.Message.Length)) + "..."
}} |
Out-GridView -Title "過去7日間のアプリケーションログ"
Out-GridViewの便利な機能
フィルタリング機能
GridViewウィンドウ上部の「条件の追加」ボタンから、以下の操作が可能です:
- contains: 部分一致検索
- equals: 完全一致検索
- 複数条件: AND/OR条件での絞り込み
PassThruパラメータの活用
# 選択したイベントを変数に格納
$selectedEvents = Get-EventLog -LogName System -Newest 100 |
Out-GridView -Title "調査対象を選択" -PassThru
# 選択したイベントの詳細を確認
$selectedEvents | ForEach-Object {
Write-Host "=" * 50
Write-Host "EventID: $($_.EventID)"
Write-Host "Time: $($_.TimeGenerated)"
Write-Host "Message: $($_.Message)"
}
実際の障害解析で「欲しかった」機能の実装 (イメージ)
エラーの因果関係を可視化する機能
過去の障害対応で「このエラーの後に何が起きたか」を知りたいことがありました。
特定のエラーがトリガーとなって連鎖的に発生する問題を追跡する機能を実装しました。
過去のログは再現できないので、こんな実装というイメージです。
function Find-EventChain {
param(
[int]$TriggerEventID,
[int]$MinutesAfter = 5
)
# トリガーとなるイベントを検索
$triggerEvent = Get-EventLog -LogName System -InstanceId $TriggerEventID -Newest 1
if ($triggerEvent) {
$startTime = $triggerEvent.TimeGenerated
$endTime = $startTime.AddMinutes($MinutesAfter)
Get-EventLog -LogName System -After $startTime -Before $endTime |
Select-Object @{Name="経過時間(秒)";Expression={
[math]::Round(($_.TimeGenerated - $startTime).TotalSeconds, 1)
}},
TimeGenerated, EntryType, Source, EventID,
@{Name="概要";Expression={$_.Message.Split("`n")[0]}} |
Out-GridView -Title "EventID $TriggerEventID 発生後の連鎖イベント"
}
}
# 使用例:サービス停止(EventID 7034)後の5分間を確認
Find-EventChain -TriggerEventID 7034 -MinutesAfter 5
この機能により、以下のような分析ができそうです
- サービス停止後に連鎖的に発生するエラーの特定
- ディスクエラー後のアプリケーションへの影響確認
- ネットワーク断後のシステムの挙動把握
トラブルシューティングへの活用
ブルースクリーン関連のイベントを調査
こんなことできるんじゃないの例
Get-EventLog -LogName System |
Where-Object { $_.EventID -in @(41, 1001, 6008, 1074) } |
Select-Object TimeGenerated, EventID,
@{Name="EventType";Expression={
switch($_.EventID) {
41 {"予期しないシャットダウン"}
1001 {"BugCheck"}
6008 {"異常なシャットダウン"}
1074 {"システムシャットダウン"}
}
}},
Message |
Out-GridView -Title "システム停止関連イベント"
まとめ
PowerShellのOut-GridViewを使うと、イベントログの分析を大幅に効率化できます。GUI上でリアルタイムにフィルタリングでき、複数条件での絞り込みやソートも直感的に操作可能です。また、PassThruを使えば選択したデータだけを後続処理に渡せるため、必要な情報にすばやく絞り込めます。特に「エラーの因果関係を可視化する機能」は障害対応の原因特定を大幅にスピードアップし、日常的なトラブルシューティングから定期的な監視まで幅広く活用できる強力な手段となります。
参考リンク