[logging] ロギングレシオのコードですか?


6 Answers

log4netはリソースを詰まらせることなく素晴らしい仕事をしているので、デバッグモードに変更する必要があるときは、情報が豊富であるほど、ログを少し冗長にする傾向があります。 ここに私が典型的に記録するものがあります:

DEBUGレベル

  • メソッドに渡されるパラメータ
  • 私が検索した結果セットの行数
  • メソッドに渡されると疑わしいデータを含む可能性のあるデータロー
  • 環境によって「つなぎ合わせられた」ときに混乱する可能性のある、「生成された」ファイルパス、接続文字列、またはその他の値。

情報レベル

  • メソッドの開始と終了
  • 主要ループの開始と終了
  • 主要なcase / switch文の開始

エラーレベル

  • 処理された例外
  • 無効なログイン試行(セキュリティが問題の場合)
  • 私が傍受した不正なデータ

致命的なレベル

  • 未処理の例外。

また、多くのロギングの詳細を持つことで、エラーメッセージが表示されたときに何をしているのかをユーザーに尋ねることができなくなります。 私は簡単に一緒にそれを作ることができます。

Question

ロギングレシオに対する理想的なコードは何ですか? 私が開発したほとんどのアプリケーションでは多くのログがなかったので、ログを書くのに慣れていません。

最近私は仕事を変えましたが、私はlog4netへの呼び出しのアプリケーションコードを見ることができないことに気付きました。 これは便利だが、あまりにも多くのデバッグステートメントを持っていることは確かにまったく悪いことである。

すべてのメソッドがいつ開始し、終了するのか、そしてそれらが何を返すのかを示すロギングステートメントがあります。 かなり多くのことが行われたとき。

ロギングステートメントをコンパイル時に追加するためにリフレクションを使用していたアドオンを持っていて、コードを見ようとしていないようになっていないのは簡単でしょうか?

また、強力なIDEとリモートデバッグのこれらの日では、多くのログは本当にnescisaryですか?




また、強力なIDEとリモートデバッグのこれらの日では、多くのログは本当にnescisaryですか?

はい、まったくですが、多くの未熟な開発者が間違っているのは間違った方法でバグを修正しようとすることですが、通常はデバッグするときにログを取る傾向があります。 それぞれのための場所がありますが、ロギングがほとんど常に必要となる領域は少なくともいくつかあります。

  • リアルタイムコードの問題を調べるために、デバッガで一時停止すると計算結果に影響を与えることがあります(与えられたロギングはこのようなリアルタイムプロセスのタイミングにわずかな影響を与えますが、
  • デバッガにアクセスできないベータテスタや他の同僚に送信されたビルド
  • デバッガ内で見やすくないデータをディスクにダンプする場合。 たとえば、STL構造を正しく解析できないIDEがあります。
  • あなたのプログラムの通常の流れを「感じる」ために
  • コメントに加えてコード読みやすくするために、次のようにします:
// Now open the data file
fp = fopen("data.bin", "rb");

上記のコメントは、ロギングコールと同じように簡単に配置できます。

const char *kDataFile = "data.bin";
log("Now opening the data file %s", kDataFile);
fp = fopen(kDataFile, "rb");

それは、あなたはいくつかの点で正しいと言いました。 ロギングメカニズムを栄誉あるスタックトレースロガーとして使用すると、開発者が検討するのに十分な障害ポイントを提供しないため、非常に品質の低いログファイルが生成されます。 だからここの鍵は明らかに、ロギングコールの正確で賢明な使用です。私はそれが開発者の裁量に委ねられていると思います。 基本的には自分自身でログファイルを作成していると考える必要があります 。 あなたのユーザーは気にせず、いつも大部分が内容を誤って誤って解釈しますが、少なくともあなたのプログラムが不正行為をした理由を特定するために使用することができます。

また、ログファイルが特定のバグの直接の原因を指摘することはまれです。 私の経験では、通常、バグをどのように複製するか、それを複製するか、デバッグするか、問題の原因を特定する方法について、いくつかの洞察を提供します。




他の要素は、使用されているツールセット/プラットフォームとそれに付随する規則です。 たとえば、J(2)EEの世界ではロギングがかなり普及しているようですが、Ruby on Railsアプリケーションでログステートメントを書くのは覚えていません。




顧客のシナリオ(マシンに物理的なアクセス権を持たない人)がいる場合、「ロギングが多すぎる」とは、関数を再描画することとほとんど何も呼び出されないことです(ほとんど何もないはずです)。 または、動作中に秒当たり100秒と呼ばれる他の関数(プログラムの起動は大丈夫ですが、私の経験上、ほとんどの問題が起きているので、ルーチンを取得/設定するために100を呼び出すことができます)。

それ以外の場合は、ユーザーのマシン上の問題点を明確に示す重要なログポイントが見つからないときに、自分自身を蹴散らすだけです。

(注:ここでは、ユーザー指向の通常の操作ログではなく、開発者向けのログでトレースモードが有効な場合に発生するログを参照しています)。




私は "ログ対コード比"は問題の誤解だと思う。

私の仕事では、Javaプログラムのバグをプロダクション環境の外で再現できない状況や、顧客が再現を望んでいない状況があります。

バグを修正するために利用できるのは、あなた自身がログファイルに入れた情報です。 デバッグセッションはありません(実稼働環境では禁止されています)。 - 入力データを突き止めることはありません。何もありません。

だから、ログはあなたのタイムマシンからバグが起きたときまでです。また、未知のバグを修正するために必要な情報を事前に予測することはできません。そうしないと、最初にバグを修正できます。たくさんのもの...

正確には何がシナリオに依存しますが、基本的には、あなたが決して疑うことはありません。

当然これは、多くのロギングが発生することを意味します。 次に、2つのログを作成します.1つはすべて、必要のないことを保証するために十分な長さのものと、より長く保持できる重要な情報を持たないものです。

ログを過度に無視するのは、通常はバグを修正する必要がない人が行います。




私の仕事の中では、たくさんのWindowsサービスを書いています。 私にとっては、伐採は贅沢ではありません。 それは実際に私の唯一のUIです。 本番環境にデプロイすると、デバッグやサービス作成のデータベースへのアクセスがなくなり、ロギングがなければ発生する問題の詳細を知ることができなくなります。

言いましたが、私は簡潔な伐採スタイルが最良のアプローチだと信じています。 ログメッセージは、「アカウントxxxから受信したメッセージ」などのアプリケーションのビジネスロジックが「入力された関数yyy」に限定される傾向があります。 ログの例外、スレッドの開始、環境設定とタイミングのエコーを行います。 それを超えて、開発者は、開発段階とQA段階の論理エラーを特定します。




アプリケーションのベータリリース中にバグを発見し、それを再現することができない場合は、過剰なロギングを行ったはずです。 クライアントがバグを報告してもそれを再現することができない場合と同じ方法で、過剰なロギング機能でその日を節約できます。




Related