PowerShell でイベントログを検索するのが結構べんりやん

2021年9月10日金曜日

PowerShell

t f B! P L

PowerShell で Windows のイベントログ検索する方法を紹介します。リモートデスクトップが使えなくて、SSHなどのコンソールからしかログイン出来ない時に役立つ(と思う)。

スポンサーリンク

EventLog コマンドレット

PowerShell でイベントログを検索・表示するには EventLog コマンドレットを使用し、このコマンドに各種オプションを指定して、日付やエラーレベルなどでログを検索します。

例えば、ログの種類に「アプリケーション」を指定してイベントログを検索する場合は、次のようにします。

EventLog -LogName Application

表示件数を絞る

イベントログが大量に溜まっている場合、↑のコマンドのように条件なしでログを全件取得すると、ログがコンソール上に大量に表示され、いつまで経っても結果が返ってっこなくなるため、基本的には表示件数を絞りましょう。件数の絞り込みは -Newest オプションを使用します。

例えば、アプリケーションログを、新しい物から順に先頭 100件のみ取得する場合は、次のようなコマンドを使用します。

EventLog -LogName Application -Newest 100

時間で絞り込む

日時を指定して、それ以前・以降のイベントログを検索する場合は、-Aefore および -Before オプションを使用します。

例1)2021/05/10 12:00:00 以前のデータを検索する

EventLog -LogName Application -Before ([Datetime]"2021/05/10 12:00:00") 

例2)2021/06/12 12:00:00 以降のデータを検索する

EventLog -LogName Application -After([Datetime]"2021/06/12 12:00:00") 

いろんな条件でイベントログを検索する

EventLog コマンドレット自体は日時でしかイベントログを検索できませんが、パイプラインの Where-Object を使う事で、いろんな条件でイベントログを検索することが可能。

エラーレベルで検索

Get-EventLog Application | Where-Object {$_.EntryType -eq "Error"}

ほかにも、次の表に示すような項目で検索が可能だ。
項目 説明
$_.Index イベントの連番
$_.EntryType Error、Warning、Information など
$_.Source イベントソース
$_.Message イベントメッセージ

部分一致で検索

エラーの内容の一部が分かっている時に、メッセージの内容を部分一致させて検索するのは、よくあるユースケースであろう。もちろん、PowerSehll でも部分一致検索は可能です。Where-Objectではワイルドカード検索と、正規表現での部分一致検索をサポートしています。

次の例は、エラーメッセージに「山田」を含むイベントログを検索するコマンドです。

Get-EventLog Application | Where-Object {$_.Message -like "*山田*"}

使用できる比較演算子には、次の表に示す4つがあります。

演算子 説明
-like ワイルドカード検索
-nolike 否定形のワイルドカード検索(一致しない時に True)
-match 正規表現での検索
-nomatch 否定形の正規表現検索(一致しない時に True)

※ワイルドカード検索では、特殊文字に *, ?, [] 使える。

スポンサーリンク

イベントログの詳細情報を表示

ここまで紹介したように、Get-EventLog コマンドレットは、検索にヒットしたイベントログを1件1行の形式で出力します。しかし、長いメッセージのイベントログの場合、次のように途中で文字が切れてしまい。全文を確認することができません。

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
  132646 9 08 12:22    Information Windows Error Rep...         1001 障害バケット 1856633060806702132、種類 5...

そんな時は、Format-List コマンドを使用するとこで、1件のイベントログオブジェクトがリスト形式で表示され、ログの内容を詳細に確認することができます。

Get-EventLog Application | Where-Object {$_.Index -eq 132646} | Format-List

■ 実行結果

Index              : 132646
EntryType          : Information
InstanceId         : 1001
Message            : 障害バケット 1856633060806702132、種類 5
                     イベント名: AppHangB1
                     応答: 使用不可
                     Cab ID: 0

                     問題の署名:
                     P1: A5M2.exe
                     P2: 2.15.0.361
                     P3: 5fba0cd8
                     P4: 64d9
                     P5: 67246080
                     P6:
                     P7:
                     P8:
                     P9:
                     P10:

                     添付ファイル:
                     \\?\C:\ProgramData\Microsoft\Windows\WER\Temp\WERA433.tmp.WERInternalMetadata.xml

                     これらのファイルは次の場所にある可能性があります:
                     \\?\C:\ProgramData\Microsoft\Windows\WER\ReportArchive\Critical_A5M2.exe_119c93ff38e187c717673c2da
                     8b73c713527ef4_803152ec_65fa13cc-abc6-4c29-aa15-961c62e4f740

                     分析記号:
                     解決策を再確認中: 0
                     レポート ID: 2f6e1d25-c7fc-4be7-ac53-af44dbf08dfa
                     レポートの状態: 268435456
                     ハッシュされたバケット: xxxxxxxxxxxxxxxxxxxxxxxxxxx
                     Cab GUID: 0
Category           : (0)
CategoryNumber     : 0
ReplacementStrings : {1856633060806702132, 5, AppHangB1, 使用不可...}
Source             : Windows Error Reporting
TimeGenerated      : 2021/09/08 12:22:25
TimeWritten        : 2021/09/08 12:22:25
UserName           :
スポンサーリンク

QooQ