web-dev-qa-db-ja.com

スローされたすべての例外をログに記録する方法は?

スローおよびキャッチされた例外をログに記録するにはどうすればよいですか? VisualStudioのIntelliTraceのようなものがあります。または、InteliTraceをアプリケーションのデバッグバージョンに統合して、そのログを表示する方法はありますか?

更新:それを少し明確にします。標準の.txt(またはカスタム)ログが必要です。形式は関係ありません。重要な点は、コードを追加せずに、すべてのサードパーティライブラリで発生したすべての例外をログに記録したいということです。

26
Poma

あなたが探している機能はFirstChanceExceptionと呼ばれ、 AppDomain.FirstChanceException Event からアクセスできると思います。

基本的に、このイベントは、any(管理対象)例外がAppDomainでスローされることに関する情報を取得するためのフックを提供します。この方法で例外を処理することはできませんnot!一種の通知に過ぎません


更新:別の回答に対する「飲み込まれた例外」についてのあなたのコメントに関して-そして暗闇の中へのショット:
x64システムでは、WindowsのonLoadメソッドでスローされる例外をMain()メソッドでキャッチできません。
参照 this SO article


更新2:Threadsについては、自分で実装する必要があると思います。これにはある種のポーリングが含まれ、パフォーマンスが低下しますが、デバッグの場合はほとんどの場合問題ないと思います。これは、

var threads = Process.GetCurrentProcess().Threads;
28
yas4891

あなたはアスペクトで行くかもしれません。たとえば、 PostSharp を取り、すべての関数のtry-catchを作成するアスペクトを作成すると、ロギングはアスペクトで実行されます。ログに記録した後、それを再スローします。

デモコードで完全な答えを得るための彼らのウェブサイトからのサンプルコード:

/// <summary>
/// Aspect that, when applied on a method, catches all its exceptions,
/// assign them a GUID, log them, and replace them by an <see cref="InternalException"/>.
/// </summary>
[Serializable]
public class ExceptionPolicyAttribute : OnExceptionAspect
{
    /// <summary>
    /// Method invoked upon failure of the method to which the current
    /// aspect is applied.
    /// </summary>
    /// <param name="args">Information about the method being executed.</param>
    public override void OnException(MethodExecutionArgs args)
    {
        Guid guid = Guid.NewGuid();

        Trace.TraceError("Exception {0} handled by ExceptionPolicyAttribute: {1}",
            guid, args.Exception.ToString());

        throw new InternalException(
            string.Format("An internal exception has occurred. Use the id {0} " +
                "for further reference to this issue.", guid));
    }
}

編集:

Log4net、NLog、エンタープライズライブラリなどのロガーを使用できます(ロギングやその他の作業を行うための私の好みの方法)。しかし、それは実際にはここでのタスクではありません。タスクは-私見-できるだけ少ない手動コーディングでプロジェクトにログインを注入することです。

5
Sascha

log4Netを使用してみてください-その優れたロガーであり、これらのシナリオで多く使用されています http://sourceforge.net/projects/log4net/

1
Dean Chalk

処理された例外については、それらを明示的にログに記録する必要があります。意味的にはそうではない場合でも、処理された例外と処理されていない例外には大きな違いがあります。

処理された例外は、もはや例外的な状況ではありません。コードを書いている人が言った。私はこの例外を処理し、その後正しく続行する方法を知っています。

未処理の例外については、 Elmah をご覧ください。

1
Rune FS

WinDbgのようなデバッガーをプロセスに接続し、最初の偶然のCLR例外でそれを中断させることができます。これには、サードパーティライブラリの例外が含まれます。これを行う方法の例については、 ここ を参照してください。

1
Polyfun

モノがWebのものである場合は、 https://elmah.github.io/ を使用して、エラーを自動的にログに記録できます(サービスを停止することもありません!)

0
Loofer

一部の人が提案したLog4Netの代わりに、 NLog を使用することもできます。 2つのソリューションの違いはわかりませんが、NLogに満足していることはわかっています。

0
Otiel

独自のログシステムを使用することも、log4netと呼ばれるサードパーティのライブラリを使用することもできます。

0
Zenwalker