C# Programming

Image

EventLogにログを書き出す


開発環境: Visual Studio 2003
次のような機能のForm アプリケーションを作る。
  • EventLog のアプリケーションログに、エラー、警告、情報 の各種類のログを書き出す。
  • EventLogの書き込みイベントを検出し、TextBoxに情報を書き出す。
今回作ったテスト用アプリケーション
Image
イベントビューアに情報、エラー、警告のイベントが書き出されているのがわかる。
Image
イベントのプロパティから、詳細情報がわかる。
Image

作り方

1. フォームに ツールボックスより、ボタン を貼り付ける。
2. フォームに ツールボックスより、テキストボックス を貼り付け、MultiLine = trueにする。
3. サーバーエクスプローラから イベントログ→アプリケーションを選び、フォーム上にDrag and Drop する。
Image
この時点で、次のようなコードが自動的に追加される。
                        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;
                }
                        
日付修正履歴
5/1初期バージョン作成

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;
                }
        }
}