PowerShellによるイベントログ情報取得

イベントログを確認するのは、システムを安定して稼働させるためにシステム管理者にとって重要な仕事です。こうしたイベントログも、前号で紹介したWMI情報と同様にPowerShellで効率的に取り出して利用できます。

イベントログは通常イベントビューアで確認しますが、蓄積されている情報量はしばしば膨大で、欲しい情報を探すのに一苦労することも珍しくありません。その点、PowerShellを使えば効率的に情報を探し出すことができます。さらに、情報を加工して利用できます。

Windows Server 2008のイベントビューア。

通常、イベントログには以下のような種類があります。

ログの種類 内容
アプリケーション アプリケーションプログラムが記録するログ。アプリケーションによって、ログを記録するアプリケーション、記録しないアプリケーション、さまざまです。
セキュリティ Windowsが監査情報を記録するログ。何を監査するかは、管理者がグループポリシー等で設定します。
システム Windowsがシステムの稼働状況やエラーなどを記録するログ。もっとも活用頻度が高いログです。

他にも、インストールしたシステム環境によってログの種類が追加されることがあります。

ログの種類の取得

イベントログ関連情報を取得するには、Get-EventLogコマンドレットを使います。まず-Listオプションで、実装しているイベントログの種類を表示します。

Get-EventLog -List

イベントログの種類のリスト。

環境によって、Get-EventLog -Listの出力は、アプリケーションログはApplication、セキュリティログはSecurity、システムログはSystemというように英語で表示することもあります。

イベントログの取得

1つのログを丸ごと取得するためには、Get-EventLogで-LogNameオプションで「Get-EventLog -LogName System」というようにログの種類を指定して実行します。ただし、-LogNameオプションは省略できますので「Get-EventLog System」とだけ実行してもログを取得できます。

Get-EventLog  System

ただし、これだけだと大量のイベント情報を一挙に取得するため、あまり現実的ではありません。直近のイベントを取得するのであれば、-Newestオプションを使用します。

例: 直近の10件のSystemイベントを取得する時

Get-EventLog  System  -Newest 10

直近の10件のSystemイベントを取得。

一方、Get-EventLogで取得したイベント情報は、1件1件のイベントの配列です。そのため、Get-EventLogで取得したイベント情報オブジェクトのLengthプロパティを確認することで、イベント数を知ることができます。

たとえば、Systemイベントログの記録されているイベント数を知りたい時は、次のように実行します。

(Get-EventLog  System).Length

Get-EventLog Systemの結果をそのままオブジェクトとして使用。

Get-EventLogコマンドレットの出力結果をダイレクトに使用する場合、コマンドレットを実行するたびにイベントログから情報を収集するので時間がかかります。一度取得したイベントデータをすばやく使い回すには、一度変数に保存するといいでしょう。

$events = Get-EventLog System
$events.Length

Get-EventLog Systemの出力結果を変数eventsに代入してから活用。

イベントログメッセージの取得

前述のように、Get-EventLogコマンドレットで取得した情報は配列オブジェクトになっています。たとえば、Get-EventLogで取得したSystemイベントのオブジェクトを変数$eventsに保存しているとき、最初のイベントを表示するには、以下のようにします。

$events[0]

1件目のイベント情報を表示。ただし...整形せずに表示するので読み易いとは言えません。

読み易いよう表示するにはFromat-Table(省略形ft)やFormat-List(省略形fl)で整形するといいでしょう。

$Events[0] | ft

Format-Listコマンドレットで、1件のイベントを読み易く表示。

また、イベント中の特定の項目...たとえばMessageだけ取り出すのであれば、プロパティとして指定します。

$Events[0].Message

1つのイベント中の特定のプロパティを表示。

イベントを検索

一方、Get-EventLogで取得したイベント情報から、特定のイベントを取り出すのであれば、当連載でもこれまで何度も使ってきたWhere-Object(短縮形whereまたは?)を活用します。

イベントのタイプがErrorのイベントだけ取得するのであれば、Where-Objectと-Like句を使って、次のように指定します。

$Events | ? {$_.EntryType -Like "Error"}

イベントのプロパティEntryTypeが「Error」のイベントのみ抽出。

最近1時間のErrorイベントだけを取得するのであれば、次のように実行します。

$date1 = (Get-Date).AddHours(-1)
$events | ? {$_.TimeGenerated -ge $date1}

直近1時間分のログを取得。

Get-Dateで取得した現在日時から、日付時刻オブジェクトのAddHours()メンバ関数(メソッド)で1時間を引き、1時間前の日時を変数$date1に代入します。

$eventsの内容をパイプラインでWhere-Objectコマンドレット(省略形?)に送り、各イベントのTimeGenerated(イベント記録日時)で$date1より新しいイベントだけを抽出します。

もちろん、複数の条件を組み合わせることもできます。

$events | ? {($_.TimeGenerated -ge $date1) -and ($_.EntryType -Like "Error")}

このように、PowerShellはイベントログ情報の検索、収集、分類等にも役立ちます。

PowerShell 2.0のGet-EventLog

Windows Server 2008 R2やWindows 7のPowerShellに実装しているGet-EventLogは、抽出条件を指定するオプションが大幅に強化してあります。主なオプションは次の通りです。

オプション 意味
-After 指定日時以降のイベントを取得します。
-Before 指定日時以前のイベントを取得します。
-EntryType イベントの型を指定します。Error、Information、FailureAudit、SuccessAudit、Warningを指定できます。
-Index 指定したインデックス値のイベントを取得します。
-InstanceID 指定したインスタンスIDのイベントを取得します。
-LogName イベントログを指定します。このパラメータ(System、Security、Applicationなど)の指定は必須です。省略できません。ただし、オプション指定(パラメータスイッチ)の-LogNameは省略できます。たとえば、Systemログを取得する時、「-LogName System」を省略して「System」とだけ記述することはできますが、「System」を省略することはできません。
-Message 指定した文字列をメッセージに含むイベントを取得します。指定文字列にはワイルドカードを使用できます。
-Newest 取得するイベントの最大数を指定します。ログに記録されているイベント数が指定地より多い時、最新のイベントから指定数だけを取得します。
-Source 指定したソースによって記録されたイベントを取得します。ワイルドカードを使用できます。
-UserName 指定したユーザー名に関連したイベントを取得します。ワイルドカードを使用できます。

例 : ユーザー okazaki に関連する過去24時間のSystemイベントログを取得するとき

$date1 = (Get-Date).AddDays(-1)
Get-EventLog  System  -UserName okazaki -After $date1

ActiveDirectoryドメイン環境では、ユーザー名の指定に注意が必要です。たとえば、Companyというドメインのuserというユーザー名であれば、userだけを指定するのではなく、Company\userと指定する必要があります。ワイルドカードも使用できますので、この場合、*userと指定してもかまいません。

-Afterオプションや-Beforeオプションで指定する日時は、文字列ではなくPowerShellの日付時刻オブジェクトでなければなりません。詳細はGet-Dateコマンドレットのヘルプを確認して下さい。