6

開発のどの段階でアプリケーションにロギングやトレースを追加するのか興味がありますか?

私は .Net スタックと log4net (commons.logging 経由) を使用しています。100% ではないことは確かですが、一般的に開発に TDD アプローチを採用しています。私のアプリケーションはすべてサーバー側にあります。たとえば、Web サービス、バスからメッセージを消費する Windows サービス、asp.net mvc ビジネス管理アプリです。等..

アプリケーション サービスのメソッドを説明的な logger.INFO "Getting cakes from repository" で装飾していることに気付きました。いくつかの作業..「リポジトリから5つのケーキを取得しました。」、そして、アプリのドメインからlogger.FATALへの未処理のexpcetionハンドラーが発生し、予期しない例外が発生しました。

しかし、私は通常、開発の開始時ではなく、開発の終わり近くに戻ってこれらを適用することになり、1ダースまたは2つしかない場合があります. ICakeRepository の実装などの下位レベルのクラスをロガーのもので装飾することはほとんどありません。

構成を介してオンにしたトレースについては、IOC フレームワークを使用してメソッド呼び出しとインスタンス作成をインターセプトすることを考えています。

4

4 に答える 4

2

私のソフトウェアはレイヤーにあり、各レイヤー間に明確に定義されたAPIがあります。私は最初からこれらのAPIのロギングを実装する傾向があるため、特定のトランザクションについて、基礎となる各レイヤーでAPI呼び出しがどのように発生するかを確認できます。間違いがある場合は、特定のレイヤーに絞り込むのに役立ちます。層。ロギングは、問題の原因となった以前のすべての通常のアクティビティのログを表示することにより、問題を再現するのにも役立ちます。

また、可能な場合は各レイヤー内にアサーションを追加し、アサーションの失敗をログに記録します。

したがって、ログファイルには、パブリックAPIへの一連の呼び出しが示され、内部からエラーメッセージが生成されることがよくあります。これは、多くの場合、問題を診断するのに十分です。

それを超えて、必要に応じてデバッグレベルのログを追加します。開発中および/またはリリース後に特定の問題をデバッグするためです。

ロギングを気にする私の理由は、以下で部分的に説明されています。

リリースされたソフトウェアのバグを修正するために、私はログファイルに依存しています。また、開発中のソフトウェアについても同じことがよくあります。


あなたが言った、

ICakeRepositoryの実装など、低レベルのクラスをロガーのもので飾ることはめったにありません。それは無意味に思えます。

私は言った、

私のソフトウェアはレイヤーにあり、各レイヤー間に明確に定義されたAPIがあります。私は最初からそれらのAPIのロギングを実装する傾向があります...

私が「レイヤー」とは何を意味するのかを説明したほうがいいと思います。これは、「下位レベル」のクラスと同じである場合とそうでない場合があります。

たとえば、私のシステムには次のレイヤーがある場合があります。

  • UI
  • ビジネスレイヤー(データ操作のルール)
  • データアクセス層(データベースI / O用)
  • データベース

その場合、次のインターフェースまたはAPIがあり、ロギングに値する可能性があります。

  • ユーザーとUIの間(つまり、UIイベント、マウス、キーボード)
  • UIとビジネスレイヤーの間(「控えめなダイアログボックス」を参照)
  • ビジネスレイヤーとDALの間
  • DALとデータベースの間

あるいは、システムは2つのピアエンドポイントを接続するコンポーネントのチェーンである場合があります(「トップ」レイヤーと「ボトム」レイヤーはそれほど明確ではありません)。

いずれにせよ、私がログに記録しているのは、各コンポーネントのパブリックファサードであるAPIです。これは、いくつかの理由でログに記録するのに適しています。

  • それほど複雑ではありません(ファサードは、基盤となる/内部実装よりも単純になる傾向があります)
  • 良好なカバレッジ(ファサード全体をログに記録し、コンポーネントに入る唯一の方法がファサードを経由する場合、コンポーネントに入るすべてのものをログに記録したことがわかります)
  • コンウェイの法則とうまく連携します。それぞれが異なるチームによって開発された複数のコンポーネントでシステムをデバッグする場合、よくある質問の1つは、「どのコンポーネントに障害があるので、どのチームがデバッグする必要があるか」です。
于 2009-06-28T14:11:45.703 に答える
1

ロギングとトレースは横断的関心事である必要があります。アスペクト指向プログラミングを使用している場合は、宣言型の方法でいつでもそれらを追加/削除できます。

于 2009-06-28T14:05:38.120 に答える
0

「リポジトリからケーキを取得する」がINFOに最も適しているとは言えません。DEBUG や TRACE にも適しています。通常、「ユーザー A に残されたケーキはありません」など、機能的なものをログに記録するために INFO を使用します。非機能的なものと技術的なフローは、IMHO の重大度を低くする必要があります。アプリケーションが完全に死んでいる時点に到達しない限り、例外をログに記録するために FATAL を使用しません。エラーがより良い選択であり、場合によっては警告でさえありますが、例外がどれほど悪いかによって異なります。AOPインターセプターに関しては、前回チェックしたとき、これらはパフォーマンスに大きく影響します。クールでセクシーなコンセプトですが、私の場合は実用的ではありませんでした. AOP の利点を説明する本や記事からのデモや簡単な例以上のことはわかりません。したがって、完全に依存する前に再確認します。

于 2009-06-28T11:23:59.133 に答える