イベントログにログのレコード(エントリー)を書き込む

C#でイベントログにレコードを書き込むコードを紹介します。

概要

イベントログに書き込む場合は EventLog クラスのWriteEntry メソッドを利用します。

イベントログ書き込みの方針

イベントログの書き込みは次の手順で実行します。

1: イベントログソースの作成

はじめにイベントログのソースを作成します。イベントログビューワーの[ソース]の列に表示されます。
EventLog.CreateEventSource() メソッドを呼び出すことで作成できますが、管理者権限で実行していない場合は アクセス権限がなくエラーとなります。そのため、管理者権限で動作しないプログラムの場合は、 あらかじめコマンドでイベントログのソースを作成しておく必要があります。
コマンドでイベントログのソースを作成する手順はこちらの記事を参照してください。
補足
イベントログのソース作成は1度でよいです。

2: イベントの書き込み

イベントログのソースが作成されている場合は、作成したイベントログのソースを指定して、EventLog.WriteEntry() メソッドを呼び出すとイベントログに書き込みできます。

番外編: ほかのイベントソースに相乗りする

正攻法ではありませんが、他のイベントソースに書き込む方法もあります。
例えば、".NET Runtime" のソースを利用する方法があります。この場合イベントIDを既存のものと合わせないとIDがない旨のメッセージが記録されるため、注意が必要です。

プログラム例

UI

下図のフォームを作成します。ボタンとテキストボックスを配置します。
イベントログにログのレコード(エントリー)を書き込む:画像1

コード

下記コードを記述します。
using System.Diagnostics;

namespace WriteEventLogNet
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string SourceName = "My Application 01";
      if (EventLog.SourceExists(SourceName) == true) {
        string MessageText = "メッセージです。";
        int Eventid = 1001;
        EventLog.WriteEntry(SourceName, MessageText, EventLogEntryType.Information, Eventid);
      }
    }
  }
}

解説

既にソースは作成されている前提のプログラムのため、EventLog.SourceExists(SourceName) メソッドでソースの存在を 確認した後、EventLog.WriteEntry()メソッドを呼び出してイベントログに書き込みをします。

実行前の準備

管理者権限でコマンドプロンプトを表示し、以下のコマンドを実行します。
eventcreate /ID 1 /L APPLICATION /T INFORMATION /SO "My Application 01" /D "My Applicationのイベントログ"
イベントログにログのレコード(エントリー)を書き込む:画像2

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。
イベントログにログのレコード(エントリー)を書き込む:画像3

[button1]をクリックします。イベントログに書き込めた旨のメッセージがテキストボックスに表示されます。
イベントログにログのレコード(エントリー)を書き込む:画像4

イベントログを確認します。"My Application 01"のソースのイベントログが追加され、メッセージも描きこまれています。
イベントログにログのレコード(エントリー)を書き込む:画像5

なおイベントコードが5001の場合は、イベントを発生させるコンポーネントがインストールされていない旨の エラーメッセージがイベントに書き込まれます。
イベントログにログのレコード(エントリー)を書き込む:画像6

プログラム例:ほかのイベントのソースに書き込む

他のイベントソースに書き込む例です。(正攻法な実装ではないです)

UI

下図のフォームを作成します。ボタンとテキストボックスを配置します。
イベントログにログのレコード(エントリー)を書き込む:画像7

コード

下記コードを記述します。
button2を利用します。
using System.Diagnostics;

namespace WriteEventLogNet
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      string SourceName = ".NET Runtime";
      if (EventLog.SourceExists(SourceName) == true) {
        string MessageText = "My Applicatoin 01のメッセージです。";
        int Eventid = 1001;
        EventLog.WriteEntry(SourceName, MessageText, EventLogEntryType.Information, Eventid);
        textBox1.Text += "イベントログに書き込みました。";
      }
    }
  }
}

解説

既存のイベントソースに書き込みます。今回は .NET Runtime のイベントソースに書き込みます。 EventLog.SourceExists(SourceName) メソッドでソースの存在を 確認した後、EventLog.WriteEntry()メソッドを呼び出してイベントログに書き込みをします。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。
イベントログにログのレコード(エントリー)を書き込む:画像8

