現在、多層アーキテクチャを使用して大規模なサブシステムをリファクタリングしており、効果的なエラーログ処理戦略の設計に苦労しています。
私のアーキテクチャは、次の3つのレイヤーで構成されているとしましょう。
- パブリックインターフェイス(IE MVCコントローラー)
- ドメイン層
- データアクセス層
私の混乱の原因は、エラーロギング\処理を実装する場所です。
最も簡単な解決策は、ログをトップレベル(IE Public Interface \ MVC Controller)に実装することです。しかし、これは間違っていると感じます。これは、異なるレイヤーを介して例外をバブリングし、ログに記録することを意味するためです。そのソースで例外をログに記録するのではなく。
私が最も多くの情報を持っているので、そのソースで例外をログに記録することは明らかに最適なソリューションです。これに関する私の問題は、すべての例外をキャッチせずにソースですべての例外をキャッチできないことであり、ドメイン/パブリックインターフェイスレイヤーでは、これはすでに下のレイヤーでキャッチされ、ログに記録され、再スローされた例外をキャッチすることになります。
もう1つの可能な戦略は、#1と#2の組み合わせです。これにより、スローされる可能性が最も高いレイヤーで特定の例外をキャッチし(
SqlExceptions
つまり、データアクセスレイヤーでキャッチ、ロギング、再スロー)、トップレベルでキャッチされなかった例外をログに記録します。しかし、これはまた、すでにログに記録されたエラーと処理されていないエラーを区別できないため、トップレベルですべての例外をキャッチして再ログする必要があります。
さて、これは明らかにほとんどのソフトウェアアプリケーションの問題であるため、例外がソースで捕捉され、一度ログに記録されるこの問題の標準的な解決策が必要です。しかし、自分でこれを行う方法がわかりません。
この質問のタイトルは「多層アプリケーションでの例外のロギング」に非常に似ていますが、その投稿の回答には詳細が欠けており、私の質問に答えるには不十分です。
The easiest solution would be to implement the logging at the top level
- これを行う。ソースで例外をログに記録することはお勧めできません。これを実行したすべてのアプリケーションは、デバッグするPITAでした。例外を処理するのは呼び出し元の責任である必要があります。
try{ ... } catch(Exception ex) { Log(ex); }
同じ例外がログに記録されます。(コードベースのすべてのレイヤーですべての例外をキャッチすることも、かなり悪い習慣のようです。)