C#でイベントログにレコードを書き込むコードを紹介します。
イベントログに書き込む場合は EventLog クラスのWriteEntry メソッドを利用します。
イベントログの書き込みは次の手順で実行します。
はじめにイベントログのソースを作成します。イベントログビューワーの[ソース]の列に表示されます。
EventLog.CreateEventSource()
メソッドを呼び出すことで作成できますが、管理者権限で実行していない場合は
アクセス権限がなくエラーとなります。そのため、管理者権限で動作しないプログラムの場合は、
あらかじめコマンドでイベントログのソースを作成しておく必要があります。
コマンドでイベントログのソースを作成する手順はこちらの記事を参照してください。
イベントログのソースが作成されている場合は、作成したイベントログのソースを指定して、EventLog.WriteEntry()
メソッドを呼び出すとイベントログに書き込みできます。
正攻法ではありませんが、他のイベントソースに書き込む方法もあります。
例えば、".NET Runtime" のソースを利用する方法があります。この場合イベントIDを既存のものと合わせないとIDがない旨のメッセージが記録されるため、注意が必要です。
下図のフォームを作成します。ボタンとテキストボックスを配置します。
下記コードを記述します。
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のイベントログ"
プロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。イベントログに書き込めた旨のメッセージがテキストボックスに表示されます。
イベントログを確認します。"My Application 01"のソースのイベントログが追加され、メッセージも描きこまれています。
なおイベントコードが5001の場合は、イベントを発生させるコンポーネントがインストールされていない旨の
エラーメッセージがイベントに書き込まれます。
他のイベントソースに書き込む例です。(正攻法な実装ではないです)
下図のフォームを作成します。ボタンとテキストボックスを配置します。
下記コードを記述します。
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()
メソッドを呼び出してイベントログに書き込みをします。
プロジェクトを実行します。下図のウィンドウが表示されます。
[button2]をクリックします。イベントに書き込まれた旨のメッセージがテキストボックスに表示されます。
イベントログを確認します。".NET Runtime"のソースでログが描きこまれていることが確認できます。
メッセージはプログラムで設定した"My Applicatoin 01のメッセージです。" 書きこまれています。
Windows Formアプリケーションを作成します。
下図のUIを作成します。フォームにボタンを1つ配置します。
下記のコードを記述します。ボタンの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]をクリックします。
ボタンをクリックすると下図の System.Security.SecurityEception
例外が発生します。これは管理者権限でアプリケーションが実行されていないため、ログへの書き込みができないためです。
ビルドされたアプリケーションから管理者権限で実行します。
実行ファイルを右クリックし、ポップアップメニューを表示します。メニューの[管理者として実行]をクリックします。
管理者としてアプリケーションが実行されます。[button1]をクリックします。冷害などは発生しません。
イベント ビューアーを開きイベントログを確認します。左側のツリービューで[Windows ログ]ノード内の[Application]ノードをクリックして選択します。下図の画面が表示されます。イベントログを確認すると、"SimpleEventLog Write" のソースのイベントログが書き込まれていることが確認できます。
イベントログの詳細を確認します。メッセージやイベントIDもプログラムで指定した値が書き込まれていることが確認できます。
イベントログに書き込みができました。