51

Eclipse用のPMDプラグインを使用していますSystem.out.println()が、説明とともに使用するとエラーが発生します。

System。(out | err).printが使用されている場合は、ロガーの使用を検討してください。

私の質問は-ロガーとは何ですか?画面への印刷にはどのように使用されますか?なぜそれが良いのですか?

4

6 に答える 6

35

この log4j の簡単な紹介を参照してください。

問題は、System.outデバッグまたは診断情報を出力するために使用することです。ログレベルを簡単に変更したり、オフにしたり、カスタマイズしたりできないため、これは悪い習慣です。

ただし、合法的System.outにユーザーに情報を出力するために使用している場合は、この警告を無視できます。

于 2010-05-01T14:47:50.377 に答える
12

System.out|err.println(..) を使用して、アプリケーションの main() メソッドでコンソールにユーザー情報を出力している場合、何も問題はありません。コメント「//NOPMD」を挿入することで、メッセージを取り除くことができます。

System.out.println("Fair use of System.out.println(..).");// NOPMD

この目的のために、PMD違反の概要に「レビュー済みとしてマーク」オプションがあります。

もちろん、次のコード スニペットを使用して PMD をだますことができます。

PrintStream out=System.out;
out.println("I am fooling PMD.");  

main() メソッドの外では、Log4j などのログ システムを使用します。

アップデート:

次の XPath を使用するように PMD ルール「SystemPrintln」を変更することもできます。

//MethodDeclaration[@MethodName!="main"]//Name[
starts-with(@Image, 'System.out.print')
or
starts-with(@Image, 'System.err.print')
] | //Initializer//Name[
starts-with(@Image, 'System.out.print')
or
starts-with(@Image, 'System.err.print')
]

これは、コード内の「main」という名前のメソッドの System.out.println などを無視しますが、イニシャライザ コードで System.out.println をチェックします。私の観点からは、System.out.println はメソッド 'main(String args[])' で安全なので、私はこれが好きです。ただし、注意して使用してください。AST のどこで System.out.println も発生する可能性があるかを確認する必要があり、XPath を適応させる必要があります。

于 2010-05-01T15:47:41.657 に答える
7

ロガーには、ロギング用に複数のレベルがあります。

本当の短いプログラムを書いているのであれば、学習目的だけSystem.out.printlnでも問題ありませんが、高品質のソフトウェア プロジェクトを開発している場合は、プロのロガーを使用し、SOP を避ける必要があります。

プロのロガーは、さまざまなレベルのロギングと柔軟性を提供します。それに応じてログメッセージを取得できます。たとえば、グループ X のメッセージは PRODUCTION でのみ出力し、グループ Y のメッセージは ERROR で出力する必要があります。

のメッセージをリダイレクトするためのオプションは限られていますSystem.outが、ロガーの場合、多数のオプションを提供するアペンダーがあります。カスタム出力オプションを作成して、それにリダイレクトすることもできます。

于 2013-12-18T08:45:13.840 に答える
6

このリンクは、Log4j の使用方法に関するより簡潔な情報を提供します: System.out.println を使用しないでください! ただし、小さな欠陥が 1 つだけあります。ライブラリを に配置するのではなく/jre/lib/ext、アプリケーションの実行時クラスパスに配置して出荷する必要があります。

利点は、ログレベルを使用して情報の重要性を示すことができるため、出力でどのレベルを表示/非表示にするかを外部から構成できることです (つまり、無駄な情報に悩まされることはありません)。 、出力がどのように表示されるか (例: タイムスタンプ、スレッド ID、クラス名、メソッド名などを含む)、出力の書き込み先 (例: コンソール、ファイル、電子メールなど)、およびたとえばファイルの場合また、それらの作成方法 (例: 年、月、および/または日ごとのグループ)。

java.util.logging.LoggerJava SE の builtin 、便利なApache Commons Logging、人気のあるApache Log4j、その後継のLogbackなど、いくつかのロガー実装があります。Slf4jを追加の抽象化レイヤーとして使用して、必要に応じてこれらのロガーを切り替えることができます。

于 2010-05-01T14:55:20.503 に答える
4

PMD はSystem.out.println()、デバッグ目的で呼び出していると想定しているようです。「私はあなたの方法で、あなたのコードを実行しています」のようなもの。

これを行う場合、Log4Jのようなロガーへの書き込みは、単にスクリーニングするよりも複数のストリーミング オプションを使用できるため、はるかに効率的になります。

ただし、コンソール アプリケーションを実行していて、System.outその一部として呼び出している場合は、警告を無視してください。

于 2010-05-01T14:50:13.240 に答える
1

System.out.println設定できないので使いにくい。代わりに、Loggerさまざまなレベルでログオンするように構成できます。他にもたくさんの機能があります。

于 2010-05-01T14:54:34.187 に答える