92

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

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

どういう意味ですか?

4

7 に答える 7

158

これは、例外を直接出力する代わりに、などのロギング フレームワークを使用する必要があることを意味します。

e.printStackTrace();

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

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

ロギング フレームワークを使用すると、多くの柔軟性が得られます。たとえば、ログをコンソールに出力するか、ファイルに出力するかを選択できます。また、一部の環境で不要になったメッセージをスキップすることもできます。

于 2012-05-07T06:28:15.227 に答える
45

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

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

  • コンソールとファイルなど、一度に異なる場所にログ ステートメントを書き込む
  • 重大度 (エラー、警告、情報、デバッグなど) と発生元 (通常はパッケージまたはクラス ベース) でログ ステートメントをフィルター処理します。
  • コードを変更することなく、ログ形式に何らかの影響を与える
于 2012-05-07T06:31:42.017 に答える
17

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

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

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

于 2012-05-07T06:32:07.390 に答える
0

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

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

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

于 2014-06-05T12:51:46.350 に答える