web-dev-qa-db-ja.com

printStackTrace()を避けます。代わりにロガー呼び出しを使用してください

私のアプリケーションでは、PMDを介してコードを実行しています。次のメッセージが表示されます。

  • PrintStackTrace()を避けます。代わりにロガー呼び出しを使用してください。

どういう意味ですか?

62
user1305398

つまり、例外を直接出力する代わりに、 logback または log4j のようなロギングフレームワークを使用する必要があります。

e.printStackTrace();

このフレームワークのAPIを使用してログに記録する必要があります。

log.error("Ops!", e);

ロギングフレームワークは、多くの柔軟性を提供します。コンソールに記録するかファイルに記録するかを選択できます。または、一部の環境で不要になったメッセージがあればスキップすることもできます。

108

例外でprintStackTrace()を呼び出すと、トレースは_System.err_に書き込まれ、他の場所にルーティング(またはフィルタリング)するのは困難です。これを行う代わりに、ロギングフレームワーク(またはApache Commons Loggingなどの複数のロギングフレームワークのラッパー)を使用し、そのフレームワークを使用して例外をログに記録することをお勧めします(例:logger.error("some exception message", e))。

それにより、次のことが可能になります。

  • ログステートメントを一度に異なる場所に書き込みます。コンソールとファイル
  • ログステートメントを重大度(エラー、警告、情報、デバッグなど)および発生元(通常はパッケージまたはクラスベース)でフィルター処理します
  • コードを変更せずにログ形式にある程度の影響を与える
  • 等.
35
Thomas

生産品質プログラムは、エラーやその他の診断を報告するために、多くの代替ログ(log4j、logback、Java.util.loggingなど)の1つを使用する必要があります。これには多くの利点があります。

  • ログメッセージは設定可能な場所に送られます。
  • エンドユーザーは、ログを設定していない限り、メッセージを表示しません。
  • さまざまなロガーとログレベルなどを使用して、記録するログの量を制御できます。
  • さまざまなアペンダー形式を使用して、ロギングの外観を制御できます。
  • ロギング出力をより大きなモニタリング/ロギングフレームワークに簡単にプラグインできます。
  • 上記のすべては、コードを変更せずに実行できます。つまり、デプロイされたアプリケーションのログ設定ファイルを編集します。

対照的に、printStackTraceを使用するだけの場合、デプロイヤ/エンドユーザーはコントロールをほとんど持たず、ログメッセージは失われたり、不適切な状況でエンドユーザーに表示される可能性があります。 (そして、ti病なユーザーをランダムなスタックトレースほど怖がらせるものはありません。)

16
Stephen C

Simpleでは、スタックトレースを標準エラーに出力するだけなので、e.printStackTrace()はお勧めできません。このため、この出力がどこに行くかを実際に制御することはできません。

5
Sandip S.

ほとんどすべてのロギングフレームワークは、スロー可能なオブジェクトをメッセージとともに渡すことができるメソッドを提供します。好む:

public trace(Marker marker, String msg, Throwable t);

スロー可能オブジェクトのスタックトレースを出力します。

1
abhi shukla

会社のコンセプトから話しましょう。 Logは柔軟なレベルを提供します( logger.infoとlogger.debugの違い を参照)。 QA、開発者、ビジネスマンなど、さまざまな人がさまざまなレベルを見たいと思っています。ただし、e.printStackTrace()はすべてを出力します。また、このメソッドが安静に呼び出される場合のように、この同じエラーが複数回出力される場合があります。社内のDevopsやTech-Opsの人たちは、同じエラーリマインダーを受け取るのでおかしくなるかもしれません。 log.error("errors happend in XXX", e)の方が良い代替品になると思います。これはe.printStackTrace()よりも読みやすい情報全体を出力します。

0
Qiyu Zhang