イベント・ログにエントリを書き込むには?(基本編)[C#、VB] − @IT

 

.NET TIPS

イベント・ログにエントリを書き込むには?(基本編)[C#、VB]

デジタルアドバンテージ 一色 政彦
2008/08/07

 Windows OSには、システムやアプリケーションで起こった問題(エラーなど)を記録するためのイベント・ログという仕組みがある。

 システムやアプリケーションで何らかのトラブルがあった際には、Windows OSに標準で搭載されている「イベント ビューア」(下の画面を参照)でイベント・ログの内容を閲覧して情報を収集し、問題解決の糸口とすることも多々あり、イベント・ログはWindowsの運用管理にとって欠かせないものといえるだろう(ただし、Windows 98やMeなど、いわゆる9x系Windowsではイベント・ログはサポートされていないので注意してほしい)。

 なお、イベント・ログに登録された(=書き込まれた)各項目は、通常「イベント」と呼ばれ、プログラミングでは項目という意味で「エントリ」と呼ぶ。

 本TIPSでは、イベント・ログにエントリを書き込む方法を紹介する。

イベント・ログの書き込みで必要な情報

 エントリを書き込むには、最低、以下の3点をあらかじめ決めておく必要がある。

  • コンピュータ名
  • イベント・ログ名
  • イベント・ソース名

 コンピュータ名とは、つまり、どのコンピュータのイベント・ログに書き込むかということだが、通常はローカル・コンピュータであろう。ローカル・コンピュータの場合は「.」と記述すればよい。

 イベント・ログ名は、上の画面でも示されているとおり、「アプリケーション」「セキュリティ」「システム」などがある。通常は「アプリケーション」イベント・ログを指定すればよい。「アプリケーション」を指定するには、「Application」と記述する。これら標準のもの以外に、独自のイベント・ログを作成することもできる。これについては後日あらためて紹介する。

 イベント・ソース名は、エントリがどこから登録されたものかを示すもので、通常はアプリケーション名となる。

 ここではサンプルとして、ローカル・コンピュータ(.)の「アプリケーション」(Application)イベント・ログに、「SampleSource」というイベント・ソース名でエントリを書き込んでみよう。

 実際にエントリを書き込む前に、イベント・ソースをあらかじめ作成しておく必要がある。今回の「SampleSource」イベント・ソースは独自に決めたもので、既存のものではないからだ。

イベント・ソースを作成する方法

 イベント・ソースを作成するには、EventLogクラス(System.Diagnostics名前空間)の静的メソッドCreateEventSourceを呼び出す。

 CreateEventSourceメソッドは、.NET Framework 1.xと2.0以降では推奨される使い方が若干ことなる。.NET Framework 1.xでは、CreateEventSourceメソッドの第1引数にイベント・ソース名、第2引数にイベント・ログ名、第3引数にコンピュータ名を指定して呼び出すだけだ。.NET Framework 2.0以降では、引数としてEventSourceCreationDataクラス(System.Diagnostics名前空間)のオブジェクトを指定する。

 EventSourceCreationDataオブジェクトを取得するには、EventSourceCreationDataクラスのコンストラクタの、第1引数にイベント・ソース名、第2引数にイベント・ログ名を指定してオブジェクト生成(new)すればよい。

 EventSourceCreationDataオブジェクトを生成すると、その初期状態でコンピュータ名はローカル・コンピュータ(.)になっているので、今回の場合は設定が不要だが、コンピュータ名を変更したい場合は、EventSourceCreationDataオブジェクトのMachineNameプロパティに指定すればよい。

既存のイベント・ソースが存在する場合の対処

 新規にイベント・ソースを作成する場合には、上記の作成手順のみでよいが、イベント・ソースがすでに存在するかどうか分からない場合には、EventLogクラスの静的メソッドSourceExistsでその有無を判定した方がよい。

 SourceExistsメソッドは、第1引数にイベント・ソース名、第2引数にコンピュータ名を指定する(ローカル・コンピュータの場合は、第2引数は指定しなくてもよい)。戻り値がtrueの場合はそのイベント・ソースは存在し、falseの場合は存在しない。

 従って今回の場合、SourceExistsメソッドがfalseのときのみ、CreateEventSourceメソッドでイベント・ソースを作成すればよい。

 以上で準備が完了したので実際にエントリを書き込もう。

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

 イベント・ログにエントリを書き込むには、EventLogクラスのオブジェクトのWriteEntryメソッドを呼び出す。

 まずEventLogオブジェクトを取得するには、コンストラクタの第1引数にイベント・ログ名、第2引数にコンピュータ名、第3引数にイベント・ソース名を指定してオブジェクト生成(new)する。

 次にWriteEntryメソッドを呼び出すには、第1引数にエントリで書き込むメッセージ内容を、第2引数にEventLogEntryType列挙体(System.Diagnostics名前空間)の値を指定して呼び出せばよい(さらにこのほかの情報を第3引数以降で設定できるが、これについては後日公開予定の「TIPS:イベント・ログにエントリを書き込むには?(応用編)」で紹介する)。

 EventLogEntryType列挙体のメンバは以下の表のとおりだ。

 以上の説明を実装したのが、次のサンプル・コード(コンソール・アプリケーション)だ(.NET Framework 2.0の場合)。

using System.Diagnostics;

class Class1


{
  static void Main(string[] args)
  {
    string cpt = ".";             // コンピュータ名
    string log = "Application";   // イベント・ログ名
    string src = "SampleSource";  // イベント・ソース名

    if (!EventLog.SourceExists(src, cpt))


    {
      EventSourceCreationData data =
        new EventSourceCreationData(src, log);
      EventLog.CreateEventSource(data);
    }

    EventLog evlog = new EventLog(log, cpt, src);


    evlog.WriteEntry("メッセージ", EventLogEntryType.Error);
  }
}
Module Module1

  Sub Main()

    Dim cpt = "."             ' コンピュータ名


    Dim log = "Application"   ' イベント・ログ名
    Dim src = "SampleSource"  ' イベント・ソース名

    If Not EventLog.SourceExists(src, cpt) Then


      Dim data As New EventSourceCreationData(src, log)
      EventLog.CreateEventSource(data)
    End If

    Dim evlog As New EventLog(log, cpt, src)


    evlog.WriteEntry("メッセージ", EventLogEntryType.Error)

  End Sub

End Module

イベント・ログを書き込むサンプル・プログラム(上:C#、下:VB)

 このサンプル・プログラムを実行すると、「メッセージ」という内容のエントリがイベント・ログに書き込まれる。End of Article

カテゴリ:クラス・ライブラリ 処理対象:イベント・ログ
使用ライブラリ:EventLogクラス(System.Diagnostics名前空間)
使用ライブラリ:EventSourceCreationDataクラス(System.Diagnostics名前空間)

使用ライブラリ:EventLogEntryType列挙体(System.Diagnostics名前空間)



TechTargetジャパン