[button2]をクリックします。イベントに書き込まれた旨のメッセージがテキストボックスに表示されます。
イベントログにログのレコード(エントリー)を書き込む:画像9

イベントログを確認します。".NET Runtime"のソースでログが描きこまれていることが確認できます。 メッセージはプログラムで設定した"My Applicatoin 01のメッセージです。" 書きこまれています。
イベントログにログのレコード(エントリー)を書き込む:画像10

プログラム例:管理者権限で実行するプログラムの場合

Windows Formアプリケーションを作成します。

UI

下図のUIを作成します。フォームにボタンを1つ配置します。
イベントログにログのレコード(エントリー)を書き込む:画像11

コード

下記のコードを記述します。ボタンのClickイベントを実装します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace WriteEventLogSimple
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string SourceName = "SimpleEventLog Write";

      if (EventLog.SourceExists(SourceName) == false) {
        EventLog.CreateEventSource(SourceName, "");
        //EventLog.CreateEventSource(SourceName, "Application");
      }

      string Message = "イベントログの書き込みテストです。";
      int Eventid = 64000;
      EventLog.WriteEntry(SourceName, Message, EventLogEntryType.Information, Eventid);
    }
  }
}

解説

ログの書き込み前にログのイベントソースを作成する必要があります。ソース名は文字列で設定します。SourceExists() メソッドを呼び出しソース名のイベントソースがあるかを確認します。イベントソースが存在しない場合は、CreateEventSource() メソッドを呼び出しイベントソースを作成します。CreateEventSource の第一引数に作成するイベントソース名、第二引数にソースのエントリが書き込まれるログの名前を与えます。ログの名前は、"Application"、"System"、カスタムイベントログの名称を与えることができます。名前を空欄にした場合は "Application" が指定された場合と同様の動作になります。
  string SourceName = "SimpleEventLog Write";
  if (EventLog.SourceExists(SourceName) == false) {
    EventLog.CreateEventSource(SourceName, "");
    //EventLog.CreateEventSource(SourceName, "Application");
  }

下記のコードによりイベントログへ書き込みをします。WriteEntry() メソッドの第一引数に、イベントソース名、第二引数にイベントログに書き込むメッセージ、第三引数にイベントの種類、第四引数にイベントのIDを与えます。
  string Message = "イベントログの書き込みテストです。";
  int Eventid = 64000;
  EventLog.WriteEntry(SourceName, Message, EventLogEntryType.Information, Eventid);

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。[button1]をクリックします。
イベントログにログのレコード(エントリー)を書き込む:画像12

ボタンをクリックすると下図の System.Security.SecurityEception 例外が発生します。これは管理者権限でアプリケーションが実行されていないため、ログへの書き込みができないためです。
イベントログにログのレコード(エントリー)を書き込む:画像13

ビルドされたアプリケーションから管理者権限で実行します。
イベントログにログのレコード(エントリー)を書き込む:画像14

実行ファイルを右クリックし、ポップアップメニューを表示します。メニューの[管理者として実行]をクリックします。
イベントログにログのレコード(エントリー)を書き込む:画像15

管理者としてアプリケーションが実行されます。[button1]をクリックします。冷害などは発生しません。
イベントログにログのレコード(エントリー)を書き込む:画像16

イベント ビューアーを開きイベントログを確認します。左側のツリービューで[Windows ログ]ノード内の[Application]ノードをクリックして選択します。下図の画面が表示されます。イベントログを確認すると、"SimpleEventLog Write" のソースのイベントログが書き込まれていることが確認できます。
イベントログにログのレコード(エントリー)を書き込む:画像17

イベントログの詳細を確認します。メッセージやイベントIDもプログラムで指定した値が書き込まれていることが確認できます。
イベントログにログのレコード(エントリー)を書き込む:画像18
イベントログにログのレコード(エントリー)を書き込む:画像19

イベントログに書き込みができました。
AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2018-08-28
改訂日: 2025-01-04
Copyright © 1995–2025 iPentec all rights reserverd.