web-dev-qa-db-ja.com

ロギング:なぜそして何ですか?

ロギングを大幅に利用するプログラムを書いたことがありません。私がやったことのほとんどは、例外が発生したときにスタックトレースをキャプチャすることです。

他の人はどれくらいログに記録するのでしょうか。作成しているアプリケーションの種類によって異なりますか?ログは実際に役に立ちましたか?

40
Winston Ewert

私が主に組み込みアプリケーションを実行した作業では、貴重なツールにログインしました。少なくとも、コード行を指すのに十分な情報でエラーを記録する必要があります。次に、アプリケーション全体の主要な機能ポイントになります。管理者などがマシンにアクセスしました。より詳細なログを有効にできるシステムを使用しています。これは通常開発者固有です。これは、機能のテスト中に開発者を支援するために使用される場合と、顧客の問題の診断を支援するために使用される場合があります。

私が開発したすべてのアプリケーションで個人的にロギングを使用しました。これにより、常にアプリケーションのフローをよりよく理解できるようになりました。特に顧客の手にあるとき。彼らは、(まれに)テスト対象のユースケースに限定することはありません。

24
Jeff

私はそれがアプリケーションの種類に依存するとは思いません:ロギングはall(重要でない)アプリケーションで役立ちます。確かに、それはmoreは他のアプリケーションよりもいくつかのアプリケーションで役立つ可能性があると思いますが、これは決して役に立たないだとは思いません。

特に、エラーの場合、スタックトレースはexact障害点でのプログラムの状態を示しますが、状態についての手掛かりはほとんどありません直前エラーに。その情報は問題を追跡するのに非常に役立つ可能性があり、ロギングはそのことに関する有用な洞察を提供します。これは、最も些細なプログラム以外のすべてが恩恵を受けることができるものだと思います。

すべてのプログラムに役立つわけではないロギングのもう1つの使用法は、統計分析です。たとえば、Webサーバーは通常、受信するすべてのリクエストをログに記録し、それらのログを分析して、最も忙しい時間や最も人気のあるページなどのグラフを生成できる多くのツールがあります。そのデータを使用して、容量計画(「より大きなサーバーが必要ですか?」など)を実行できます。

19
Dean Harding

ロギングが実行される理由は2つあります。

  1. 診断
  2. 監査

診断ログはすでに他のユーザーによって議論されており、私はそれ以上のことはしません。ログエラーが発生した場合にどうなるかを強く考える必要があるとだけ言っておきます。アプリを介して例外をスローしたり、別の方法で管理したりできますか?これは「依存する」ことですが、情報レベルのメッセージのロギングはおそらくスキップする必要があります。

監査ログはビジネス要件です。監査ログは、システム内の重要なイベントをキャプチャし、管理とリーガルイーグルが関心を持っているものです。これは、何かにサインオフした人、編集した人などです。システム管理者または開発者がシステムのトラブルシューティングを行っている場合、これらに少しだけ興味があります。ただし、多くの場合、この種のロギングは完全にトランザクションの一部であり、完了できない場合はトランザクション全体が失敗するはずです。

2つを別々に考えることは、1つが「オプション」でもう1つが必須であるだけでなく、要件によっては実際にそれらを別々に実装する必要があるため、私にとって役立ちます。どちらも果物である場合もありますが、一方はリンゴで、もう一方はオレンジです。通常、1つのロギングフレームワークで両方を処理できます。

9
MIA

ほとんどのサーバータスクではロギングが重要です。管理者は通常、状況が発生したときにそこにいないため、事後的に確認する必要があります。

しかし、Googleのある人から、サーバープロセスはログを記録しないと言われました。代わりに、それらは「計測」されています。つまり、すべてのプロセスには、他のプロセスがラッチしてパラメーターや統計情報を要求できるフックまたはポート(メカニズムは指定していません)があります。ログに多くのものを保存するのはこれらの監視プロセスであり、得られる情報は「ファイルを開く」、「これを書き込む」、「それを取得する」ことではないという利点があります。 「45,453ファイルが開かれている」、「サービスXの653クライアント」、「クエリYの平均応答が344ミリ秒」のように表示されます。

確かにそれは別のアプローチであり、私が自分のシステムをベビーシッターするときに、たとえ桁違いに小さくても、私は心に留めておく傾向があるものです。

8
Javier

私はすべてをログに記録するwinforms N-Tieredアプリケーションから来ました。

それはあまり役に立ちませんでした。

確かに、例外のロギングは素晴らしいです。しかし、例外を開発チームにメールで送信できるのに、なぜクライアントのマシンにログを記録するのでしょうか?

ロギング情報は簡単に中毒に変わり、その価値はめったに正当化されません。不必要にログを記録できるすべての状況で、対象となる情報を収集し、必要な場所に送信することをお勧めします。

4
George Stocker

例外情報はある程度役立つため、例外情報のキャプチャは必須です。ただし、アプリケーションのユーザー/クライアントが適切な情報でエラーを報告できない場合は特に、例外情報では不十分な場合があります。

ログはエラー情報のキャプチャのみに制限されていますか?

私の場合(Webアプリケーション)、常に、どのページにアクセスしたか、いつ、何をクリックしたか、IPやブラウザなどをログに記録します。ページの訪問ごとの合計読み込み時間も記録するので、どのページが遅いかを知ることができます最適化が必要です。できる限りログに記録していると言えます。

