DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

イベントログを取得する

ここでは、コンピュータ上のWindowsのイベントログとその内容(エントリ)を取得する方法を紹介します。

コンピュータ上のすべてのイベントログを取得する

EventLog.GetEventLogsメソッドを使うと、コンピュータ上のすべてのイベントログ(Application, Security, System, ...)を配列で取得できます。イベントログの内容(エントリ)は、EventLog.Entriesプロパティで取得できます。

なおWindows Vista以降でUACが有効になっている時は、管理者に昇格しないと失敗するかもしれません。この対処法については、「Vista以降でUACが有効だとファイルの作成等に失敗する問題の対処法」をご覧ください。

次の例ではローカルコンピュータ上のすべてのイベントログとエントリを取得してコンソールへ出力しています。(ログが多いと、終わるまでにかなり時間がかかります。)

VB.NET
コードを隠すコードを選択
'ローカルコンピュータ上のイベントログをすべて取得する
Dim logs As System.Diagnostics.EventLog() = _
    System.Diagnostics.EventLog.GetEventLogs()
'次のようにコンピュータ名を指定することも出来る
'logs = System.Diagnostics.EventLog.GetEventLogs("myMachine")

For Each log As System.Diagnostics.EventLog In logs
    'イベントログの名前を出力する
    Console.WriteLine(("Log: " & log.Log))

    'ログエントリをすべて取得する
    For Each entry As System.Diagnostics.EventLogEntry In log.Entries
        'ログエントリのメッセージを出力する
        Console.WriteLine(vbTab & "Entry: " & entry.Message)
    Next
Next
End Sub
C#
コードを隠すコードを選択
//ローカルコンピュータ上のイベントログをすべて取得する
System.Diagnostics.EventLog[] logs =
    System.Diagnostics.EventLog.GetEventLogs();
//次のようにコンピュータ名を指定することも出来る
//logs = System.Diagnostics.EventLog.GetEventLogs("myMachine");

foreach (System.Diagnostics.EventLog log in logs)
{
    //イベントログの名前を出力する
    Console.WriteLine(("Log: " + log.Log));

    //ログエントリをすべて取得する
    foreach (System.Diagnostics.EventLogEntry entry in log.Entries)
    {
        //ログエントリのメッセージを出力する
        Console.WriteLine("\tEntry: " + entry.Message);
    }
}

指定した名前のイベントログを取得する

上記のようにすべてのイベントログではなく、名前が分かっている特定のイベントログだけを取得するならば、その名前とコンピュータ名をコンストラクタの引数に指定して、EventLogオブジェクトを作成します。

以下の例では、ローカルコンピュータ上のイベントログ「Application」のエントリをすべて表示しています。

VB.NET
コードを隠すコードを選択
'取得するイベントログ名
Dim logName As String = "Application"
'コンピュータ名("."はローカルコンピュータ)
Dim machineName As String = "."

'指定したイベントログが存在しているか調べる
If System.Diagnostics.EventLog.Exists(logName, machineName) Then
    'EventLogオブジェクトを作成する
    Dim log As New System.Diagnostics.EventLog(logName, machineName)
    'または、次のようにもできる
    'Dim log As New System.Diagnostics.EventLog()
    'log.Log = logName
    'log.MachineName = machineName

    'ログエントリをすべて取得する
    For Each entry As System.Diagnostics.EventLogEntry In log.Entries
        'ログエントリのメッセージを出力する
        Console.WriteLine("Entry: " & entry.Message)
    Next

    '閉じる
    log.Close()
End If
C#
コードを隠すコードを選択
//取得するイベントログ名
string logName = "Application";
//コンピュータ名("."はローカルコンピュータ)
string machineName = ".";

//指定したイベントログが存在しているか調べる
if (System.Diagnostics.EventLog.Exists(logName, machineName))
{
    //EventLogオブジェクトを作成する
    System.Diagnostics.EventLog log =
        new System.Diagnostics.EventLog(logName, machineName);
    //または、次のようにもできる
    //System.Diagnostics.EventLog log =
    //    new System.Diagnostics.EventLog();
    //log.Log = logName;
    //log.MachineName = machineName;

    //ログエントリをすべて取得する
    foreach (System.Diagnostics.EventLogEntry entry in log.Entries)
    {
        //ログエントリのメッセージを出力する
        Console.WriteLine("Entry: " + entry.Message);
    }

    //閉じる
    log.Close();
}
  • 履歴:
  • 2014/1/7 UACに関する記述を追加。「指定した名前のイベントログを取得する」を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。