8


0

常にスタックトレースを記録しない理由はありますか?

今日のアプリケーションで、「ArrayIndexOutOfBounds」例外がスローされるというイライラする問題に遭遇しました。 例外のタイプは、ログに記録されたもののほとんどすべてで、かなり役に立たないものです(しかし、親愛なるレガシーアプリです。 例外処理のスタックトレースを記録する変更を加えてアプリケーションを再デプロイし(そしてすぐに問題の根本原因を見つけました)、なぜこれまで誰もこれをしなかったのか疑問に思いました。 通常、スタックトレースを記録しますが、これを行わない理由はありますか?

スタックトレースの文字列表現を取得するためにJavaでフープをジャンプしなければならない背後にある理由を(理由ではなく、理由で)説明できる場合、ボーナスポイント!

7 回答


9


  • 一部のログには機密データが含まれる場合がありますが、ログ機能は含まれません 本番環境のデータを追跡するのに十分なセキュリティが必要です。

  • 大量にログを記録すると、情報が多くなりすぎる可能性があります。 no sysadminの情報。 ログがデバッグメッセージでいっぱいになると、疑わしいパターンを認識できなくなります。 (数年前、セキュリティ上の理由から、すべてのシステムコールを記録するシステムを見ました。 非常に多くのログがあったため、一部の非特権ユーザーがルートになり始めたときに誰もそれを見ませんでした。)

適切なログレベルですべてをログに記録し、運用環境でログレベルを設定できるようにするのが最善です(少なくともJavaではそれほど大きな問題ではありません)。


3


これらの質問もご覧ください

https://stackoverflow.com/questions/565893/best-practices-for-java-logging-from-multiple-threads [複数のスレッドからのJavaロギングのベストプラクティス?]

ここで考慮すべき重要なこと

  1. 機密データの処理

  2. コンパクトな例外メッセージと適切なフィクサーへのメール

  3. 必要なものをログに記録します。 そのログはスペースの面で高価であるため と時間


2


スタックトレースには、問題のトラブルシューティング/デバッグに関する情報が含まれているため、通常はログを記録します。 これはミニダンプの次によく考えられており、多くの場合、コード検査と問題の特定によって解決策につながります。

ところで、私は完全なスタックが公開するアプリ内部に関する潜在的な情報開示についてsibidibaに同意します:関数名とスタック呼び出しシーケンスは、教育を受けた読者に多くを伝えることができます。 これが、一部の製品がスタック上のシンボルアドレスのみをログに記録し、内部pdbからの名前にアドレスを解決するために開発者に依存する理由です。

しかし、1行のエラーと14行のスタックを含むファイルにテキストを記録すると、エラーログをナビゲートするのが非常に難しくなると思います。 また、ログファイルのロックが長く保持されるため(または、さらに悪いことに、ログファイルがインターリーブされるため)、高同時実行性アプリで問題が発生します。 これらの問題に何度も遭遇し、自分のアプリの展開をサポートおよびトラブルシューティングする際の他の問題により、http://bugcollect.com [bugcollect.com]でエラーを記録するサービスを実際に作成することになりました。 エラー収集ポリシーを設計する際に、毎回スタックダンプを収集し、バケットキーの一部としてスタックを使用することを選択しました(同じスタックで発生したエラーを同じバケットにグループ化するため)。


1


開発者があまりにも多くのログを記録し、システム管理者がアプリを運用負荷にさらすと、HDが巨大なログファイルでスラッシングされ、いっぱいになることを発見すると、ログ記録の制限がしばしば押し通されます。 そうすれば、あなたは自分のやり方の誤りを見て、ロギングを十分に減らした(またはログレベルを調整した)が、残りのログエントリを本当に必要とすることを彼らに納得させることは困難です。


1


私たちにとっては非常に簡単です。予期しない例外がスローされた場合、可能な限りメッセージを伝えるとともに、スタックトレースを記録します。

私の推測では、質問の元のコードを書いた開発者は、単にメッセージだけでは十分ではないことを知るほど経験が足りていなかったのでしょう。 私もそう思った、一度。

スタックトレースを文字列として取得するのが複雑な理由は、JREにStringPrintWriterがないためです-私が考えているのは、それらが必要に応じて結合する多くの直交ビルディングブロックを提供していることだと思います。 必要なPrintWriterを自分で組み立てる必要があります。


0


_ スタックトレースの文字列表現を取得するためにJavaでフープをジャンプしなければならない背後にある理由を(理由ではなく、理由で)説明できる場合、ボーナスポイント! _

フープを通過してスタックトレースを出力するのではなく、スロー可能オブジェクトをログに記録するだけではいけませんか? このように:log.error( "Deployed to deploy!"、ex)。 スロー可能なオブジェクトを指定すると、Log4JはgetMessage()で取得したエラーメッセージとスタックトレースの両方を出力します。


0


私がよく見たのは、次のような例外を記録するコードです:

_ LOG.error(ex); _

log4jはオブジェクトを最初の引数として受け入れるため、例外の文字列表現をログに記録します。これは多くの場合、クラスの名前のみです。 これは通常、開発者側の単なる見落としです。 次のようにログとエラーを記録することをお勧めします。

_ LOG.error( "foo happened"、ex); _

.so that if configured properly, the logging framework will log the

スタックトレース。