26

プロジェクトで初めてlog4jを使用しています。仲間のプログラマーは、使用System.out.printlnは悪いスタイルと見なされており、log4j は最近のログ記録の標準のようなものだと私に言いました。

私たちは多くの JUnit テストを行っていますが、テストSystem.outが難しいことが判明しています。

そのため、コンソール コントローラー クラスに log4j を利用し始めました。これは、コマンド ライン パラメーターを処理するだけです。

// log4j logger config 
org.apache.log4j.BasicConfigurator.configure();
Logger logger = LoggerFactory.getLogger(Console.class);
Category cat = Category.getRoot(); 

うまくいくようです:

logger.debug("String");

プロデュース:

1 [main] DEBUG project.prototype.controller.Console  - String

これに関して2つの質問があります:

  1. 私の基本的な理解から、このロガーを使用すると、ロガーでデバッグモードが有効になっている場合、コンソールをスパムする代わりに、タイムスタンプ付きのログファイルを書き込むための快適なオプションが提供されるはずですか?
  2. System.out.println のテストが難しいのはなぜですか? stackoverflow を検索したところ、テスト レシピが見つかりました。では、log4j を使用することで、実際にどのような利点が得られるのだろうか。
4

5 に答える 5

26

ロガーは、ログに記録されたメッセージのさまざまなレベルの重要性を定義する機能と、出力にさまざまなシンク (コンソール、ファイルなど) を使用する機能を提供します。

また、ロガーを使用しているときに、特定のタイプのメッセージのみを有効または無効にすることも簡単です。たとえば、本番環境ですべてのデバッグ メッセージを表示したくない場合などです。

ロガーを使用しても単体テストで大きな利点が得られるとは思いませんが、とにかく使用したいと思います。単体テストでは、アサートは通常、私の主な関心事です。

ところで、 Commons LoggingSLF4Jなどをログ フレームワークのファサードとして使用することを検討する必要があります。コードを特定のロギング フレームワークに結び付けるのは不適切なスタイルです。Common Logging と SLF4J を使用すると、必要に応じてロギング フレームワークを簡単に切り替えることができます。

于 2010-04-28T07:33:02.367 に答える
9

System.out に出力するものはすべて「標準出力」に送られます。標準出力をファイルにリダイレクトして比較することはできますが、これは非常に柔軟性がありません。さらに、System.out を使用すると、標準出力に出力されるものをフィルタリングできません... すべてが出力されます。log4j では、さまざまなログ レベルを設定できるため、特定の重大度/重要度のしきい値を下回るログ メッセージは出力されません (たとえば、ログ レベルを WARN に変更すると、DEBUG および INFO メッセージは表示されなくなります)。

さらに、log4j ではクラスごとにロギングを制御できますが、System.out はアプリケーション全体の粒度でしか制御できません (System.out をリダイレクトすると、プログラム全体に対してリダイレクトされます)。対照的に、log4j の各ロガーには異なるアペンダーを指定できます。さらに、log4j ロガーに複数のアペンダーを与えることができます (たとえば、システム ロガーやネットワークを経由するように)。書き込まれた内容を簡単に読み取ることができるように、log4j ロガーを StringBuilder に追加することもできます。また、System.out はリダイレクトできますが、このリダイレクトはかなり制限される傾向があります。System.out は、ファイルまたはパイプ (別のプログラム) にリダイレクトできますが、たとえば、URL にリダイレクトすることはできません。対照的に、

于 2010-04-28T07:33:26.147 に答える
3
  1. 使用例

    org.apache.log4j.BasicConfigurator.configure(new FileAppender(  
        new PatternLayout("%d{ISO8601} %-5p %t: %m%n"),  // see e.g. http://en.wikipedia.org/wiki/Log4j#TTCC  
        "log/mainWhatever.log"));
    
  2. を使用すると、メッセージlogger.setLevel(...)を表示するかどうかを簡単に選択できlogger.debug(..)ます。たとえば、警告レベルに設定すると、トレース、デバッグ、および情報ステートメントは出力されません。これにより、時々必要になるデバッグ ステートメントだけをコメント アウトする時間を節約できます。

ウィキペディアもご覧ください。

于 2010-04-28T07:31:50.450 に答える
0

log4j の場合、DEBUG、INFO、ERROR などのロギング レベルを管理できるミドル ウェア サービスを提供します。また、ロギングを有効または無効にできます。しかし、System.out.println() の場合は、管理する必要があります。すべての。

于 2016-01-03T10:17:18.690 に答える