イベントログを取得するにはGet-WinEventコマンドレットを使えば良い。
取ってきたログを抽出するのも普通にやれば問題ないのだが、全部取ってきてからでは時間が掛かる。
そんな時は、ログを取ってくる時点でFilterして上げれば良い。FilterHashtableオプションを使うのが簡単そうだ。
サンプルとして過去数カ月の発生頻度の高いエラーや警告をサマリーして抽出するスクリプトを作ってみた。
| 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020
| $levels = @{重大 = 1 ; エラー =2 ; 警告 = 3} $lognames = "system","application" $month = 10 #過去何ヶ月を表示するか
function getevent($logname,[ref]$reflevel){ $level = $reflevel.value Write-Host <$logname $level.name> -ForegroundColor Cyan Get-WinEvent -ErrorAction SilentlyContinue -FilterHashtable @{ level = $level.value logname = $logname starttime = ((get-date).addmonths(-$month)) } | group id | sort count -des | select -first 5 | select count,name,{$_.group[0].message} | ft -auto -Wrap }
$lognames | %{ $logname = $_ $levels.GetEnumerator() | sort value | %{getevent $logname ([ref]$_) } } |
結果はこんな感じになる。
指定できる抽出条件は以下のような感じ。
また、Get-WinEventコマンドレットはコンピューター名も指定できるようなので、ドメイン管理者とかであれば、複数サーバーを巡回させてSystemCenter的な使い方もできそうだ。
---- 2015/3/3 --
Ver3以上であればHashTableからPSCustomObjectに変換して以下の様な感じでもOK
(本質的な部分ではないのでどうでもよいのだが、[ref」でやるのはちょっとイマイチな感じもあるので、個人的にメモしておく)
--
あっれー、違うっぽい?「PsCustomObject」は不要で、単に配列にしたからEnumerate不要になっただけ?
| 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021
| $levels = [PsCustomObject]@{name="重大";value=1}, [PsCustomObject]@{name="エラー";value=2}, [PsCustomObject]@{name="警告";value=3} $lognames = "system","application" $month = 10 #過去何ヶ月を表示するか
function getevent($logname,$level){ Write-Host <$logname $level.name> -ForegroundColor Cyan Get-WinEvent -ErrorAction SilentlyContinue -FilterHashtable @{ level = $level.value logname = $logname starttime = ((get-date).addmonths(-$month)) } | group id | sort count -des | select -first 5 | select count,name,{$_.group[0].message} | ft -auto -Wrap }
$lognames | %{ $logname = $_ $levels | sort value | %{getevent $logname ($_) } } |