2

私のソリューションにはいくつかのプロジェクトがあり、そのほとんどは Windows サービスです。それぞれに log4net を構成し (それぞれに個別のログ ファイルを生成)、log4net 用の Raygun アペンダーも用意しました。これらのプロジェクトごとに UnhandledException をキャッチし、それらがどこから発生したか (ログ ファイルと raygun ダッシュボードの両方) の情報を取得したいと考えており、ソリューション内のすべてのプロジェクトに対して 1 か所でこれを実行したいと考えています。

したがって、これらの例外をログに記録する別の静的クラスとメソッドを作成しました。

  • Logger 静的クラスではなく、そのエラーを生成したクラスがログ ファイルに表示されるように、例外をログに記録するにはどうすればよいですか (また、raygun.io ダッシュボードに例外の適切な発生源を表示させることもできます) =>

    Logger.UnhandledException [エラー] - これは間違っています。例外が発生した場所のクラス名にする必要があります

  • このためにスレッドセーフなシングルトンを作成しますか? これは正しいアプローチですか?

静的クラス:

public static class Logger
{
    private static readonly ILog Log = LogManager.GetLogger(Assembly.GetEntryAssembly().FullName);

    public static void UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Log.Error(e);
    }
}

Windows サービス:

private static void Main(string[] args)
{

        Configure.Serialization.Xml();

        // Unhandled exceptions - subscribe to the event (I would do this to all my projects in the solution)
        AppDomain.CurrentDomain.UnhandledException += Logger.UnhandledException;
}
4

1 に答える 1

2

未処理の例外が発生した場所のクラス名を取得する方法はありませんが、おそらくイベント ハンドラーのスタックでリフレクションを使用する方法があります。リリース ビルドではクラス名を取得できる保証はありません。

未処理の例外は、適切なエラー処理を備えた Windows サービスでは例外的Mainである必要があります。コードをtry..catch句でラップし、サービス コードで発生する可能性のある例外をキャッチします。未処理の例外が引き続き発生する場合は、少なくともスタック トレースを使用して、例外の発生元を特定できます。

于 2015-02-18T11:39:07.060 に答える