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

イベントログにエントリを書き込む

ここでは、Windowsのイベントログにエントリを書き込む方法を紹介します。

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

アプリケーションログに書き込む簡単な方法

アプリケーションログにエントリを書き込むには、EventLogクラスの静的なWriteEntryメソッドを使用するのが簡単です。このとき、指定したソースが存在していない場合は、EventLog.CreateEventSourceメソッドで作成しておきます。

注意:CreateEventSourceメソッドで新しく作成するソースの名前は、すでに存在しているソース名やログ名と異なっている必要があります。

以下の例では、「MySource」というソースでアプリケーションログに書き込みをしています。

VB.NET
コードを隠すコードを選択
'ソース
Dim sourceName As String = "MySource"

'ソースが存在していない時は、作成する
If Not System.Diagnostics.EventLog.SourceExists(sourceName) Then
    'ログ名を空白にすると、"Application"となる
    System.Diagnostics.EventLog.CreateEventSource(sourceName, "")
End If

'テスト用にイベントログエントリに付加するデータを適当に作る
Dim myData() As Byte = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

'イベントログにエントリを書き込む
'ここではエントリの種類をエラー、イベントIDを1、分類を1000とする
System.Diagnostics.EventLog.WriteEntry( _
    sourceName, "イベントログに書き込む文字列", _
    System.Diagnostics.EventLogEntryType.Error, 1, 1000, myData)

'次のようにイベントソースとメッセージのみを指定して書き込むと、
'Information("情報")エントリとして書き込まれる。
'System.Diagnostics.EventLog.WriteEntry(
'    sourceName, "イベントログに書き込む文字列")
C#
コードを隠すコードを選択
//ソース
string sourceName = "MySource";

//ソースが存在していない時は、作成する
if (!System.Diagnostics.EventLog.SourceExists(sourceName))
{
    //ログ名を空白にすると、"Application"となる
    System.Diagnostics.EventLog.CreateEventSource(sourceName, "");
}

//テスト用にイベントログエントリに付加するデータを適当に作る
byte[] myData = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

//イベントログにエントリを書き込む
//ここではエントリの種類をエラー、イベントIDを1、分類を1000とする
System.Diagnostics.EventLog.WriteEntry(
    sourceName, "イベントログに書き込む文字列",
    System.Diagnostics.EventLogEntryType.Error, 1, 1000, myData);

//次のようにイベントソースとメッセージのみを指定して書き込むと、
//Information("情報")エントリとして書き込まれる。
//System.Diagnostics.EventLog.WriteEntry(
//    sourceName, "イベントログに書き込む文字列");

「イベントビューア」で書き込まれたエントリを確認すると、次のように表示されます。(ローカルコンピュータの「アプリケーションログ」に追加されます。)

コンピュータ名、ログの名前を指定してイベントログを書き込む

コンピュータ名、ログの名前を指定してイベントログを書き込むには、EventLogオブジェクトを作成し、MachineNameプロパティLogプロパティを設定して、WriteEntryメソッドを呼び出します。

以下にコンピュータ名とログの名前を指定してイベントログに書き込む例を示します。

VB.NET
コードを隠すコードを選択
'EventLogオブジェクトの作成
Dim elog As New System.Diagnostics.EventLog()
'コンピュータ名を設定する
elog.MachineName = "."
'ログの名前を設定する
elog.Log = "MyLog"
'ソース名を設定する
elog.Source = "MySource2"
'または、次のように1行で書くこともできる
'Dim elog As New System.Diagnostics.EventLog("MyLog", ".", "MySource2")

'ソースが存在していない時は、作成する
If Not System.Diagnostics.EventLog.SourceExists( _
        elog.Source, elog.MachineName) Then
    Dim escd As New System.Diagnostics.EventSourceCreationData( _
        elog.Source, elog.Log)
    escd.MachineName = elog.MachineName
    System.Diagnostics.EventLog.CreateEventSource(escd)
    '.NET Framework 1.1以前では、次のようにする
    'System.Diagnostics.EventLog.CreateEventSource( _
    '    elog.Source, elog.Log, elog.MachineName)
End If

'イベントログに書き込む
elog.WriteEntry("イベントログに書き込む文字列")

'閉じる
elog.Close()
C#
コードを隠すコードを選択
//EventLogオブジェクトの作成
System.Diagnostics.EventLog elog = new System.Diagnostics.EventLog();
//コンピュータ名を設定する
elog.MachineName = ".";
//ログの名前を設定する
elog.Log = "MyLog";
//ソース名を設定する
elog.Source = "MySource2";
//または、次のように1行で書くこともできる
//System.Diagnostics.EventLog elog =
//    new System.Diagnostics.EventLog("MyLog", ".", "MySource2");

//ソースが存在していない時は、作成する
if (!System.Diagnostics.EventLog.SourceExists(elog.Source, elog.MachineName))
{
    System.Diagnostics.EventSourceCreationData escd =
        new System.Diagnostics.EventSourceCreationData(elog.Source, elog.Log);
    escd.MachineName = elog.MachineName;
    System.Diagnostics.EventLog.CreateEventSource(escd);
    //.NET Framework 1.1以前では、次のようにする
    //System.Diagnostics.EventLog.CreateEventSource(
    //    elog.Source, elog.Log, elog.MachineName);
}

//イベントログに書き込む
elog.WriteEntry("イベントログに書き込む文字列");

//閉じる
elog.Close();

トレースでイベントログに書き込む

Trace、Debug、TraceSource、My.Application.Logなどを使ってトレースするときに、そのリスナにEventLogTraceListenerを追加することにより、イベントログに出力できるようになります。詳しくは、こちらをご覧ください。

  • 履歴:
  • 2006/11/28 ソースが存在していない時に作成するように変更。
  • 2007/1/26 .NET Framework 2.0に関する記述を追加。
  • 2007/2/10 「トレースでイベントログに書き込む」を追加。
  • 2014/1/7 UACに関する記述を追加、ソース名に関する注意を追加など。

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

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