1

次のようなアプリケーション コードがあるとします。

public void DoSomething()
{
    if (SomethingBad)
        throw new SomethingBadException("You did something bad");

    // Keep going...
}

私はlog4netを使用していますが、理想的にはその例外をログに記録したいと思いますが、次の注意事項があります:

  • この時点で例外をログに記録したいのですが、呼び出し元に依存してログに記録する必要はありません
  • ロガー名が正しくなるように、このクラスが所有するロガーを使用して例外をログに記録したい
  • この特定の例外タイプをログに記録したい場合もあれば、記録したくない場合もあるため、SomethingBadException にロギングについて知らせたくありません。NotSupportedException などの組み込み例外タイプにも同じパターンを使用したい
  • 例外/ロギング ステートメントが複雑すぎない再利用可能なパターンが必要です。ほとんどの作業を行うユーティリティ クラスを作成する必要がある場合は、これで問題ありません。
  • コール スタックを含む例外をログに記録したいのですが、これは、例外がスローされた後にログに記録する必要があることを意味します。例外が構築された後、例外がスローされる前にログに記録すると、ログ出力に空の呼び出しスタックが表示されます。

私はこれらの項目のほとんどを達成するユーティリティ コードをいくつか書くことができましたが、コール スタックのキャプチャを含む最後のコードは私にはわかりません。

これらすべてを達成する方法はありますか?カスタム log4net 拡張機能を喜んで作成します。また、Ninject の log4net 拡張機能を使用して、ロガーを作成しています。

私は間違った木を吠えていますか?私が行きたいところに私を連れて行く完全に別のアプローチはありますか?

4

2 に答える 2

2

コメントで言及されている余分なフレームの問題を取り除く簡単な方法を探しているときに、Environment.StackTrace に出会いました。それはあなたが望むものにより適しているかもしれません。

元の答えは次のとおりです。

log4netはわかりませんが、次のようなものがあなたの望むことをすると思います。

void ThrowLoggedException<T>() where T : Exception
{
    try
    {
        throw new T("You did something bad");
    }
    catch (Exception ex)
    {
        // Log event here.
        throw;
    }
}
于 2013-01-24T16:51:40.870 に答える
0

NLog を使用する - http://nlog-project.org/

より高度な Log4j スタイルの出力レイアウトでは、ログに記録するデータに関する多くのオプションが提供されます。

Log2Console と組み合わせて使用​​し、ログに記録されている内容をリアルタイムで表示します。

于 2013-01-24T16:42:37.243 に答える