.NET TIPS

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

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

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

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

Windows OSに標準で搭載されている「イベント ビューア」
[スタート]メニューやデスクトップ上の[マイ コンピュータ]を右クリックして、表示されるコンテキスト・メニューから[管理]を選択すると表示される。
  左のツリーの[コンピュータの管理 (ローカル)]−[システム ツール]−[イベント ビューア]の配下が各イベント・ログだ。この例では「アプリケーション」「Internet Explorer」「Microsoft Office Diagnostics」「Microsoft Office Sessions」「セキュリティ」「システム」「Windows PowerShell」などの種類がある。
  [ソース]列はイベント・ソースだ。イベント・ソースはほとんどの場合、アプリケーション名を指す。

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

 本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列挙体のメンバは以下の表のとおりだ。

メンバ 説明
Information 情報。成功した操作を示す
Warning 警告。今後問題の原因となり得る問題を示す
Error エラー。ユーザーに知らせる必要がある重大な問題を示す
SuccessAudit 成功した監査。監査アクセスに成功したこと(例えば、ログオンに成功したなど)を示す
FailureAudit 監査エラー。監査アクセスに失敗したこと(ファイルを開けなかったなど)を示す
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名前空間)

この記事と関連性の高い別の.NET TIPS
テキスト・ファイルの内容を簡単に書き込むには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間