1

Topshelf.Log4Net および log4net を使用してカスタム イベント ログにログを記録するように、Topshelf ベースの Windows サービスを構成しようとしています。アプリケーションをコマンド ライン モードで実行すると、これで問題なく動作します。でサービスをインストールしようとするとBillsTestService.exe install、次のようになります。

INFO  Topshelf v3.1.107.0, .NET Framework v4.0.30319.18052
DEBUG Attempting to install 'BillsTestService'
Running a transacted installation.
...
Service BillsTestService has been successfully installed.
Creating EventLog source BillsTestService in log Application...

An exception occurred during the Install phase.
System.ArgumentException: Source BillsTestService already exists on the local computer.
...
   at System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData)

EventLog.DeleteEventSource("BillsTestService");インストールする前にLINQPadで実行してみました。それは成功しますが、その後のサービスのインストールはまだ失敗します。

私のlog4netアペンダー構成は次のとおりです。

<appender name="ErrorEventLogAppender" type="log4net.Appender.EventLogAppender" >
  <threshold value="ERROR" />
  <logName value="MyCompanyServices" />
  <applicationName value="BillsTestService" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%-5level %logger - %message%newline" />
  </layout>
</appender>

私は何を間違っていますか?

その目的は、複数のサービスがエラーを同じログ名 (異なるアプリケーション名) に記録することです。ログはオペレーションによって作成されます。

4

2 に答える 2

5

問題の一部は、インストール時に Topshelf がサービスにちなんで名付けられたイベントログ ソースを自動的に作成することです。log4net アペンダーの applicationName はイベントログ ソースとしても使用されるため、実際のアプリケーション/サービス名にすることはできません。ソースは、ローカル コンピューター上で一意である必要があります。log4net 構成の名前に「ソース」サフィックスを追加しました。

他の部分は、サービスがログを作成する権限を持っていないことです。新しいソースは作成できますが、新しいログは作成できません。これを行う1つの方法はコードです(私はLINQPadを使用しました):

EventLog.CreateEventSource("FOODEBUG", "MyCoSvc");

EventLog mylog = new EventLog("MyCoSvc");
mylog.Source = "FOODEBUG";

mylog.WriteEntry("This is a test.");

EventLog.DeleteEventSource("FOODEBUG");

ログを作成するために実際にログに書き込む必要があるかどうかはわかりません。これに2日以上費やした後、私はむしろ安全になりたい.

また、ログ名は 8 文字に制限されていることに注意してください。もっと長くすることもできますが、システムは最初の 8 文字のみを重要と見なします。

Chris Patterson が提案したように、log4net の初期化を移動する必要はありません。単に含む

configurator.DependsOnEventLog();
configurator.UseLog4Net("MyService.exe.config");

デリゲートでHostFactory.Run十分です。(Topshelf.Log4Net を使用しています。)

最後に、Windows イベント ログ システム全体が不安定であることはかなり確信しています。イベント ビューアーの更新がすべての場合に機能するとは限りません。ある時点で、アプリケーション ログのエントリが消えてしまいました。再起動後には別の結果が表示されたと思います。

于 2013-12-20T21:21:43.283 に答える
0

サービス クラスをインスタンス化する必要がないインストール/アンインストール時に使用するように指定する代わりに、log4net の初期化をサービスの ConstructUsing() 構成デリゲートに移動します。

または、実際のサービスが実行されているときにのみイベント ログ アペンダーを使用します。これには、構成ファイルの外にアペンダーを追加するか、構成を変更して、エラーまたは致命的なイベントが発生しない限り、イベント ログ アペンダーを削除します。

私の推測では、DEBUG/INFO レベルのイベントがアペンダーにログを記録しようとしており、ソースがまだ存在していません。

于 2013-12-19T16:29:50.090 に答える