ここでは、Windowsのイベントログにエントリを書き込む方法を紹介します。
なおWindows Vista以降でUACが有効になっている時は、管理者に昇格しないと失敗するかもしれません。この対処法については、「Vista以降でUACが有効だとファイルの作成等に失敗する問題の対処法」をご覧ください。
アプリケーションログにエントリを書き込むには、EventLogクラスの静的なWriteEntryメソッドを使用するのが簡単です。このとき、指定したソースが存在していない場合は、EventLog.CreateEventSourceメソッドで作成しておきます。
注意:CreateEventSourceメソッドで新しく作成するソースの名前は、すでに存在しているソース名やログ名と異なっている必要があります。
以下の例では、「MySource」というソースでアプリケーションログに書き込みをしています。
'ソース 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, "イベントログに書き込む文字列")
//ソース 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メソッドを呼び出します。
以下にコンピュータ名とログの名前を指定してイベントログに書き込む例を示します。
'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()
//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を追加することにより、イベントログに出力できるようになります。詳しくは、こちらをご覧ください。