|
EventLogにログを書き出す
|
開発環境: Visual Studio 2003次のような機能のForm アプリケーションを作る。
- EventLog のアプリケーションログに、エラー、警告、情報 の各種類のログを書き出す。
- EventLogの書き込みイベントを検出し、TextBoxに情報を書き出す。
今回作ったテスト用アプリケーション
イベントビューアに情報、エラー、警告のイベントが書き出されているのがわかる。
イベントのプロパティから、詳細情報がわかる。
作り方
1. フォームに ツールボックスより、ボタン を貼り付ける。
2. フォームに ツールボックスより、テキストボックス を貼り付け、MultiLine = trueにする。
3. サーバーエクスプローラから イベントログ→アプリケーションを選び、フォーム上にDrag and Drop する。
この時点で、次のようなコードが自動的に追加される。
this.eventLog1 = new System.Diagnostics.EventLog();
....
//
// eventLog1
//
this.eventLog1.Log = "Application";
this.eventLog1.MachineName = "Uchukamen";
this.eventLog1.SynchronizingObject = this;
Log は、通常はアプリケーションなので "Application"で問題ない。
MachineName は、自動的に COMPUTERNAME が設定される。
EventLog の種類
イベントログの種類 | 説明 |
アプリケーションログ | アプリケーションによって記録されたイベント |
セキュリティログ | 有効なログオンと無効なログオンのようなイベント
リソースの使用に関連するイベント (ファイルなどのオブジェクトの作成、オープン、削除など)
|
システムログ | Windows のシステム コンポーネントによって記録されたイベント
システム コンポーネントによって記録されるイベントの種類は、あらかじめ決定されています。 |
ディレクトリ サービス ログ | ドメインコントローラのみ(Windows ディレクトリ サービスによって記録されたイベント) |
ファイル複製サービス ログ | DNS サーバーのみ(Windowsファイル複製サービスによって記録されたイベント) |
EventLog に表示される項目
プロパティ | 説明 |
ソース | イベントをログに記録したプログラム名、またはサブコンポーネント名 |
種類 | エラー、情報、警告、成功の監査、失敗の監査のいずれか。 |
分類 | この情報は、主にセキュリティ ログで使われる。アプリケーションログでは、必須ではない。 |
Event の種類
イベントの種類 | 説明 |
エラー | データや機能の損失などの重大な問題。
たとえば、起動時にサービスを読み込めなかった場合など。 |
警告 |
必ずしも重大でないが、将来問題になりそうなイベント。
たとえば、ディスクの空き容量が少なくなったときなど。
|
情報 | アプリケーション、ドライバ、またはサービスの成功した操作を記述するイベント。 |
成功の監査 |
監査していたセキュリティ アクセス操作が成功したことを知らせるイベント。
たとえば、ユーザーがシステムへのログオン試行に成功したときなど。
|
失敗の監査 |
監査していたセキュリティ アクセス操作が失敗したことを知らせるイベント。
たとえば、ユーザーがネットワーク ドライブへのアクセスに失敗したときなど。
|
5. あとは、次のようにボタンのイベントにイベントログを書き出す処理を追加すればよい。
private void OnClick(object sender, System.EventArgs e)
{
this.eventLog1.Source = "Test EvengLog";
// 通常、アプリケーションログにはカテゴリーを設定しない。
short category = 0;
// エラーログの出力
int eventID = 1;
byte [] rawData = new byte[]{1,2,3};
this.eventLog1.WriteEntry("Test EvengLog のエラー\nHello...",
System.Diagnostics.EventLogEntryType.Error,
eventID, category, rawData);
// 情報ログの出力
eventID = 2;
string infoMsg = "Test EvengLog の情報\n\\nで複数ラインのエラーメッセージを表示できます。\nまた、rawDataにより、データを表示できます。";
this.eventLog1.WriteEntry(infoMsg,
System.Diagnostics.EventLogEntryType.Information,
eventID, category, rawData);
// 警告ログの出力
eventID = 3;
this.eventLog1.WriteEntry("Test EvengLog の警告",
System.Diagnostics.EventLogEntryType.Warning,
eventID, category, null);
}
6. アプリケーションがイベントに書き込むたびに発生するイベントを処理するようにする。
これは単なる機能確認のためで、イベントを書き出すためだけであれば必要ない。
イベントログのプロパティ→EntryWritten イベントに イベントが書き込まれたときに呼ばれるコールバックを追加する。
ここでは、EntryWrittenEventArgs から必要な情報を取り出し、TextBoxに書き出すだけ。
EnableRasingEvent プロパティを true にしないと、イベントがあがらないので注意。
private void OnEntryWritten(object sender, System.Diagnostics.EntryWrittenEventArgs e)
{
this.textBox1.Text +=
"\r\n------------------------------" +
"\r\nMachineName: " + e.Entry.MachineName +
"\r\nSource: " + e.Entry.Source +
"\r\nCategory: " + e.Entry.Category +
"\r\nEventID: " + e.Entry.EventID +
"\r\nMessage: " + e.Entry.Message;
}
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace EventViewer
{
/// <summary>
/// Form1 の概要の説明です。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Diagnostics.EventLog eventLog1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox1;
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows フォーム デザイナ サポートに必要です。
//
InitializeComponent();
//
// TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
//
}
/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.eventLog1 = new System.Diagnostics.EventLog();
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
((System.ComponentModel.ISupportInitialize)(this.eventLog1)).BeginInit();
this.SuspendLayout();
//
// eventLog1
//
this.eventLog1.EnableRaisingEvents = true;
this.eventLog1.Log = "Application";
this.eventLog1.MachineName = "Uchukamen";
this.eventLog1.SynchronizingObject = this;
this.eventLog1.EntryWritten += new System.Diagnostics.EntryWrittenEventHandler(this.OnEntryWritten);
//
// button1
//
this.button1.Location = new System.Drawing.Point(328, 16);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(88, 32);
this.button1.TabIndex = 0;
this.button1.Text = "Write EventLog";
this.button1.Click += new System.EventHandler(this.OnClick);
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(16, 16);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.textBox1.Size = new System.Drawing.Size(296, 152);
this.textBox1.TabIndex = 1;
this.textBox1.Text = "";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
this.ClientSize = new System.Drawing.Size(424, 190);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.textBox1,
this.button1});
this.Name = "Form1";
this.Text = "Test EventLog";
((System.ComponentModel.ISupportInitialize)(this.eventLog1)).EndInit();
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void OnClick(object sender, System.EventArgs e)
{
this.eventLog1.Source = "Test EvengLog";
// 通常、アプリケーションログにはカテゴリーを設定しない。
short category = 0;
// エラーログの出力
int eventID = 1;
byte [] rawData = new byte[]{1,2,3};
this.eventLog1.WriteEntry("Test EvengLog のエラー\nHello...",
System.Diagnostics.EventLogEntryType.Error,
eventID, category, rawData);
// 情報ログの出力
eventID = 2;
string infoMsg = "Test EvengLog の情報\n\\nで複数ラインのエラーメッセージを表示できます。\nまた、rawDataにより、データを表示できます。";
this.eventLog1.WriteEntry(infoMsg,
System.Diagnostics.EventLogEntryType.Information,
eventID, category, rawData);
// 警告ログの出力
eventID = 3;
this.eventLog1.WriteEntry("Test EvengLog の警告",
System.Diagnostics.EventLogEntryType.Warning,
eventID, category, null);
}
private void OnEntryWritten(object sender, System.Diagnostics.EntryWrittenEventArgs e)
{
this.textBox1.Text +=
"\r\n------------------------------" +
"\r\nMachineName: " + e.Entry.MachineName +
"\r\nSource: " + e.Entry.Source +
"\r\nCategory: " + e.Entry.Category +
"\r\nEventID: " + e.Entry.EventID +
"\r\nMessage: " + e.Entry.Message;
}
}
}