web-dev-qa-db-ja.com

ロガーとSystem.out.println

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

System。(out | err).printが使用されています。ロガーの使用を検討してください。

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

41
Amir Rachum

log4jのこの短い紹介 を参照してください。

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

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

29
matt b

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などのログシステムを使用します。

更新:

PMD-Rule "SystemPrintln"を変更して、次のXPathを使用することもできます。

//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を適応させる必要がある場合、確認する必要があります。

11

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

実際の短いプログラムを書いている場合、学習目的のためにSystem.out.printlnは問題ありませんが、高品質のソフトウェアプロジェクトを開発するときは、プロのロガーを使用する必要があり、SOPは避ける必要があります。

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

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

5
kalakanhu

このリンクは、Log4jの使用方法に関するより簡潔な情報を提供します。 System.out.println!を使用しないでください ただし、小さな欠陥が1つしかないため、ライブラリを/jre/lib/extが、アプリケーションのランタイムクラスパス内にあり、一緒に出荷されます。

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

Java SEの組み込み Java.util.logging.Logger 、便利な Apache Commons Logging 、人気のある Apache Log4j 、その後続 Logback などを使用できます Slf4j 必要に応じてこれらのロガーを切り替えるための追加の抽象化レイヤーとして。

5
BalusC

PMDは、デバッグのためにSystem.out.println()を呼び出していると想定しているようです。 「Im in urメソッド、ur codezの実行」など。

それをしている場合は、 Log4J のようなロガーに書き込むほうがはるかに良い時間を過ごすことになります。スクリーンよりも複数のストリーミングオプションがあるからです。

ただし、コンソールアプリケーションを実行していて、System.outその一部として、警告を無視します。

4
Randolpho

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

0
fastcodejava