web-dev-qa-db-ja.com

Windowsサービスプログラムでのイベントのログ記録

Windowsサービスプログラムを作成しましたが、Windowsイベントログにエラーを厳密に書き込む必要があります。そこで、コードプロジェクトの記事から次の手順を実行しました。

http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

しかし、サービスを開始または停止したときに、イベントビューアーウィンドウで作成されたイベントログに書き込んだカスタムログメッセージは表示されません。また、メッセージがエラーによるものか、単なる情報なのかを指定するにはどうすればよいですか?

39
ArmenB

まず、 [〜#〜] msdn [〜#〜] はあなたの友達です。知っておくべき潜在的な落とし穴があるので、リンクを必ずチェックしてください。

基本的に、EventLogオブジェクトを作成します。

this.ServiceName = "MyService";
this.EventLog = new System.Diagnostics.EventLog();
this.EventLog.Source = this.ServiceName;
this.EventLog.Log = "Application";

上記のソースが存在しない場合は、ソースも作成する必要があります。

((ISupportInitialize)(this.EventLog)).BeginInit();
if (!EventLog.SourceExists(this.EventLog.Source))
{
    EventLog.CreateEventSource(this.EventLog.Source, this.EventLog.Log);
}
((ISupportInitialize)(this.EventLog)).EndInit();

そして、単にそれを使用します:

this.EventLog.WriteEntry("My Eventlog message.", EventLogEntryType.Information);

実際には非常に簡単です。

65
alphadogg

さまざまなStackOverflowの回答とMSDNを組み合わせることで、ようやくこれが機能するようになりました。

最初に次の名前空間を含めます

using System.ComponentModel;
using System.Diagnostics;

次に、コンストラクターでロギングをセットアップします

    public UserService1() 
    {
        //Setup Service
        this.ServiceName = "MyService2";
        this.CanStop = true;
        this.CanPauseAndContinue = true;

        //Setup logging
        this.AutoLog = false;

        ((ISupportInitialize) this.EventLog).BeginInit();
        if (!EventLog.SourceExists(this.ServiceName))
        {
            EventLog.CreateEventSource(this.ServiceName, "Application");
        }
        ((ISupportInitialize) this.EventLog).EndInit();

        this.EventLog.Source = this.ServiceName;
        this.EventLog.Log = "Application";
    }

次のように使用します。

    protected override void OnStart(string[] args)
    {
        base.OnStart(args);

        this.EventLog.WriteEntry("In OnStart");
    }
26
James Westgate