最初は、それがどれほど重要であるかわかりませんでした。しかし、明らかにそれは(デバッグ以外の)多くの点で非常に役立ちます:

  • ユーザーの行動を理解する
  • 新機能の受け入れを評価する
  • 早期導入者、詐欺師、または潜在的な顧客を区別する

統計情報を掘り下げることが大好きな場合、ロギングはより重要になると思います。

4
Anwar Chandra

私は海外に製品を展開している会社の開発者です。サポートチームが問題の定義について尋ねてきたとき、診断のための私の唯一のツールは、ログファイルと顧客のデータベースのコピーです。データベースと開発環境を使用して、受信したデータをモジュールと関連するアクションに記録するため、誤ったケースを再現する機会があります。収集したデータを利用してエラーを再現できれば、デバッグで修正できます。ログファイルがない場合は、顧客またはサポートチームがどのような場合に何が起こるかを説明する必要があります(誤解を招く可能性が高くなります)。

次に、特定のアクションの日時をログに記録し、どのアクションがどれだけの時間を消費しているかを確認できるため、ロギングにより、デプロイされたサイトでモジュールのボトルネックを検出する機会が得られます。

それに加えて、私たちのソリューションが6つのモジュールで構成されていて、データベースタイムアウトに関するログファイルにエラーログが表示されているとします。これらのエラーが他のモジュールの5つにも記録されている場合、これがSQLサーバー関連の問題である可能性が高くなります。これが私のモジュールでのみログに記録されている場合、クエリがバグである可能性が高くなります。こういうものは有用な指標だと思います。

ログファイルに表示されるデータの種類については、ログレベルの構成によって異なります。これが新製品の場合は、ログレベルを「すべて」に設定して、できる限り多くのデータを収集します。ただし、製品を改善するときは、ログレベルを「エラー」のままにして、エラーだけを記録し、情報レベルのログは記録しないようにすることをお勧めします。

2
aslisabanci

ログは、他のプログラムでは取得できない情報に役立ちます。

  • スタックトレースをキャプチャする(取得したもの)
  • アプリケーションがクラッシュしたときに処理されていたデータをキャプチャします。デバッガーは、クラッシュが発生したときに存在する場合にのみ役立つことに注意してください。
  • プロファイル情報。実稼働環境でプロファイラーを実行できない場合は、広範なロギングタイムスタンプを含むが時間の経過を把握するのに役立ちます。伝えられなくても、それがプログラムの外にあることを識別するのに役立つ場合があります(たとえば、ガベージコレクションが開始されます)。
  • プログラムの作成時に統計が予期されていません。他の理由で興味深い間隔で、時間の経過に伴う動作のグラフを提供するように求められました。必要なデータは、grep + awk + ​​Perl忍者のちょっとしたトリックでログファイルから抽出できます。

注:少なくとも2つのログファイルが必要です。

  • DEBUGレベルの1つ-必要になると想像できるすべての情報(INFO以上を含む)を提供します。それが多すぎる場合は、TRACEレベルを追加することを検討してください。
  • INFOレベルの1つ-システムの10000メートルの概要を提供します。重要なマイルストーンはここにあります。

INFOは常にオンです。 DEBUGは必要なときにオンになります。

いつかはログファイルだけが存在する状況をデバッグしなければならない可能性があることを予測して、ログコードを記述します。正しく実行することが、解雇と昇進の違いになる可能性があります。

追加のマイルのために、すべての関数呼び出しにJava with

public void sendEmail(String sender, String recipient) {
try { 
...
} catch (Exception e) {
  throw new RuntimeException("sendEmail(sender="+sender+", recipient="+recipient+")");
}

このアプローチは基本的にパラメーター値で呼び出しスタックを強化し、スタックトレースだけでログファイルを見る必要がない状況を分析できるようにします。

2
user1249

ロギングは常に役立ちます。ただし、実装時には、ログを読み取るのは必ずしもユーザーである必要はありません。おそらくそれは、管理者、エンドユーザー、顧客、サポートチームのようなものです...

したがって、スタックトレースだけでなく、非開発者が解釈できる追加情報もログに記録します。アプリケーションが他のいくつかのグループによって保守されている場合、いくつかの固有のエラーコードをログに書き込むことも役立ちます。これにより、サポート、自動化などが容易になります...

管理者の観点からの別のポイント:ログのローテーションについて考えます。

1
Christian

重要なアプリはすべてマルチレベルのロギングを採用することもお勧めします。

他の人が述べた理由から、それはアプリケーションの問題を解決するための非常に貴重なツールです。

場合によっては、セキュリティ、使用状況の測定基準、および監査のために、アクティビティログを必要とする金融アプリケーションやその他のドメインなどでロギングが不可欠です。

1
ocodo

それは間違いなくあなたが構築しているシステムのタイプに依存します。

ワードプロセッサなどのスタンドアロンのデスクトップアプリケーションを作成している場合は、おそらくログ記録は必要ありません。

組み込みシステムを作成している場合は、ロギングなしでは生きられません。そうしないと、組み込みデバイスがフリーズしたときに、その理由がわかりません。また、システムが相互に通信する複数のプロセスまたは複数の物理マシンを含む場合は、常にロギングが必要です。繰り返しになりますが、システムがハングした場合、いつ、なぜ、システムのどの部分が停止したかを知る必要があります。ログを比較して、データがあるプロセスから別のプロセスに渡ったかどうかを判断できる必要があります。同様に、ユーザーの直接的な操作なしにシステムを長時間実行することを意図している場合は、常にロギングが必要です。

1
Dima