11

Java コードで Enerjy ( http://www.enerjy.com/ ) 静的コード アナライザー ツールを使用しています。それは私に次の行を教えてくれます:

System.err.println("そのデータベースを無視しました");

System.err を使っているのでまずいです。正確なエラーは次のとおりです。「JAVA0267 System.err の使用」

System.err を使用することの何が問題になっていますか?

4

7 に答える 7

22

簡単な回答: ログの目的で使用するのは悪い習慣と考えられています。

広く利用可能/受け入れられているロギング フレームワークが存在しなかった昔、誰もが System.err を使用してエラー メッセージを出力し、トレースをコンソールにスタックしたことが観察されます。このアプローチは、開発およびローカル テスト フェーズでは適切かもしれませんが、重要なエラー メッセージが失われる可能性があるため、運用環境には適していません。このため、今日のほとんどすべての静的解析ツールで、この種のコードが検出され、悪い習慣 (または同様の名前の問題) としてフラグが立てられます。

ロギング フレームワークは、さまざまな永続的な場所 (ログ ファイル、ログ データベースなど) にメッセージを保存できるため、イベントとエラー メッセージをログに記録するための構造化された論理的な方法を提供します。

最も明白な (そして外部依存関係のない)ハッキングjava.util.logging.Logger解決策は、デフォルトでロギング イベントをコンソールに転送するため、クラスを介して組み込みの Java ロギング フレームワークを使用することです。例えば:

final Logger log = Logger.getLogger(getClass().getName());
...
log.log(Level.ERROR, "Something went wrong", theException);

(または、その分析オプションをオフにすることもできます)

于 2009-06-26T15:36:29.743 に答える
7

エラーの記述子は次のとおりです。

System.err の使用は、残留デバッグまたは定型コードを示している可能性があります。エラー ログを処理するには、Apache Commons などのフル機能のログ パッケージを使用することを検討してください。

ログの目的で System.err を使用しているようですが、これはいくつかの理由で最適ではありません。

  • アプリケーション バイナリを変更せずに実行時にログを有効にすることは不可能です。
  • 設定ファイルを編集してもロギング動作を制御できない
  • おそらく他の多くの
于 2009-06-26T15:40:46.880 に答える
7

ロギング フレームワークの使用に関する上記の点には同意しますが、System.err出力を 1 か所で使用する傾向があります。つまり、シャットダウン フック内です。これは、java.util.loggingフレームワークのログ ステートメントを使用しているときに、シャットダウン フックで発生した場合、ログ ステートメントが常に表示されるとは限らないことを発見したためです。これは、ロギング ライブラリには、ログ ファイルやその他のリソースをクリーンアップするための独自のシャットダウン フックが含まれている可能性があり、シャットダウン フックが実行される順序に依存できないため、java.util.logging期待どおりに機能するステートメントに依存できないためです。

詳細については、このリンク (「コメント」セクション) を参照してください。

http://weblogs.java.net/blog/dwalend/archive/2004/05/shutdown_hooks_2.html

(明らかに、別の方法として、別のロギング フレームワークを使用することもできます。)

于 2009-06-26T16:11:20.583 に答える
2

System.err は、何よりもデバッグ目的のためのものです。よりユーザーフレンドリーな方法で適切な例外処理とエラー処理を行うことが推奨されます。ユーザーにエラーが表示されることを意図している場合は、代わりに System.out.println を使用してください。

開発者の観点からこれらのエラーを追跡したい場合は、ロガーを使用する必要があります。

于 2009-06-26T15:37:11.490 に答える
1

System.err.println および System.out.println をロギング インターフェイスとして使用しないでください。STD-Output および STD-Error (これらは System.out および .err によって書き込まれます) は、コマンド ライン ツールからのメッセージ用です。

于 2009-06-26T16:15:47.793 に答える
1

System.err に書き込まれたものは通常、実行時に失われるため、メッセージを出力する場所についてより柔軟なロギング フレームワークを使用することをお勧めします。これにより、メッセージをファイルとして保存して分析できます。

非コンソール アプリケーションの System.err および System.out は、開発者が IDE でコードを実行している場合にのみ表示され、アイテムが本番環境でトリガーされると、有用な情報が失われる可能性があります。

于 2009-06-26T15:40:58.173 に答える
0

System.err がコンソールに出力されます。これは学生が宿題をテストするのには適しているかもしれませんが、これらのメッセージが表示されないアプリケーションには適していません (コンソールのみが非常に多くの行を保存します)。

より良いアプローチは、通常はコンソールに送信されるメッセージを保持する例外をスローすることです。これに代わる方法は、このメッセージを永久に保存できるファイルに保存するサードパーティのログ記録ソフトウェアを使用することです。

于 2009-06-26T16:32:24.787 に答える