10

私はWindowsサービスにかなり慣れていません。c# Windows サービスのインストーラーを作成しましたが、サーバー (Windows Server 2003) へのインストールは正常に行われたようです。起動すると、ログに書き込みService started successfullyます。停止中は と書き込みますService stopped successfully。ただし、ログに何も書き込まずにサービスが停止する場合があるため、手動でバックアップを開始します。後でログを見るとService started successfully、予想通りと書かれています。ログに 2 回続けて表示されるのは、サービスが何らかの理由で実行を停止したエントリが明らかに欠落しているということです。

これの潜在的な原因は何ですか?サービスを自動として設定し、すべてのユーザーに対して実行するようにインストールしました。これは、マシンが起動するたびにサービスが自動的に開始されることを意味するという印象を受けました. 停止した理由を調べるにはどうすればよいですか? クラッシュしたサービスは自動的にイベント ログに書き込みますか? それとも、クラッシュの独自の理由をログに記録するような方法で例外を処理する必要がありますか?

編集:いくつかの追加情報:

  • ローカル システム アカウントとしてログオンするように設定しました
  • [回復オプション] で、最初の失敗時に再起動するように設定しました。2回目以降の失敗については何もありません。

更新:回答者は、グローバル例外ハンドラーを推奨しました。これを永続的な修正として実装するつもりはありませんが、少なくとも問題が発生している場所を特定するのに役立ちます。インストールしたサービスで実際にこれをテストしたところ、動作しました。未処理の例外が実際にログに何も書き込まずにサービスをクラッシュさせることがわかりました。少なくともアプリケーションエラーが報告されると思っていましたが、そうではありません。

static void Main()
{
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    //other code here
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Utilities.WriteIt(e.ExceptionObject as Exception);
}
4

3 に答える 3

6

例外を処理するのが常に最善です。少なくともグローバル例外ハンドラーを使用して、ログファイルに書き込みます

于 2012-05-21T12:52:24.650 に答える
3

例外処理やロギングを行わずに、サービスが予期せず失敗しているようです。Windowsサービスは、イベントログに例外を自動的に書き込みません。例外を処理し、(致命的である場合は)問題を診断できるようにどこかに書き出すのはユーザーの責任です。

少なくとも、どこかにログファイル(おそらくサービス実行可能フォルダーにあるか、できればアクセスが簡単で許可の問題にぶつからない場所にある)と、すべての例外ハンドラーが実行する標準のログ方法をお勧めします。メッセージを書き込むために呼び出します。

于 2012-05-21T12:54:20.600 に答える
0

なんらかの例外が原因でサービスが予期せず終了した場合、それがイベント ログに自動的に記録されるかどうかはわかりません。

より完全なロギングのために、log4netのようなロギング スイートを強くお勧めします。多数のロギング「レベル」を提供できます (コードに到達したかどうかを確認するためのデバッグ トレース、重要なイベントの情報トレース、例外をログに記録するためのエラー トレース)。

EventLogAppender の例については、こちらを参照してください。ただし、最も簡単に作成できるログの 1 つである FileAppender を取得することから始めて、最初に作業してから、イベント ログ用に 2 つ目のアペンダーを追加することをお勧めします。

于 2012-05-21T13:03:14.433 に答える